From 21de77f63992e3aa5bdc70f1600a14ad1877c8d5 Mon Sep 17 00:00:00 2001
From: bbaer <bbaer@math.uzh.ch>
Date: Thu, 7 Nov 2019 12:29:39 +0100
Subject: [PATCH] removed wrong commit files

---
 extension/Documentation/html/.buildinfo       |     4 -
 extension/Documentation/html/Index.html       |   639 -
 extension/Documentation/html/Links.html       |   125 -
 extension/Documentation/html/Manual.html      |  8521 -------------
 .../html/OnlineRecuitingTool.html             |    94 -
 extension/Documentation/html/README.html      |   113 -
 extension/Documentation/html/Release.html     |  1384 ---
 .../Documentation/html/_sources/Index.rst.txt |    63 -
 .../Documentation/html/_sources/Links.rst.txt |    24 -
 .../html/_sources/Manual.rst.txt              |  5854 ---------
 .../html/_sources/OnlineRecuitingTool.rst.txt |    28 -
 .../html/_sources/README.rst.txt              |     9 -
 .../html/_sources/Release.rst.txt             |   957 --
 .../html/_static/ajax-loader.gif              |   Bin 673 -> 0 bytes
 .../Documentation/html/_static/basic.css      |   632 -
 .../Documentation/html/_static/classic.css    |   261 -
 .../html/_static/comment-bright.png           |   Bin 756 -> 0 bytes
 .../html/_static/comment-close.png            |   Bin 829 -> 0 bytes
 .../Documentation/html/_static/comment.png    |   Bin 641 -> 0 bytes
 .../Documentation/html/_static/default.css    |     1 -
 .../Documentation/html/_static/doctools.js    |   287 -
 .../html/_static/down-pressed.png             |   Bin 222 -> 0 bytes
 extension/Documentation/html/_static/down.png |   Bin 202 -> 0 bytes
 extension/Documentation/html/_static/file.png |   Bin 286 -> 0 bytes
 .../html/_static/jquery-3.1.0.js              | 10074 ----------------
 .../Documentation/html/_static/jquery.js      |     4 -
 .../Documentation/html/_static/minus.png      |   Bin 90 -> 0 bytes
 extension/Documentation/html/_static/plus.png |   Bin 90 -> 0 bytes
 .../Documentation/html/_static/pygments.css   |    69 -
 .../Documentation/html/_static/searchtools.js |   758 --
 .../Documentation/html/_static/sidebar.js     |   159 -
 .../html/_static/underscore-1.3.1.js          |   999 --
 .../Documentation/html/_static/underscore.js  |    31 -
 .../Documentation/html/_static/up-pressed.png |   Bin 214 -> 0 bytes
 extension/Documentation/html/_static/up.png   |   Bin 203 -> 0 bytes
 .../Documentation/html/_static/websupport.js  |   808 --
 extension/Documentation/html/genindex.html    |    91 -
 extension/Documentation/html/objects.inv      |   Bin 1825 -> 0 bytes
 extension/Documentation/html/search.html      |   101 -
 extension/Documentation/html/searchindex.js   |     1 -
 40 files changed, 32091 deletions(-)
 delete mode 100644 extension/Documentation/html/.buildinfo
 delete mode 100644 extension/Documentation/html/Index.html
 delete mode 100644 extension/Documentation/html/Links.html
 delete mode 100644 extension/Documentation/html/Manual.html
 delete mode 100644 extension/Documentation/html/OnlineRecuitingTool.html
 delete mode 100644 extension/Documentation/html/README.html
 delete mode 100644 extension/Documentation/html/Release.html
 delete mode 100644 extension/Documentation/html/_sources/Index.rst.txt
 delete mode 100644 extension/Documentation/html/_sources/Links.rst.txt
 delete mode 100644 extension/Documentation/html/_sources/Manual.rst.txt
 delete mode 100644 extension/Documentation/html/_sources/OnlineRecuitingTool.rst.txt
 delete mode 100644 extension/Documentation/html/_sources/README.rst.txt
 delete mode 100644 extension/Documentation/html/_sources/Release.rst.txt
 delete mode 100644 extension/Documentation/html/_static/ajax-loader.gif
 delete mode 100644 extension/Documentation/html/_static/basic.css
 delete mode 100644 extension/Documentation/html/_static/classic.css
 delete mode 100644 extension/Documentation/html/_static/comment-bright.png
 delete mode 100644 extension/Documentation/html/_static/comment-close.png
 delete mode 100644 extension/Documentation/html/_static/comment.png
 delete mode 100644 extension/Documentation/html/_static/default.css
 delete mode 100644 extension/Documentation/html/_static/doctools.js
 delete mode 100644 extension/Documentation/html/_static/down-pressed.png
 delete mode 100644 extension/Documentation/html/_static/down.png
 delete mode 100644 extension/Documentation/html/_static/file.png
 delete mode 100644 extension/Documentation/html/_static/jquery-3.1.0.js
 delete mode 100644 extension/Documentation/html/_static/jquery.js
 delete mode 100644 extension/Documentation/html/_static/minus.png
 delete mode 100644 extension/Documentation/html/_static/plus.png
 delete mode 100644 extension/Documentation/html/_static/pygments.css
 delete mode 100644 extension/Documentation/html/_static/searchtools.js
 delete mode 100644 extension/Documentation/html/_static/sidebar.js
 delete mode 100644 extension/Documentation/html/_static/underscore-1.3.1.js
 delete mode 100644 extension/Documentation/html/_static/underscore.js
 delete mode 100644 extension/Documentation/html/_static/up-pressed.png
 delete mode 100644 extension/Documentation/html/_static/up.png
 delete mode 100644 extension/Documentation/html/_static/websupport.js
 delete mode 100644 extension/Documentation/html/genindex.html
 delete mode 100644 extension/Documentation/html/objects.inv
 delete mode 100644 extension/Documentation/html/search.html
 delete mode 100644 extension/Documentation/html/searchindex.js

diff --git a/extension/Documentation/html/.buildinfo b/extension/Documentation/html/.buildinfo
deleted file mode 100644
index 0885fbe1f..000000000
--- a/extension/Documentation/html/.buildinfo
+++ /dev/null
@@ -1,4 +0,0 @@
-# Sphinx build info version 1
-# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: 
-tags: 
diff --git a/extension/Documentation/html/Index.html b/extension/Documentation/html/Index.html
deleted file mode 100644
index 877912c7e..000000000
--- a/extension/Documentation/html/Index.html
+++ /dev/null
@@ -1,639 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>QFQ Extension &#8212; QFQ Extension 0.25.0 documentation</title>
-    
-    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    './',
-        VERSION:     '0.25.0',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true,
-        SOURCELINK_SUFFIX: '.txt'
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="index" title="Index" href="genindex.html" />
-    <link rel="search" title="Search" href="search.html" />
-    <link rel="next" title="General" href="Manual.html" /> 
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="Manual.html" title="General"
-             accesskey="N">next</a> |</li>
-        <li class="nav-item nav-item-0"><a href="#">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-  <div class="section" id="qfq-extension">
-<span id="start"></span><h1>QFQ Extension<a class="headerlink" href="#qfq-extension" title="Permalink to this headline">¶</a></h1>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Classification:</th><td class="field-body"><p class="first">qfq</p>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Version:</th><td class="field-body"><p class="first">0.25.0</p>
-</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">Language:</th><td class="field-body"><p class="first">en</p>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Description:</th><td class="field-body"><p class="first">The extension offers support to:</p>
-<blockquote>
-<div><ul class="simple">
-<li>Create HTML Forms by clicking them together,</li>
-<li>Create reports based an SQL queries. The SQL can be nested and offers support for any kind of tags.</li>
-</ul>
-</div></blockquote>
-</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">Keywords:</th><td class="field-body"><p class="first">Quick Form Query, Form, Report, SQL, Query, Generator, Framework, Secure, Mobile Ready, Responsive.</p>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Copyright:</th><td class="field-body"><p class="first">2017</p>
-</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">Author:</th><td class="field-body"><p class="first">Carsten Rose, Rafael Ostertag</p>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Email:</th><td class="field-body"><p class="first"><a class="reference external" href="mailto:carsten&#46;rose&#37;&#52;&#48;math&#46;uzh&#46;ch">carsten<span>&#46;</span>rose<span>&#64;</span>math<span>&#46;</span>uzh<span>&#46;</span>ch</a>, <a class="reference external" href="mailto:rafael&#46;ostertag&#37;&#52;&#48;math&#46;uzh&#46;ch">rafael<span>&#46;</span>ostertag<span>&#64;</span>math<span>&#46;</span>uzh<span>&#46;</span>ch</a></p>
-</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">License:</th><td class="field-body"><p class="first">This document is published under the Open Publication License
-available from <a class="reference external" href="http://www.opencontent.org/openpub/">http://www.opencontent.org/openpub/</a></p>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Rendered:</th><td class="field-body"><p class="first last">2017-10-13 13:19</p>
-</td>
-</tr>
-</tbody>
-</table>
-<p>The content of this document is related to TYPO3,
-a GNU/GPL CMS/Framework available from <a class="reference external" href="https://typo3.org/">www.typo3.org</a>.</p>
-<p><strong>Table of Contents</strong></p>
-<div class="toctree-wrapper compound">
-<ul>
-<li class="toctree-l1"><a class="reference internal" href="Manual.html">General</a></li>
-<li class="toctree-l1"><a class="reference internal" href="Manual.html#installation">Installation</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#preparation">Preparation</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#report-form">Report &amp; Form</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#wkhtmltopdf">wkhtmltopdf</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#html-to-pdf-conversion">HTML to PDF conversion</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#print">Print</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#setup">Setup</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#formeditor">FormEditor</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#config-qfq-ini">config.qfq.ini</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#custom-variables">Custom variables</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#variables-add-by-sql">Variables add by SQL</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#periodid">periodId</a></li>
-</ul>
-</li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#db-user-privileges">DB USER privileges</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#exception-for-security-get-max-length">Exception for SECURITY_GET_MAX_LENGTH</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#local-documentation">Local Documentation</a></li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Manual.html#concept">Concept</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#sips">SIPs</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#access-privileges">Access privileges</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#typo3-qfq-content-element">Typo3 QFQ content element</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#qfq-keywords-bodytext">QFQ Keywords (Bodytext)</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#debug">Debug</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#databases">Databases</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#different-qfq-versions-shared-database">Different QFQ versions, shared database</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Manual.html#variable">Variable</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#types">Types</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#store-variables">Store variables</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#sql-variables">SQL variables</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#column-variables">Column variables</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#sanitize-class">Sanitize class</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#escape">Escape</a></li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Manual.html#security">Security</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#get-parameter">Get Parameter</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#post-parameter">Post Parameter</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#server">$_SERVER</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#honeypot">Honeypot</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#violation">Violation</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#client-parameter-via-sip">Client Parameter via SIP</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#secure-direct-fileaccess">Secure direct fileaccess</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#file-upload">File upload</a></li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Manual.html#store">Store</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#predefined-variable-names">Predefined variable names</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#store-form-f">Store: <em>FORM</em> - F</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#store-sip-s">Store: <em>SIP</em> - S</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#store-record-r">Store: <em>RECORD</em> - R</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#store-before-b">Store: <em>BEFORE</em> - B</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#store-client-c">Store: <em>CLIENT</em> - C</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#store-typo3-bodytext-t">Store: <em>TYPO3</em> (Bodytext) - T</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#store-vars-v">Store: <em>VARS</em> - V</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#store-ldap-l">Store: <em>LDAP</em> - L</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#store-system-y">Store: <em>SYSTEM</em> - Y</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Manual.html#ldap">LDAP</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#typeahead-ta">Typeahead (TA)</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#pedantic">Pedantic</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#prefetch">Prefetch</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#pertoken">PerToken</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#fill-store-ldap-fsl">Fill STORE LDAP (FSL)</a></li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Manual.html#form">Form</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#id18">General</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#record-locking">Record locking</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#exclusive">Exclusive</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#advisory">Advisory</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#none">None</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#comment-and-space-character">Comment- and space-character</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#definition">Definition</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#permitnew-permitedit">permitNew &amp; permitEdit</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#required-parameter-new-edit">Required Parameter New|Edit</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#showbutton">showButton</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#forward-save-close">Forward: Save / Close</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#forward-forwardmode">Forward (=forwardMode)</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#forward-url-page-forwardpage">Forward URL / Page (=forwardPage)</a></li>
-</ul>
-</li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#example-forwardpage">Example forwardPage</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-combined-dynamic-mode-url-page">Type: combined dynamic mode &amp; URL/page</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#parameter">Parameter</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#submitbuttontext">submitButtonText</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#class">class</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#classpill">classPill</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#classbody">classBody</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#extradeleteform">extraDeleteForm</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#form-mode-global">Form mode global</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#formelements">FormElements</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#class-container">Class: Container</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-fieldset">Type: fieldset</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-pill">Type: pill</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-templategroup">Type: templateGroup</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#column-primary-record">Column: primary record</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#column-non-primary-record">Column: non primary record</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#class-native">Class: Native</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#fe-value">FE: Value</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#fe-report-notation">FE: &#8216;Report&#8217; notation</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#attributes-defined-in-the-parameter-field">Attributes defined in the parameter field</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#effect-matrix">Effect matrix</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#native-formelements">Native <em>FormElements</em></a></li>
-</ul>
-</li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-checkbox">Type: checkbox</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-date">Type: date</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-datetime">Type: datetime</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-extra">Type: extra</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-text">Type: text</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#type-ahead">Type Ahead</a></li>
-</ul>
-</li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-editor">Type: editor</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-note">Type: note</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-password">Type: password</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-radio">Type: radio</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-select">Type: select</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-subrecord">Type: subrecord</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-time">Type: time</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-upload">Type: upload</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#deleting-a-record-and-the-referenced-file">Deleting a record and the referenced file</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#class-action">Class: Action</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-before-after">Type: before... | after...</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#parameter-sqlvalidate">Parameter: sqlValidate</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#parameter-slaveid">Parameter: slaveId</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#parameter-sqlbefore-sqlinsert-sqlupdate-sqldelete-sqlafter">Parameter: sqlBefore / sqlInsert / sqlUpdate / sqlDelete / sqlAfter</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#example">Example</a></li>
-</ul>
-</li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#type-sendmail">Type: sendmail</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#type-paste">Type: paste</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#multi-language-form">Multi Language Form</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#id33">Example</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#dynamic-update">Dynamic Update</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#examples">Examples</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#content-of-a-select-list">Content of a select list</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#show-hide-a-formelement">Show / Hide a <em>FormElement</em></a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#form-layout">Form Layout</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#custom-field-width">Custom field width</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#multiple-elements-per-row">Multiple Elements per row</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#copy-form">Copy Form</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#id37">Concept</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#table-self-referencing-records">Table self referencing records</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#delete-record">Delete Record</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#locking-record-form">Locking Record / Form</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#best-practice">Best practice</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#custom-default-value-only-for-new-records">Custom default value only for &#8216;new records&#8217;</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#central-configured-values">Central configured values</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#debug-report">Debug Report</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#more-detailed-error-messages">More detailed error messages</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#person-search-form">Person search form</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#form-compute-next-free-ord-automatically">Form: compute next free &#8216;ord&#8217; automatically</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#version-1">Version 1</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#version-2">Version 2</a></li>
-</ul>
-</li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#form-person-wizard-firstname-city">Form: Person Wizard - firstname, city</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#form-person-wizard-firstname-single-note">Form: Person Wizard - firstname, single note</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#icons-template-group">Icons Template Group</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#chart">Chart</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#upload-form-simple">Upload Form Simple</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#upload-form-advanced-1">Upload Form Advanced 1</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#upload-form-advanced-2">Upload Form Advanced 2</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#typeahead-sql">Typeahead: SQL</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#typeahead-ldap-with-additional-values">Typeahead: LDAP with additional values</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#faq">FAQ</a></li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Manual.html#report">Report</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#qfq-content-element">QFQ content element</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#id40">General</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#a-simple-example">A simple example</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#syntax-of-report">Syntax of <cite>report</cite></a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#debug-the-bodytext">Debug the bodytext</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#structure">Structure</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#text-across-several-lines">Text across several lines</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#nesting-of-levels">Nesting of levels</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#access-column-values">Access column values</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#wrapping-rows-and-columns-level-keys">Wrapping rows and columns: Level keys</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#processing-of-columns-in-the-sql-result">Processing of columns in the SQL result</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#special-column-names">Special column names</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#column-link">Column: _link</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#render-mode">Render mode</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#link-examples">Link Examples</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#question">Question</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#download">Download</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#parameter-and-element-sources">Parameter and (element) sources</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#export-area">Export area</a></li>
-</ul>
-</li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#columns-page-x">Columns: _page[X]</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#column-paged">Column: _paged</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#mode-table">Mode: table</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#mode-form">Mode: form</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#id47">Examples:</a></li>
-</ul>
-</li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#id48">Columns: _Page[X]</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#id49">Column: _Paged</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#column-vertical">Column: _vertical</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#column-mailto">Column: _mailto</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#column-sendmail">Column: _sendmail</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#column-img">Column: _img</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#column-exec">Column: _exec</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#column-pdf-file-zip">Column: _pdf | _file | _zip</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#id50">Column: _Pdf | _File | _Zip</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#column-f">Column: _F</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#challenge-1">Challenge 1</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#challenge-2">Challenge 2</a></li>
-<li class="toctree-l4"><a class="reference internal" href="Manual.html#solution">Solution</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#qfq-css-classes">QFQ CSS Classes</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#id51">Examples</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#basic-queries">Basic Queries</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#accessing-the-database">Accessing the database</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#formatting-examples">Formatting Examples</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Manual.html#help">Help</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#error-messages">Error Messages</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#internal-server-error">Internal Server Error</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#javascript-problem">Javascript problem</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#webserver-error-log">Webserver error log</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#call-to-undefined-function-qfq-mb-internal-encoding">Call to undefined function qfq\mb_internal_encoding()</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Manual.html#qfq-specific">QFQ specific</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Manual.html#variable-empty">Variable empty: {{...}}</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Release.html">Release</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-future">Version 0.future</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#notes">Notes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#features">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#bug-fixes">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-25-0">Version 0.25.0</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id2">Notes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id3">Features</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-24-0">Version 0.24.0</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id4">Notes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id5">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id6">Bug Fixes</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Release.html#id7">Release</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-23-1">Version 0.23.1</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id8">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-23-0">Version 0.23.0</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id9">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id10">Bug Fixes</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Release.html#id11">Release</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-22">Version 0.22</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id12">Notes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id13">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id14">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-21-0">Version 0.21.0</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id15">Notes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id16">Features</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-20-0">Version 0.20.0</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#changes">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id17">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id18">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-19-7">Version 0.19.7</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id19">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id20">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id21">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-19-6">Version 0.19.6</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id22">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id23">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-19-5">Version 0.19.5</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id24">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id25">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-19-4">Version 0.19.4</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id26">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id27">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-19-3">Version 0.19.3</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id28">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id29">Bug Fixes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#open">Open</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-19-2">Version 0.19.2</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id30">Features</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-19-1">Version 0.19.1</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id31">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id32">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-19-0">Version 0.19.0</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id33">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id34">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id35">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-18-7">Version 0.18.7</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id36">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id37">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id38">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-18-6">Version 0.18.6</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id39">Features</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-18-5">Version 0.18.5</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id40">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id41">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-18-4">Version 0.18.4</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id42">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-18-3b">Version 0.18.3b</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id43">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id44">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-18-3a">Version 0.18.3a</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id45">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id46">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-18-3">Version 0.18.3</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id47">Features</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-18-2">Version 0.18.2</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id48">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id49">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-18-1">Version 0.18.1</a></li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-18-0">Version 0.18.0</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id50">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id51">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id52">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-17-0">Version 0.17.0</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id53">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id54">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id55">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-16">Version 0.16</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id56">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id57">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id58">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-15">Version 0.15</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id59">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id60">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id61">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-14">Version 0.14</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id62">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id63">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id64">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-13">Version 0.13</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id65">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id66">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id67">Bug Fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-12">Version 0.12</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id68">Changes</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id69">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id70">Bug fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-11">Version 0.11</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id71">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id72">Bug fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-10">Version 0.10</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id73">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id74">Bug fixes</a></li>
-</ul>
-</li>
-<li class="toctree-l2"><a class="reference internal" href="Release.html#version-0-9">Version 0.9</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id75">Features</a></li>
-<li class="toctree-l3"><a class="reference internal" href="Release.html#id76">Bug fixes</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="Links.html">Links</a></li>
-<li class="toctree-l1"><a class="reference internal" href="README.html">TYPO3 Documentation Starter &#8220;Public Info&#8221;</a></li>
-</ul>
-</div>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-  <h4>Next topic</h4>
-  <p class="topless"><a href="Manual.html"
-                        title="next chapter">General</a></p>
-  <div role="note" aria-label="source link">
-    <h3>This Page</h3>
-    <ul class="this-page-menu">
-      <li><a href="_sources/Index.rst.txt"
-            rel="nofollow">Show Source</a></li>
-    </ul>
-   </div>
-<div id="searchbox" style="display: none" role="search">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <div><input type="text" name="q" /></div>
-      <div><input type="submit" value="Go" /></div>
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="Manual.html" title="General"
-             >next</a> |</li>
-        <li class="nav-item nav-item-0"><a href="#">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &#169; Copyright 2017, Carsten Rose.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.5.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/extension/Documentation/html/Links.html b/extension/Documentation/html/Links.html
deleted file mode 100644
index 14e75a81d..000000000
--- a/extension/Documentation/html/Links.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Links &#8212; QFQ Extension 0.25.0 documentation</title>
-    
-    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    './',
-        VERSION:     '0.25.0',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true,
-        SOURCELINK_SUFFIX: '.txt'
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="index" title="Index" href="genindex.html" />
-    <link rel="search" title="Search" href="search.html" />
-    <link rel="next" title="TYPO3 Documentation Starter “Public Info”" href="README.html" />
-    <link rel="prev" title="Release" href="Release.html" /> 
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="README.html" title="TYPO3 Documentation Starter “Public Info”"
-             accesskey="N">next</a> |</li>
-        <li class="right" >
-          <a href="Release.html" title="Release"
-             accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-  <div class="section" id="links">
-<span id="id1"></span><h1>Links<a class="headerlink" href="#links" title="Permalink to this headline">¶</a></h1>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">TER:</th><td class="field-body"><a class="reference external" href="https://typo3.org/extensions/repository/view">https://typo3.org/extensions/repository/view</a>/&lt;extension key&gt;</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Bug Tracker:</th><td class="field-body"><a class="reference external" href="https://forge.typo3.org/projects/extension">https://forge.typo3.org/projects/extension</a>-&lt;extension key&gt;/issues</td>
-</tr>
-<tr class="field-odd field"><th class="field-name">Git Repository:</th><td class="field-body"><a class="reference external" href="https://github.com">https://github.com</a>/&lt;username&gt;/&lt;extension key&gt;</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Contact:</th><td class="field-body"><a class="reference external" href="https://twitter.com/your-username">&#64;&lt;username&gt;</a></td>
-</tr>
-</tbody>
-</table>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-  <h4>Previous topic</h4>
-  <p class="topless"><a href="Release.html"
-                        title="previous chapter">Release</a></p>
-  <h4>Next topic</h4>
-  <p class="topless"><a href="README.html"
-                        title="next chapter">TYPO3 Documentation Starter &#8220;Public Info&#8221;</a></p>
-  <div role="note" aria-label="source link">
-    <h3>This Page</h3>
-    <ul class="this-page-menu">
-      <li><a href="_sources/Links.rst.txt"
-            rel="nofollow">Show Source</a></li>
-    </ul>
-   </div>
-<div id="searchbox" style="display: none" role="search">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <div><input type="text" name="q" /></div>
-      <div><input type="submit" value="Go" /></div>
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="README.html" title="TYPO3 Documentation Starter “Public Info”"
-             >next</a> |</li>
-        <li class="right" >
-          <a href="Release.html" title="Release"
-             >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &#169; Copyright 2017, Carsten Rose.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.5.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/extension/Documentation/html/Manual.html b/extension/Documentation/html/Manual.html
deleted file mode 100644
index 32eed62d7..000000000
--- a/extension/Documentation/html/Manual.html
+++ /dev/null
@@ -1,8521 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>General &#8212; QFQ Extension 0.25.0 documentation</title>
-    
-    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    './',
-        VERSION:     '0.25.0',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true,
-        SOURCELINK_SUFFIX: '.txt'
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="index" title="Index" href="genindex.html" />
-    <link rel="search" title="Search" href="search.html" />
-    <link rel="next" title="Release" href="Release.html" />
-    <link rel="prev" title="QFQ Extension" href="Index.html" /> 
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="Release.html" title="Release"
-             accesskey="N">next</a> |</li>
-        <li class="right" >
-          <a href="Index.html" title="QFQ Extension"
-             accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-  <div class="section" id="general">
-<span id="id1"></span><h1>General<a class="headerlink" href="#general" title="Permalink to this headline">¶</a></h1>
-<ul class="simple">
-<li>Project homepage: <a class="reference external" href="https://git.math.uzh.ch/typo3/qfq">https://git.math.uzh.ch/typo3/qfq</a></li>
-<li>Latest relases: <a class="reference external" href="https://w3.math.uzh.ch/qfq/">https://w3.math.uzh.ch/qfq/</a></li>
-</ul>
-</div>
-<div class="section" id="installation">
-<span id="id2"></span><h1>Installation<a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h1>
-<p>The following features are only tested on linux hosts:</p>
-<ul class="simple">
-<li>HTML to PDF conversion - command <cite>wkhtmltopdf</cite>.</li>
-<li>Concatenation of PDF files - command <cite>pdftk</cite>.</li>
-<li>Mime type detection for uploads - command <cite>file</cite>.</li>
-</ul>
-<div class="section" id="preparation">
-<span id="id3"></span><h2>Preparation<a class="headerlink" href="#preparation" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="report-form">
-<h3>Report &amp; Form<a class="headerlink" href="#report-form" title="Permalink to this headline">¶</a></h3>
-<p>In PHP 5.x the QFQ extension needs  the PHP MySQL native driver. The following functions are used and are only available with the
-native driver (see also: <a class="reference external" href="http://dev.mysql.com/downloads/connector/php-mysqlnd/">http://dev.mysql.com/downloads/connector/php-mysqlnd/</a>):</p>
-<ul class="simple">
-<li>mysqli::get_result (important),</li>
-<li>mysqli::fetch_all (nice to use)</li>
-</ul>
-<p>To normalize UTF8 input, the <em>php5-intl</em> resp. <em>php7.0-intl</em> package is needed by</p>
-<ul class="simple">
-<li>normalizer::normalize()</li>
-</ul>
-<p>For the <a class="reference internal" href="#download">download</a> function, the programs <cite>pdftk</cite> and <cite>file</cite> are necessary to concatenate PDF files.</p>
-<p>Preparation for Ubuntu 14.04:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">sudo</span> <span class="nx">apt</span><span class="o">-</span><span class="nx">get</span> <span class="nx">install</span> <span class="nx">php5</span><span class="o">-</span><span class="nx">mysqlnd</span> <span class="nx">php5</span><span class="o">-</span><span class="nx">intl</span>
-<span class="nx">sudo</span> <span class="nx">apt</span><span class="o">-</span><span class="nx">get</span> <span class="nx">install</span> <span class="nx">pdftk</span> <span class="nb">file</span>                <span class="c1"># for file upload and PDF</span>
-<span class="nx">sudo</span> <span class="nx">php5enmod</span> <span class="nx">mysqlnd</span>
-<span class="nx">sudo</span> <span class="nx">service</span> <span class="nx">apache2</span> <span class="nx">restart</span>
-</pre></div>
-</div>
-<p>Preparation for Ubuntu 16.04:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">sudo</span> <span class="nx">apt</span> <span class="nx">install</span> <span class="nx">php7</span><span class="o">.</span><span class="mi">0</span><span class="o">-</span><span class="nx">intl</span>
-<span class="nx">sudo</span> <span class="nx">apt</span> <span class="nx">install</span> <span class="nx">pdftk</span> <span class="nx">libxrender1</span> <span class="nb">file</span>        <span class="c1"># for file upload, PDF and &#39;HTML to PDF&#39; (wkhtmltopdf)</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="wkhtmltopdf">
-<span id="wkhtml"></span><h3>wkhtmltopdf<a class="headerlink" href="#wkhtmltopdf" title="Permalink to this headline">¶</a></h3>
-<p><a class="reference external" href="http://wkhtmltopdf.org/">wkhtmltopdf</a> will be used by QFQ to offer &#8216;website print&#8217; and &#8216;HTML to PDF&#8217; conversion.
-The program is not included in QFQ and has to be manually installed.</p>
-<ul class="simple">
-<li>The Ubuntu package <cite>wkhtmltopdf</cite> needs a running Xserver - this does not work on a headless webserver.<ul>
-<li>Best is to install the QT version from the named website above.</li>
-<li>In case of trouble with wkhtmltopdf, also install &#8216;libxrender1&#8217;.</li>
-</ul>
-</li>
-</ul>
-<p>In <a class="reference internal" href="#config-qfq-ini">config-qfq-ini</a> specify the:</p>
-<ul class="simple">
-<li>installed <cite>wkhtmltopdf</cite> binary:<ul>
-<li><cite>WKHTMLTOPDF = /.../wkhtmltopdf</cite></li>
-</ul>
-</li>
-<li>the site base URL:<ul>
-<li><cite>BASE_URL_PRINT = http://example.com/</cite></li>
-</ul>
-</li>
-</ul>
-<p><strong>Important</strong>: To access FE_GROUP protected pages or content, it&#8217;s necessary to disable the <cite>[FE][lockIP]</cite> check! <cite>wkhtml</cite>
-will access the Typo3 page locally (localhost) and that IP address is different from the client (=user) IP.</p>
-<p>Configure via Typo3 Installtool <cite>All configuration &gt; $TYPO3_CONF_VARS[&#8216;FE&#8217;]</cite>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">[</span><span class="nx">FE</span><span class="p">][</span><span class="nx">lockIP</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
-</pre></div>
-</div>
-<p><strong>Warning</strong>: this disables an important anti-&#8216;session hijacking&#8217; protection. The security level of the whole installation
-will be <em>lowered</em>! Again, this is only needed if <cite>wkhtml</cite> needs access to FE_GROUP protected pages &amp; content. As an
-alternative to lower the security level, create a separated page subtree which is only accessible (configured via
-Typosript) from specific IPs <strong>or</strong> if a FE-User is logged in.</p>
-<p>If there are problems with converting/downloading FE_GROUP protected pages, check <cite>SHOW_DEBUG_INFO = download</cite> to debug.</p>
-<div class="section" id="html-to-pdf-conversion">
-<h4>HTML to PDF conversion<a class="headerlink" href="#html-to-pdf-conversion" title="Permalink to this headline">¶</a></h4>
-<p><cite>wkhtmltopdf</cite> converts a website (local or remote) to a (multi)-page PDF file. It&#8217;s mainly used in <a class="reference internal" href="#download">download</a>.</p>
-</div>
-<div class="section" id="print">
-<h4>Print<a class="headerlink" href="#print" title="Permalink to this headline">¶</a></h4>
-<p>Different browser prints the same page in different variations. To prevent this, QFQ implements a small PHP wrapper
-<cite>print.php</cite> with uses <cite>wkhtmltopdf</cite> to convert HTML to PDF.</p>
-<p>Provide a <cite>print this page</cite>-link (replace {current pageId}):</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="s2">&quot;typo3conf/ext/qfq/qfq/api/print.php?id={current pageId}&quot;</span><span class="o">&gt;</span><span class="k">Print</span> <span class="k">this</span> <span class="nx">page</span><span class="o">&lt;/</span><span class="nx">a</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-<p>Any parameter specified after <cite>print.php</cite> will be delivered to <cite>wkhtmltopdf</cite> as part of the URL.</p>
-<p>Typoscript code to implement a print link on every page:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mi">10</span> <span class="o">=</span> <span class="nx">TEXT</span>
-<span class="mi">10</span> <span class="p">{</span>
-        <span class="nx">wrap</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="s2">&quot;typo3conf/ext/qfq/qfq/api/print.php?id=|&amp;type=2&quot;</span><span class="o">&gt;&lt;</span><span class="nx">span</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;glyphicon glyphicon-print&quot;</span> <span class="nx">aria</span><span class="o">-</span><span class="nx">hidden</span><span class="o">=</span><span class="s2">&quot;true&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">span</span><span class="o">&gt;</span> <span class="nx">Printview</span><span class="o">&lt;/</span><span class="nx">a</span><span class="o">&gt;</span>
-        <span class="nx">data</span> <span class="o">=</span> <span class="nx">page</span><span class="o">:</span><span class="nx">uid</span>
-<span class="p">}</span>
-</pre></div>
-</div>
-</div>
-</div>
-</div>
-<div class="section" id="setup">
-<h2>Setup<a class="headerlink" href="#setup" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>Install the extension via the Extensionmanager.<ul>
-<li>If you install the extension by manual download/upload and get an error message
-&#8220;can&#8217;t activate extension&#8221;: rename the downloaded zip file to <cite>qfq.zip</cite> or <cite>qfq_&lt;version&gt;.zip</cite> (e.g. version: 0.9.1).</li>
-<li>If the Extensionmanager stops after importing: check your memory limit in php.ini.</li>
-</ul>
-</li>
-<li>Enable the online <a class="reference internal" href="#local-documentation">local-documentation</a>.</li>
-<li>Copy/rename the file <em>&lt;Documentroot&gt;/typo3conf/ext/&lt;ext_dir&gt;/config.example.qfq.ini</em> to
-<em>&lt;Documentroot&gt;/typo3conf/config.qfq.ini</em> and configure the necessary values: <a class="reference internal" href="#id5">config.qfq.ini</a>
-The configuration file is outside the extension directory to not loose it during updates.</li>
-<li>When the QFQ Extension is called the first time on the Typo3 Frontend, the file <em>&lt;ext_dir&gt;/qfq/sql/formEditor.sql</em> will
-played and fills the database with the <em>Form editor</em> records. This also happens automatically after each software update of QFQ.</li>
-<li>Configure Typoscript to include Bootstrap, jQuery, QFQ javascript and CSS files.</li>
-</ul>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">page</span><span class="o">.</span><span class="nx">meta</span> <span class="p">{</span>
-  <span class="nx">X</span><span class="o">-</span><span class="nx">UA</span><span class="o">-</span><span class="nx">Compatible</span> <span class="o">=</span> <span class="nx">IE</span><span class="o">=</span><span class="nx">edge</span>
-  <span class="nx">X</span><span class="o">-</span><span class="nx">UA</span><span class="o">-</span><span class="nx">Compatible</span><span class="o">.</span><span class="nx">attribute</span> <span class="o">=</span> <span class="nx">http</span><span class="o">-</span><span class="nx">equiv</span>
-  <span class="nx">viewport</span><span class="o">=</span><span class="nx">width</span><span class="o">=</span><span class="nx">device</span><span class="o">-</span><span class="nx">width</span><span class="p">,</span> <span class="nx">initial</span><span class="o">-</span><span class="nx">scale</span><span class="o">=</span><span class="mi">1</span>
-<span class="p">}</span>
-
-<span class="nx">page</span><span class="o">.</span><span class="nx">includeCSS</span> <span class="p">{</span>
-        <span class="nx">file1</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">Css</span><span class="o">/</span><span class="nx">bootstrap</span><span class="o">.</span><span class="nb">min</span><span class="o">.</span><span class="nx">css</span>
-        <span class="nx">file2</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">Css</span><span class="o">/</span><span class="nx">bootstrap</span><span class="o">-</span><span class="nx">theme</span><span class="o">.</span><span class="nb">min</span><span class="o">.</span><span class="nx">css</span>
-        <span class="nx">file3</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">Css</span><span class="o">/</span><span class="nx">jqx</span><span class="o">.</span><span class="nx">base</span><span class="o">.</span><span class="nx">css</span>
-        <span class="nx">file4</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">Css</span><span class="o">/</span><span class="nx">jqx</span><span class="o">.</span><span class="nx">bootstrap</span><span class="o">.</span><span class="nx">css</span>
-        <span class="nx">file5</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">Css</span><span class="o">/</span><span class="nx">qfq</span><span class="o">-</span><span class="nx">bs</span><span class="o">.</span><span class="nx">css</span>
-<span class="p">}</span>
-
-<span class="nx">page</span><span class="o">.</span><span class="nx">includeJS</span> <span class="p">{</span>
-        <span class="nx">file1</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">JavaScript</span><span class="o">/</span><span class="nx">jquery</span><span class="o">.</span><span class="nb">min</span><span class="o">.</span><span class="nx">js</span>
-        <span class="nx">file2</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">JavaScript</span><span class="o">/</span><span class="nx">bootstrap</span><span class="o">.</span><span class="nb">min</span><span class="o">.</span><span class="nx">js</span>
-        <span class="nx">file3</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">JavaScript</span><span class="o">/</span><span class="nx">validator</span><span class="o">.</span><span class="nb">min</span><span class="o">.</span><span class="nx">js</span>
-        <span class="nx">file4</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">JavaScript</span><span class="o">/</span><span class="nx">jqx</span><span class="o">-</span><span class="nx">all</span><span class="o">.</span><span class="nx">js</span>
-        <span class="nx">file5</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">JavaScript</span><span class="o">/</span><span class="nx">globalize</span><span class="o">.</span><span class="nx">js</span>
-        <span class="nx">file6</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">JavaScript</span><span class="o">/</span><span class="nx">tinymce</span><span class="o">.</span><span class="nb">min</span><span class="o">.</span><span class="nx">js</span>
-        <span class="nx">file7</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">JavaScript</span><span class="o">/</span><span class="nx">EventEmitter</span><span class="o">.</span><span class="nb">min</span><span class="o">.</span><span class="nx">js</span>
-        <span class="nx">file8</span> <span class="o">=</span> <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Public</span><span class="o">/</span><span class="nx">JavaScript</span><span class="o">/</span><span class="nx">qfq</span><span class="o">.</span><span class="nb">min</span><span class="o">.</span><span class="nx">js</span>
-<span class="p">}</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="formeditor">
-<span id="form-editor"></span><h2>FormEditor<a class="headerlink" href="#formeditor" title="Permalink to this headline">¶</a></h2>
-<p>Setup a <em>report</em> to manage all <em>forms</em>:</p>
-<ul class="simple">
-<li>Create a Typo3 page.</li>
-<li>Set the &#8216;URL Alias&#8217; to <cite>form</cite> (default) or the individual defined value in parameter EDIT_FORM_PAGE (config.qfq.ini).</li>
-<li>Insert a content record of type <em>qfq</em>.</li>
-<li>In the bodytext insert the following code:</li>
-</ul>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># If there is a form given by SIP: show</span>
-<span class="nx">form</span><span class="o">=</span><span class="p">{{</span><span class="nx">form</span><span class="o">:</span><span class="nx">SE</span><span class="p">}}</span>
-
-<span class="mi">10</span> <span class="p">{</span>
-        <span class="c1"># List of Forms: Do not show this list of forms if there is a form given by SIP.</span>
-        <span class="c1"># Table header.</span>
-        <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;{{pageId:T}}&amp;form=form&amp;&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="nx">_Pagen</span><span class="p">,</span> <span class="s1">&#39;#&#39;</span><span class="p">,</span> <span class="s1">&#39;Name&#39;</span><span class="p">,</span> <span class="s1">&#39;Title&#39;</span><span class="p">,</span> <span class="s1">&#39;Table&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span> <span class="nx">FROM</span> <span class="p">(</span><span class="nx">SELECT</span> <span class="mi">1</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">fake</span> <span class="nx">WHERE</span>  <span class="s1">&#39;{{form:SE}}&#39;</span><span class="o">=</span><span class="s1">&#39;&#39;</span>
-        <span class="nx">head</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">table</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;table table-hover qfq-table-50&quot;</span><span class="o">&gt;</span>
-        <span class="nx">tail</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">table</span><span class="o">&gt;</span>
-        <span class="nx">rbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">thead</span><span class="o">&gt;&lt;</span><span class="nx">tr</span><span class="o">&gt;</span>
-        <span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">tr</span><span class="o">&gt;&lt;/</span><span class="nx">thead</span><span class="o">&gt;</span>
-        <span class="nx">fbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">th</span><span class="o">&gt;</span>
-        <span class="nx">fend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">th</span><span class="o">&gt;</span>
-
-        <span class="mi">10</span> <span class="p">{</span>
-                <span class="c1"># All forms</span>
-                <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;{{pageId:T}}&amp;form=form&amp;r=&#39;</span><span class="p">,</span> <span class="nx">f</span><span class="o">.</span><span class="nx">id</span><span class="p">)</span> <span class="k">as</span> <span class="nx">_Pagee</span><span class="p">,</span> <span class="nx">f</span><span class="o">.</span><span class="nx">id</span><span class="p">,</span> <span class="nx">f</span><span class="o">.</span><span class="nx">name</span><span class="p">,</span> <span class="nx">f</span><span class="o">.</span><span class="nx">title</span><span class="p">,</span> <span class="nx">f</span><span class="o">.</span><span class="nx">tableName</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;form=form&amp;r=&#39;</span><span class="p">,</span> <span class="nx">f</span><span class="o">.</span><span class="nx">id</span><span class="p">)</span> <span class="k">as</span> <span class="nx">_Paged</span> <span class="nx">FROM</span> <span class="nx">Form</span> <span class="k">AS</span> <span class="nx">f</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">f</span><span class="o">.</span><span class="nx">name</span>
-                <span class="nx">rbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">tr</span><span class="o">&gt;</span>
-                <span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">tr</span><span class="o">&gt;</span>
-                <span class="nx">fbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">td</span><span class="o">&gt;</span>
-                <span class="nx">fend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">td</span><span class="o">&gt;</span>
-        <span class="p">}</span>
-<span class="p">}</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="config-qfq-ini">
-<span id="id5"></span><h2>config.qfq.ini<a class="headerlink" href="#config-qfq-ini" title="Permalink to this headline">¶</a></h2>
-<table border="1" class="docutils">
-<colgroup>
-<col width="19%" />
-<col width="32%" />
-<col width="49%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Keyword</th>
-<th class="head">Example</th>
-<th class="head">Description</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>DB_&lt;n&gt;_USER</td>
-<td>DB_1_USER=qfqUser</td>
-<td>Credentials configured in MySQL</td>
-</tr>
-<tr class="row-odd"><td>DB_&lt;n&gt;_PASSWORD</td>
-<td>DB_1_PASSWORD=1234567890</td>
-<td>Credentials configured in MySQL</td>
-</tr>
-<tr class="row-even"><td>DB_&lt;n&gt;_SERVER</td>
-<td>DB_1_SERVER=localhost</td>
-<td>Hostname of MySQL Server</td>
-</tr>
-<tr class="row-odd"><td>DB_&lt;n&gt;_NAME</td>
-<td>DB_1_NAME=qfq_db</td>
-<td>Database name</td>
-</tr>
-<tr class="row-even"><td>DB_INIT</td>
-<td>DB_INIT=set names utf8</td>
-<td>Global init for using the database.</td>
-</tr>
-<tr class="row-odd"><td>DB_INDEX_DATA</td>
-<td>DB_INDEX_DATA = 1</td>
-<td>Optional. Default: 1.</td>
-</tr>
-<tr class="row-even"><td>DB_INDEX_QFQ</td>
-<td>DB_INDEX_QFQ = 1</td>
-<td>Optional. Default: 1.</td>
-</tr>
-<tr class="row-odd"><td>SQL_LOG</td>
-<td>SQL_LOG=sql.log</td>
-<td>Filename to log SQL commands: relative to &lt;ext_dir&gt; or absolute.</td>
-</tr>
-<tr class="row-even"><td>SQL_LOG_MODE</td>
-<td>SQL_LOG_MODE=modify</td>
-<td><em>all</em>: every statement will be logged - this might a lot.
-<em>modify</em>: log only statements who change data.</td>
-</tr>
-<tr class="row-odd"><td>SHOW_DEBUG_INFO</td>
-<td>SHOW_DEBUG_INFO=auto</td>
-<td>FE - Possible values: yes|no|auto|download. For &#8216;auto&#8217;: If a BE User is
-logged in, a debug information will be shown on the FE.</td>
-</tr>
-<tr class="row-even"><td>REDIRECT_ALL_MAIL_TO</td>
-<td><a class="reference external" href="mailto:REDIRECT_ALL_MAIL_TO=john&#37;&#52;&#48;doe&#46;com">REDIRECT_ALL_MAIL_TO=john<span>&#64;</span>doe<span>&#46;</span>com</a></td>
-<td>If set, redirect all QFQ generated mails (Form, Report) to the specified.</td>
-</tr>
-<tr class="row-odd"><td>CSS_LINK_CLASS_INTERNAL</td>
-<td>CSS_LINK_CLASS_INTERNAL=internal</td>
-<td>CSS class name of links which points to internal tagets</td>
-</tr>
-<tr class="row-even"><td>CSS_LINK_CLASS_EXTERNAL</td>
-<td>CSS_LINK_CLASS_EXTERNAL=external</td>
-<td>CSS class name of links which points to internal tagets</td>
-</tr>
-<tr class="row-odd"><td>CSS_CLASS_QFQ_CONTAINER</td>
-<td>CSS_CLASS_QFQ_CONTAINER=container</td>
-<td>QFQ with own Bootstrap: &#8216;container&#8217;.
-QFQ already nested in Bootstrap of mainpage: &lt;empty&gt;</td>
-</tr>
-<tr class="row-even"><td>CSS_CLASS_QFQ_FORM</td>
-<td>CSS_CLASS_QFQ_FORM=qfq-color-base</td>
-<td>Wrap around QFQ &#8216;Form&#8217;</td>
-</tr>
-<tr class="row-odd"><td>CSS_CLASS_QFQ_FORM_PILL</td>
-<td>CSS_CLASS_QFQ_FORM_PILL=qfq-color-grey-1</td>
-<td>Wrap around title bar for pills: CSS Class, typically a background color</td>
-</tr>
-<tr class="row-even"><td>CSS_CLASS_QFQ_FORM_BODY</td>
-<td>CSS_CLASS_QFQ_FORM_BODY=qfq-color-grey-2</td>
-<td>Wrap around formelements: CSS Class, typically a background color</td>
-</tr>
-<tr class="row-odd"><td>DATE_FORMAT</td>
-<td>DATE_FORMAT= yyyy-mm-dd</td>
-<td>Possible options: yyyy-mm-dd, dd.mm.yyyy</td>
-</tr>
-<tr class="row-even"><td>FORM_DATA_PATTERN_ERROR</td>
-<td>FORM_DATA_PATTERN_ERROR=please check pa.</td>
-<td>Customizable error message used in validator.js. &#8216;pattern&#8217; violation</td>
-</tr>
-<tr class="row-odd"><td>FORM_DATA_REQUIRED_ERROR</td>
-<td>FORM_DATA_REQUIRED_ERROR=missing value</td>
-<td>Customizable error message used in validator.js. &#8216;required&#8217; fields</td>
-</tr>
-<tr class="row-even"><td>FORM_DATA_MATCH_ERROR</td>
-<td>FORM_DATA_MATCH_ERROR=type error</td>
-<td>Customizable error message used in validator.js. &#8216;match&#8217; retype mismatch</td>
-</tr>
-<tr class="row-odd"><td>FORM_DATA_ERROR</td>
-<td>FORM_DATA_ERROR=generic error</td>
-<td>Customizable error message used in validator.js. &#8216;no specific&#8217; given</td>
-</tr>
-<tr class="row-even"><td>FORM_BS_COLUMNS</td>
-<td>FORM_BS_COLUMNS=12</td>
-<td>The whole form will be wrapped in &#8216;col-md-??&#8217;. Default is 12 for 100%</td>
-</tr>
-<tr class="row-odd"><td>FORM_BS_LABEL_COLUMNS</td>
-<td>FORM_BS_LABEL_COLUMNS = 3</td>
-<td>Default number of BS columns for the &#8216;label&#8217;-column</td>
-</tr>
-<tr class="row-even"><td>FORM_BS_INPUT_COLUMNS</td>
-<td>FORM_BS_INPUT_COLUMNS = 6</td>
-<td>Default number of BS columns for the &#8216;input&#8217;-column</td>
-</tr>
-<tr class="row-odd"><td>FORM_BS_NOTE_COLUMNS</td>
-<td>FORM_BS_NOTE_COLUMNS = 3</td>
-<td>Default number of BS columns for the &#8216;note&#8217;-column</td>
-</tr>
-<tr class="row-even"><td>FORM_BUTTON_ON_CHANGE_CLASS</td>
-<td>FORM_BUTTON_ON_CHANGE_CLASS=alert-info btn-info</td>
-<td>Color for save button after modification</td>
-</tr>
-<tr class="row-odd"><td>BASE_URL_PRINT</td>
-<td>BASE_URL_PRINT=http://example.com</td>
-<td>URL where wkhtmltopdf will fetch the HTML (no parameter, those comes later)</td>
-</tr>
-<tr class="row-even"><td>WKHTMLTOPDF</td>
-<td>WKHTMLTOPDF=/usr/bin/wkhtmltopdf</td>
-<td>Binary where to find wkhtmltopdf.</td>
-</tr>
-<tr class="row-odd"><td>EDIT_FORM_PAGE</td>
-<td>EDIT_FORM_PAGE = form</td>
-<td>T3 Pagealias to edit a form.</td>
-</tr>
-<tr class="row-even"><td>LDAP_1_RDN</td>
-<td>LDAP_1_RDN=&#8217;ou=Admin,ou=example,dc=com&#8217;</td>
-<td rowspan="2">Credentials for non-anonymous LDAP access. At the moment only one set of
-crendentials is supported.</td>
-</tr>
-<tr class="row-odd"><td>LDAP_1_PASSWORD</td>
-<td>LDAP_1_PASSWORD=mySecurePassword</td>
-</tr>
-<tr class="row-even"><td>ESCAPE_TYPE_DEFAULT</td>
-<td>ESCAPE_TYPE_DEFAULT=s</td>
-<td>All variables <cite>{{...}}</cite> get this escape class by default.
-See <a class="reference internal" href="#variable-escape">variable-escape</a>.</td>
-</tr>
-<tr class="row-odd"><td>SECURITY_VARS_HONEYPOT</td>
-<td>SECURITY_VARS_HONEYPOT = email,username,password</td>
-<td>If empty: no check. All named variables will rendered as INPUT elements</td>
-</tr>
-<tr class="row-even"><td>SECURITY_ATTACK_DELAY</td>
-<td>SECURITY_ATTACK_DELAY = 5</td>
-<td>If an attack is detected, sleep &#8216;x&#8217; seconds and exit PHP process</td>
-</tr>
-<tr class="row-odd"><td>SECURITY_SHOW_MESSAGE</td>
-<td>SECURITY_SHOW_MESSAGE = true</td>
-<td>If an attack is detected, show a message</td>
-</tr>
-<tr class="row-even"><td>SECURITY_GET_MAX_LENGTH</td>
-<td>SECURITY_GET_MAX_LENGTH = 50</td>
-<td>GET vars longer than &#8216;x&#8217; chars triggers an <cite>attack-recognized</cite>.
-<a class="reference internal" href="#exceptionmaxlength">ExceptionMaxLength</a></td>
-</tr>
-<tr class="row-odd"><td>GFX_EXTRA_BUTTON_INFO_INLINE</td>
-<td>&lt;img src=&#8221;info.png&#8221;&gt;</td>
-<td>Image for <a class="reference internal" href="#extrabuttoninfo">extraButtonInfo</a> (inline)</td>
-</tr>
-<tr class="row-even"><td>GFX_EXTRA_BUTTON_INFO_BELOW</td>
-<td>&lt;img src=&#8221;info.png&#8221;&gt;</td>
-<td>Image for <a class="reference internal" href="#extrabuttoninfo">extraButtonInfo</a> (below)</td>
-</tr>
-<tr class="row-odd"><td>EXTRA_BUTTON_INFO_POSITION</td>
-<td>SYSTEM_EXTRA_BUTTON_INFO_POSITION=below</td>
-<td>&#8216;auto&#8217; (default) or &#8216;below&#8217;. See <a class="reference internal" href="#extrabuttoninfo">extraButtonInfo</a></td>
-</tr>
-<tr class="row-even"><td>EXTRA_BUTTON_INFO_CLASS</td>
-<td>SYSTEM_EXTRA_BUTTON_INFO_CLASS=pull-right</td>
-<td>&#8216;&#8217; (default) or &#8216;pull-right&#8217;. See <a class="reference internal" href="#extrabuttoninfo">extraButtonInfo</a></td>
-</tr>
-<tr class="row-odd"><td>SAVE_BUTTON_TEXT</td>
-<td>SAVE_BUTTON_TEXT =</td>
-<td>Default text on the form save button. Typically none.</td>
-</tr>
-<tr class="row-even"><td>SAVE_BUTTON_TOOLTIP</td>
-<td>SAVE_BUTTON_TOOLTIP = save</td>
-<td>Default tooltip on the form save button.</td>
-</tr>
-<tr class="row-odd"><td>SAVE_BUTTON_CLASS</td>
-<td>SAVE_BUTTON_CLASS = btn btn-default navbar-btn</td>
-<td>Default Bootstrap CSS class for buttons on top of the form</td>
-</tr>
-<tr class="row-even"><td>SAVE_BUTTON_GLYPH_ICON</td>
-<td>SAVE_BUTTON_GLYPH_ICON = glyphicon-ok</td>
-<td>Default Icon for the form save button</td>
-</tr>
-<tr class="row-odd"><td>CLOSE_BUTTON_TEXT</td>
-<td>CLOSE_BUTTON_TEXT =</td>
-<td>Default text on the form close button. Typically none.</td>
-</tr>
-<tr class="row-even"><td>CLOSE_BUTTON_TOOLTIP</td>
-<td>CLOSE_BUTTON_TOOLTIP = close</td>
-<td>Default tooltip on the form close button.</td>
-</tr>
-<tr class="row-odd"><td>CLOSE_BUTTON_CLASS</td>
-<td>CLOSE_BUTTON_CLASS = btn btn-default navbar-btn</td>
-<td>Default Bootstrap CSS class for buttons on top of the form</td>
-</tr>
-<tr class="row-even"><td>CLOSE_BUTTON_GLYPH_ICON</td>
-<td>CLOSE_BUTTON_GLYPH_ICON = glyphicon-remove</td>
-<td>Default Icon for the form close button</td>
-</tr>
-<tr class="row-odd"><td>DELETE_BUTTON_TEXT</td>
-<td>DELETE_BUTTON_TEXT =</td>
-<td>Default text on the form delete button. Typically none.</td>
-</tr>
-<tr class="row-even"><td>DELETE_BUTTON_TOOLTIP</td>
-<td>DELETE_BUTTON_TOOLTIP = delete</td>
-<td>Default tooltip on the form delete button.</td>
-</tr>
-<tr class="row-odd"><td>DELETE_BUTTON_CLASS</td>
-<td>DELETE_BUTTON_CLASS = btn btn-default navbar-btn</td>
-<td>Default Bootstrap CSS class for buttons on top of the form</td>
-</tr>
-<tr class="row-even"><td>DELETE_BUTTON_GLYPH_ICON</td>
-<td>DELETE_BUTTON_GLYPH_ICON = glyphicon-trash</td>
-<td>Default Icon for the form delete button</td>
-</tr>
-<tr class="row-odd"><td>NEW_BUTTON_TEXT</td>
-<td>NEW_BUTTON_TEXT =</td>
-<td>Default text on the form new button. Typically none.</td>
-</tr>
-<tr class="row-even"><td>NEW_BUTTON_TOOLTIP</td>
-<td>NEW_BUTTON_TOOLTIP = new</td>
-<td>Default tooltip on the form new button.</td>
-</tr>
-<tr class="row-odd"><td>NEW_BUTTON_CLASS</td>
-<td>NEW_BUTTON_CLASS = btn btn-default navbar-btn</td>
-<td>Default Bootstrap CSS class for buttons on top of the form</td>
-</tr>
-<tr class="row-even"><td>NEW_BUTTON_GLYPH_ICON</td>
-<td>NEW_BUTTON_GLYPH_ICON = glyphicon-plus</td>
-<td>Default Icon for the form new button</td>
-</tr>
-<tr class="row-odd"><td>DB_UPDATE</td>
-<td>DB_UPDATE = auto</td>
-<td>&#8216;auto&#8217;: apply DB Updates only if there is a newer version.
-&#8216;always&#8217;: apply DB Updates always, especially play formEditor.sql every
-time QFQ is called - <em>not</em> recommended!
-&#8216;never&#8217;: never apply DB Updates.</td>
-</tr>
-<tr class="row-even"><td>DIRTY_RECORD_TIMEOUT_SECONDS</td>
-<td>DIRTY_RECORD_TIMEOUT_SECONDS = 900</td>
-<td>Timeout for record locking. After this time, a record will be replaced</td>
-</tr>
-<tr class="row-odd"><td>DOCUMENTATION_QFQ</td>
-<td>DOCUMENTATION_QFQ=http://docs.typo3.org...</td>
-<td>Link to the online documentation of QFQ. Every QFQ installation also
-contains a local copy: typo3conf/ext/qfq/Documentation/html/Manual.html</td>
-</tr>
-<tr class="row-even"><td>VAR_ADD_BY_SQL</td>
-<td>VAR_ADD_BY_SQL = {{!SELECT s.id AS ...</td>
-<td>Specific values read from the database to fill the system store during QFQ
-load. See <a class="reference internal" href="#variablesaddbysql">VariablesAddBySql</a> for a usecase.</td>
-</tr>
-<tr class="row-odd"><td>FORM_LANGUAGE_A_ID
-FORM_LANGUAGE_B_ID
-FORM_LANGUAGE_C_ID
-FORM_LANGUAGE_D_ID</td>
-<td>FORM_LANGUAGE_A__ID = 1</td>
-<td>In Typo3 configured pageLanguage id. The number after the &#8216;L&#8217; parameter.</td>
-</tr>
-<tr class="row-even"><td>FORM_LANGUAGE_A_LABEL
-FORM_LANGUAGE_B_LABEL
-FORM_LANGUAGE_C_LABEL
-FORM_LANGUAGE_D_LABEL</td>
-<td>FORM_LANGUAGE_A_LABEL = english</td>
-<td>Label shown in <em>Form editor</em>, on the &#8216;basic&#8217; tab.</td>
-</tr>
-</tbody>
-</table>
-<p>Example: <em>typo3conf/config.qfq.ini</em></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span>     <span class="p">;</span> <span class="nx">To</span> <span class="nx">get</span> <span class="nx">internal</span> <span class="k">default</span> <span class="nx">values</span><span class="p">,</span> <span class="nx">inactivate</span> <span class="nx">the</span> <span class="nx">option</span> <span class="nx">by</span> <span class="nx">commenting</span> <span class="p">(</span><span class="o">=</span> <span class="s1">&#39;;&#39;</span><span class="p">)</span> <span class="nx">it</span><span class="o">.</span>
-     <span class="nx">DB_1_USER</span> <span class="o">=</span> <span class="nx">qfqUser</span>
-     <span class="nx">DB_1_SERVER</span> <span class="o">=</span> <span class="nx">localhost</span>
-     <span class="nx">DB_1_PASSWORD</span> <span class="o">=</span> <span class="mi">12345678</span>
-     <span class="nx">DB_1_NAME</span> <span class="o">=</span> <span class="nx">qfq_db</span>
-     <span class="nx">DB_INIT</span> <span class="o">=</span> <span class="nx">set</span> <span class="nx">names</span> <span class="nx">utf8</span>
-     <span class="p">;</span> <span class="nx">DB_INDEX_DATA</span> <span class="o">=</span> <span class="mi">1</span>
-<span class="p">;</span> <span class="nx">DB_INDEX_QFQ</span> <span class="o">=</span> <span class="mi">1</span>
-     <span class="p">;</span> <span class="nx">SQL_LOG</span> <span class="o">=</span> <span class="nx">sql</span><span class="o">.</span><span class="nb">log</span>
-     <span class="p">;</span> <span class="nx">SQL_LOG_MODE</span> <span class="o">=</span> <span class="nx">modify</span>
-     <span class="p">;</span> <span class="nx">SHOW_DEBUG_INFO</span> <span class="o">=</span> <span class="nx">auto</span>
-     <span class="p">;</span> <span class="nx">REDIRECT_ALL_MAIL_TO</span> <span class="o">=</span> <span class="nx">john</span><span class="o">.</span><span class="nx">doe</span><span class="o">@</span><span class="nx">example</span><span class="o">.</span><span class="nx">com</span>
-     <span class="nx">CSS_LINK_CLASS_INTERNAL</span> <span class="o">=</span> <span class="nx">internal</span>
-     <span class="nx">CSS_LINK_CLASS_EXT</span> <span class="o">=</span> <span class="nx">external</span>
-     <span class="p">;</span> <span class="nx">CSS_CLASS_QFQ_CONTAINER</span> <span class="o">=</span>
-     <span class="p">;</span> <span class="nx">CSS_CLASS_QFQ_FORM</span> <span class="o">=</span>
-     <span class="nx">CSS_CLASS_QFQ_FORM_PILL</span> <span class="o">=</span> <span class="nx">qfq</span><span class="o">-</span><span class="nx">color</span><span class="o">-</span><span class="nx">grey</span><span class="o">-</span><span class="mi">1</span>
-     <span class="nx">CSS_CLASS_QFQ_FORM_BODY</span> <span class="o">=</span> <span class="nx">qfq</span><span class="o">-</span><span class="nx">color</span><span class="o">-</span><span class="nx">grey</span><span class="o">-</span><span class="mi">2</span>
-     <span class="p">;</span> <span class="nx">DATE_FORMAT</span><span class="o">=</span> <span class="nx">yyyy</span><span class="o">-</span><span class="nx">mm</span><span class="o">-</span><span class="nx">dd</span>
-
-     <span class="p">;</span> <span class="nx">TECHNICAL</span> <span class="nx">CONTACT</span> <span class="o">=</span> <span class="nx">john</span><span class="o">@</span><span class="nx">doe</span><span class="o">.</span><span class="nx">com</span>
-
-     <span class="p">;</span> <span class="nx">FORM_DATA_PATTERN_ERROR</span> <span class="o">=</span>
-     <span class="p">;</span> <span class="nx">FORM_DATA_REQUIRED_ERROR</span> <span class="o">=</span>
-     <span class="p">;</span> <span class="nx">FORM_DATA_MATCH_ERROR</span> <span class="o">=</span>
-     <span class="p">;</span> <span class="nx">FORM_DATA_ERROR</span> <span class="o">=</span>
-
-     <span class="p">;</span> <span class="nx">FORM_BS_COLUMNS</span> <span class="o">=</span> <span class="mi">12</span>
-     <span class="p">;</span> <span class="nx">FORM_BS_LABEL_COLUMNS</span> <span class="o">=</span> <span class="mi">3</span>
-     <span class="p">;</span> <span class="nx">FORM_BS_INPUT_COLUMNS</span> <span class="o">=</span> <span class="mi">6</span>
-     <span class="p">;</span> <span class="nx">FORM_BS_NOTE_COLUMNS</span> <span class="o">=</span> <span class="mi">3</span>
-
-     <span class="nx">BASE_URL_PRINT</span><span class="o">=</span><span class="nx">http</span><span class="o">://</span><span class="nx">example</span><span class="o">.</span><span class="nx">com</span><span class="o">/</span>
-     <span class="nx">WKHTMLTOPDF</span><span class="o">=/</span><span class="nx">usr</span><span class="o">/</span><span class="nx">bin</span><span class="o">/</span><span class="nx">wkhtmltopdf</span>
-
-     <span class="p">;</span> <span class="nx">EDIT_FORM_PAGE</span> <span class="o">=</span> <span class="nx">form</span>
-
-     <span class="p">;</span> <span class="nx">LDAP_1_RDN</span><span class="o">=</span><span class="s1">&#39;ou=Admin,dc=example,dc=com&#39;</span>
-     <span class="p">;</span> <span class="nx">LDAP_1_PASSWORD</span><span class="o">=</span><span class="nx">mySecurePassword</span>
-
-     <span class="p">;</span> <span class="nx">ESCAPE_TYPE_DEFAULT</span><span class="o">=</span><span class="nx">s</span>
-     <span class="p">;</span> <span class="nx">SECURITY_VARS_HONEYPOT</span><span class="o">=</span><span class="nx">email</span><span class="p">,</span><span class="nx">username</span><span class="p">,</span><span class="nx">password</span>
-     <span class="p">;</span> <span class="nx">SECURITY_ATTACK_DELAY</span><span class="o">=</span><span class="mi">5</span>
-     <span class="p">;</span> <span class="nx">SECURITY_SHOW_MESSAGE</span><span class="o">=</span><span class="k">true</span>
-     <span class="p">;</span> <span class="nx">SECURITY_GET_MAX_LENGTH</span><span class="o">=</span><span class="mi">50</span>
-
-     <span class="p">;</span><span class="nx">SAVE_BUTTON_TEXT</span> <span class="o">=</span>
-     <span class="p">;</span><span class="nx">SAVE_BUTTON_TOOLTIP</span> <span class="o">=</span> <span class="nx">save</span>
-     <span class="p">;</span><span class="nx">SAVE_BUTTON_CLASS</span> <span class="o">=</span> <span class="nx">btn</span> <span class="nx">btn</span><span class="o">-</span><span class="k">default</span> <span class="nx">navbar</span><span class="o">-</span><span class="nx">btn</span>
-     <span class="p">;</span><span class="nx">SAVE_BUTTON_GLYPH_ICON</span> <span class="o">=</span> <span class="nx">glyphicon</span><span class="o">-</span><span class="nx">ok</span>
-
-     <span class="p">;</span><span class="nx">CLOSE_BUTTON_TEXT</span> <span class="o">=</span>
-     <span class="p">;</span><span class="nx">CLOSE_BUTTON_TOOLTIP</span> <span class="o">=</span> <span class="nx">close</span>
-     <span class="p">;</span><span class="nx">CLOSE_BUTTON_CLASS</span> <span class="o">=</span> <span class="nx">btn</span> <span class="nx">btn</span><span class="o">-</span><span class="k">default</span> <span class="nx">navbar</span><span class="o">-</span><span class="nx">btn</span>
-     <span class="p">;</span><span class="nx">CLOSE_BUTTON_GLYPH_ICON</span> <span class="o">=</span> <span class="nx">glyphicon</span><span class="o">-</span><span class="nx">remove</span>
-
-     <span class="p">;</span><span class="nx">DELETE_BUTTON_TEXT</span> <span class="o">=</span>
-     <span class="p">;</span><span class="nx">DELETE_BUTTON_TOOLTIP</span> <span class="o">=</span> <span class="nx">delete</span>
-     <span class="p">;</span><span class="nx">DELETE_BUTTON_CLASS</span> <span class="o">=</span> <span class="nx">btn</span> <span class="nx">btn</span><span class="o">-</span><span class="k">default</span> <span class="nx">navbar</span><span class="o">-</span><span class="nx">btn</span>
-     <span class="p">;</span><span class="nx">DELETE_BUTTON_GLYPH_ICON</span> <span class="o">=</span> <span class="nx">glyphicon</span><span class="o">-</span><span class="nx">trash</span>
-
-     <span class="p">;</span><span class="nx">NEW_BUTTON_TEXT</span> <span class="o">=</span>
-     <span class="p">;</span><span class="nx">NEW_BUTTON_TOOLTIP</span> <span class="o">=</span> <span class="k">new</span>
-     <span class="p">;</span><span class="nx">NEW_BUTTON_CLASS</span> <span class="o">=</span> <span class="nx">btn</span> <span class="nx">btn</span><span class="o">-</span><span class="k">default</span> <span class="nx">navbar</span><span class="o">-</span><span class="nx">btn</span>
-     <span class="p">;</span><span class="nx">NEW_BUTTON_GLYPH_ICON</span> <span class="o">=</span> <span class="nx">glyphicon</span><span class="o">-</span><span class="nx">plus</span>
-
-     <span class="p">;</span> <span class="nx">auto</span> <span class="o">|</span> <span class="nx">always</span> <span class="o">|</span> <span class="nx">never</span>
-     <span class="p">;</span><span class="nx">DB_UPDATE</span> <span class="o">=</span> <span class="nx">auto</span>
-
-     <span class="p">;</span><span class="nx">RECORD_LOCK_TIMEOUT_SECONDS</span> <span class="o">=</span> <span class="mi">900</span>
-
-     <span class="p">;</span> <span class="nx">Local</span> <span class="nx">Documentation</span> <span class="p">(</span><span class="nx">doc</span> <span class="nx">fits</span> <span class="nx">to</span> <span class="nx">installed</span> <span class="nx">version</span><span class="p">)</span><span class="o">:</span>  <span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">/</span><span class="nx">qfq</span><span class="o">/</span><span class="nx">Documentation</span><span class="o">/</span><span class="nx">html</span><span class="o">/</span><span class="nx">Manual</span><span class="o">.</span><span class="nx">html</span>
-     <span class="p">;</span><span class="nx">DOCUMENTATION_QFQ</span> <span class="o">=</span> <span class="nx">https</span><span class="o">://</span><span class="nx">docs</span><span class="o">.</span><span class="nx">typo3</span><span class="o">.</span><span class="nx">org</span><span class="o">/</span><span class="nx">typo3cms</span><span class="o">/</span><span class="nx">drafts</span><span class="o">/</span><span class="nx">github</span><span class="o">/</span><span class="nx">T3DocumentationStarter</span><span class="o">/</span><span class="k">Public</span><span class="o">-</span><span class="nx">Info</span><span class="o">-</span><span class="mo">053</span><span class="o">/</span><span class="nx">Manual</span><span class="o">.</span><span class="nx">html</span>
-
-     <span class="p">;</span><span class="nx">VAR_ADD_BY_SQL</span> <span class="o">=</span> <span class="p">{{</span><span class="o">!</span><span class="nx">SELECT</span> <span class="nx">s</span><span class="o">.</span><span class="nx">id</span> <span class="k">AS</span> <span class="nx">_periodId</span> <span class="nx">FROM</span> <span class="nx">Period</span> <span class="k">AS</span> <span class="nx">s</span> <span class="nx">WHERE</span> <span class="nx">s</span><span class="o">.</span><span class="nx">start</span><span class="o">&lt;=</span><span class="nx">NOW</span><span class="p">()</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">s</span><span class="o">.</span><span class="nx">start</span> <span class="nx">DESC</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-
-     <span class="p">;</span><span class="nx">FORM_LANGUAGE_A_ID</span> <span class="o">=</span> <span class="mi">1</span>
-     <span class="p">;</span><span class="nx">FORM_LANGUAGE_A_LABEL</span> <span class="o">=</span> <span class="nx">english</span>
-
-     <span class="p">;</span><span class="nx">GFX_EXTRA_BUTTON_INFO_INLINE</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">img</span> <span class="nx">src</span><span class="o">=</span><span class="s1">&#39;info.png&#39;</span><span class="o">&gt;</span>
-     <span class="p">;</span><span class="nx">GFX_EXTRA_BUTTON_INFO_BELOW</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">img</span> <span class="nx">src</span><span class="o">=</span><span class="s1">&#39;info.png&#39;</span><span class="o">&gt;</span>
-     <span class="p">;</span><span class="nx">EXTRA_BUTTON_INFO_POSITION</span> <span class="o">=</span> <span class="nx">auto</span> <span class="o">|</span> <span class="nx">below</span>
-     <span class="p">;</span><span class="nx">EXTRA_BUTTON_INFO_CLASS</span> <span class="o">=</span> <span class="nx">pull</span><span class="o">-</span><span class="nx">right</span>
-</pre></div>
-</div>
-<div class="section" id="custom-variables">
-<span id="customvariables"></span><h3>Custom variables<a class="headerlink" href="#custom-variables" title="Permalink to this headline">¶</a></h3>
-<p>It&#8217;s also possible to setup custom variables in <cite>config.qfq.ini</cite>.</p>
-<p>E.g. to setup a contact address and reuse the information inside your installation do:</p>
-<blockquote>
-<div><ul>
-<li><p class="first"><cite>config.qfq.in</cite>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">ADMINISTRATIVE_CONTACT</span> <span class="o">=</span> <span class="nx">john</span><span class="o">@</span><span class="nx">doe</span><span class="o">.</span><span class="nx">com</span>
-<span class="nx">ADMINISTRATIVE_ADDRESS</span> <span class="o">=</span> <span class="nx">John</span> <span class="nx">Doe</span><span class="p">,</span> <span class="nx">Hollywood</span> <span class="nx">Blvd</span><span class="o">.</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">L</span><span class="o">.</span><span class="nx">A</span><span class="o">.</span>
-<span class="nx">ADMINISTRATIVE_NAME</span> <span class="o">=</span> <span class="nx">John</span> <span class="nx">Doe</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first">Somewhere in a <cite>Form</cite> or in <cite>Report</cite>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="nx">ADMINISTRATIVE_CONTACT</span><span class="o">:</span><span class="nx">Y</span><span class="p">}},</span> <span class="p">{{</span><span class="nx">ADMINISTRATIVE_ADDRESS</span><span class="o">:</span><span class="nx">Y</span><span class="p">}},</span> <span class="p">{{</span><span class="nx">ADMINISTRATIVE_NAME</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="variables-add-by-sql">
-<span id="variablesaddbysql"></span><h3>Variables add by SQL<a class="headerlink" href="#variables-add-by-sql" title="Permalink to this headline">¶</a></h3>
-<p>A specified SELECT statement in <a class="reference internal" href="#id5">config.qfq.ini</a> in variable <cite>VAR_ADD_BY_SQL</cite> fill be fired after filling the SYSTEM STORE.
-The query should have 0 (nothing happens) or 1 row. The column names and column values will be added as variables to the SYSTEM_STORE.
-Existing variables will be overwritten. Be carefull not to overwrite needed values.</p>
-<p>This option is usefull to make generic custom values, saved in the database, accessible to all QFQ Report and Forms.
-Access such variables as usual via <cite>{{&lt;varname&gt;:Y}}</cite>.</p>
-<div class="section" id="periodid">
-<span id="id6"></span><h4>periodId<a class="headerlink" href="#periodid" title="Permalink to this headline">¶</a></h4>
-<p>This is</p>
-<ul class="simple">
-<li>a usecase, implemented via <a class="reference internal" href="#variablesaddbysql">VariablesAddBySql</a>,</li>
-<li>a way to access <cite>Period.id</cite> with respect to the current period (the period itself is custom defined).</li>
-</ul>
-<p>After a full QFQ installation, three things are prepared:</p>
-<ul class="simple">
-<li>a table <cite>Period</cite> (extend / change it to your needs, fill them with your periods),</li>
-<li>one sample record in table <cite>Period</cite>,</li>
-<li>in <a class="reference internal" href="#id5">config.qfq.ini</a> the default definition of <cite>VAR_ADD_BY_SQL</cite> will set the variable <cite>periodId</cite> during QFQ load.</li>
-</ul>
-<p>Websites, delivering semester data, schoolyears schedules, or any other type or periods, often need an index to the
-<em>current</em> period. One way is a) to mark the current period and b) to change the marker every time when the next period
-becomes current.
-The QFQ approach works without a marker and without manual intervention: the whished index will be computed during QFQ load.</p>
-<p>In <cite>config.qfq.ini</cite>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">VAR_ADD_BY_SQL</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">id</span> <span class="k">AS</span> <span class="nx">periodId</span> <span class="nx">FROM</span> <span class="nx">Period</span> <span class="nx">WHERE</span> <span class="nx">start</span><span class="o">&lt;=</span><span class="nx">NOW</span><span class="p">()</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">start</span> <span class="nx">DESC</span> <span class="nx">LIMIT</span> <span class="mi">1</span>
-</pre></div>
-</div>
-<p>a variable &#8216;periodId&#8217; will automatically computed and filled in STORE SYSTEM. Access it via <cite>{{periodId:Y0}}</cite>.
-To get the name and current period:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="nx">name</span><span class="p">,</span> <span class="s1">&#39; / &#39;</span><span class="p">,</span> <span class="nx">start</span> <span class="nx">FROM</span> <span class="nx">Period</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">periodId</span><span class="o">:</span><span class="nx">Y0</span><span class="p">}}</span>
-</pre></div>
-</div>
-<p>Typically, it&#8217;s necessary to offer a &#8216;previous&#8217; / &#8216;next&#8217; link. In this example, the STORE SIP holds the new periodId:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;id={{pageId:T}}&amp;periodId=&#39;</span><span class="p">,</span> <span class="p">{{</span><span class="nx">periodId</span><span class="o">:</span><span class="nx">SY0</span><span class="p">}}</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;|Next&#39;</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_Page</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;id={{pageId:T}}&amp;periodId=&#39;</span><span class="p">,</span> <span class="p">{{</span><span class="nx">periodId</span><span class="o">:</span><span class="nx">SY0</span><span class="p">}}</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;|Next&#39;</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_Page</span> <span class="nx">FROM</span> <span class="nx">Period</span> <span class="k">AS</span> <span class="nx">s</span> <span class="nx">WHERE</span> <span class="nx">s</span><span class="o">.</span><span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">periodId</span><span class="o">:</span><span class="nx">SY0</span><span class="p">}}</span>
-</pre></div>
-</div>
-<p>Take care for minimum and maximum indexes (do not render the links if out of range).</p>
-</div>
-</div>
-<div class="section" id="db-user-privileges">
-<span id="dbuserprivileges"></span><h3>DB USER privileges<a class="headerlink" href="#db-user-privileges" title="Permalink to this headline">¶</a></h3>
-<p>The specified DB User needs privileges to the database of at least: SELECT / INSERT / UPDATE / DELETE / SHOW.</p>
-<p>To apply automatically QFQ-&#8216;DB UPDATE&#8217; the following rights are mandatory too: CREATE / ALTER</p>
-<p>To get access to the Typo3 installation, &#8216;dbuser&#8217; should also have acces to the Typo3 Database with at least SELECT / INSERT / UPDATE / DELETE.</p>
-</div>
-<div class="section" id="exception-for-security-get-max-length">
-<span id="exceptionmaxlength"></span><h3>Exception for SECURITY_GET_MAX_LENGTH<a class="headerlink" href="#exception-for-security-get-max-length" title="Permalink to this headline">¶</a></h3>
-<p>If it is necessary to use a GET variable which exceeds SECURITY_GET_MAX_LENGTH limit, name the variable with &#8216;_&lt;num&gt;&#8217; at
-the end. E.g. <cite>my_long_variable_130</cite>. Such a variable has an allowed length of 130 chars. Access the variable as
-usual with the variable name: <cite>{{my_long_variable_130:C:...}}</cite>.</p>
-</div>
-</div>
-<div class="section" id="local-documentation">
-<span id="id7"></span><h2>Local Documentation<a class="headerlink" href="#local-documentation" title="Permalink to this headline">¶</a></h2>
-<p>A HTML rendered version is available under: &lt;your site&gt;/typo3conf/ext/qfq/Documentation/html/Index.html</p>
-<p>If you get a &#8216;Page forbidden / not found&#8217; there might be some Webserver restrictions. E.g. the Typo3 example of <cite>.htaccess</cite>
-in the Typo3 installation folder will forbid access to any extension documentation (which is a good idea on a productive
-server). For a development server instead, deactivate the forbid rule of &#8216;documentation&#8217;. In <cite>.htaccess</cite> (snippet from
-Typo3 7.6 _.htaccess):</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">production</span><span class="o">:</span>   <span class="nx">RewriteRule</span> <span class="p">(</span><span class="o">?:</span><span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">|</span><span class="nx">typo3</span><span class="o">/</span><span class="nx">sysext</span><span class="o">|</span><span class="nx">typo3</span><span class="o">/</span><span class="nx">ext</span><span class="p">)</span><span class="o">/</span><span class="p">[</span><span class="o">^/</span><span class="p">]</span><span class="o">+/</span><span class="p">(</span><span class="o">?:</span><span class="nx">Configuration</span><span class="o">|</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Private</span><span class="o">|</span><span class="nx">Tests</span><span class="o">?|</span><span class="nx">Documentation</span><span class="o">|</span><span class="nx">docs</span><span class="o">?</span><span class="p">)</span><span class="o">/</span> <span class="o">-</span> <span class="p">[</span><span class="nx">F</span><span class="p">]</span>
-<span class="nx">development</span><span class="o">:</span>  <span class="nx">RewriteRule</span> <span class="p">(</span><span class="o">?:</span><span class="nx">typo3conf</span><span class="o">/</span><span class="nx">ext</span><span class="o">|</span><span class="nx">typo3</span><span class="o">/</span><span class="nx">sysext</span><span class="o">|</span><span class="nx">typo3</span><span class="o">/</span><span class="nx">ext</span><span class="p">)</span><span class="o">/</span><span class="p">[</span><span class="o">^/</span><span class="p">]</span><span class="o">+/</span><span class="p">(</span><span class="o">?:</span><span class="nx">Configuration</span><span class="o">|</span><span class="nx">Resources</span><span class="o">/</span><span class="k">Private</span><span class="o">|</span><span class="nx">Tests</span><span class="o">?|</span><span class="nx">docs</span><span class="o">?</span><span class="p">)</span><span class="o">/</span> <span class="o">-</span> <span class="p">[</span><span class="nx">F</span><span class="p">]</span>
-</pre></div>
-</div>
-</div>
-</div>
-<div class="section" id="concept">
-<span id="id8"></span><h1>Concept<a class="headerlink" href="#concept" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="sips">
-<h2>SIPs<a class="headerlink" href="#sips" title="Permalink to this headline">¶</a></h2>
-<p>The following is a technical background information. Not needed to just use QFQ.</p>
-<p>The SIPs (=Server Id Pairs) are uniq timestamps, created/registered on the fly for a specific browser session (=user). Every SIP is
-registered on the server (= stored in a PHP Session) and contains one or more key/value pairs. The key/value pairs never leave
-the server. The SIPs will be used:</p>
-<ul class="simple">
-<li>to protect values not to be spoofed by anyone,</li>
-<li>to protect values not to be altered by anyone,</li>
-<li>to grant access, e.g.:<ul>
-<li>load and save forms,</li>
-<li>upload files,</li>
-<li>download files,</li>
-<li>PHP AJAX pages.</li>
-</ul>
-</li>
-</ul>
-<p>SIPs becomes invalid, as soon as the current browser session is destroyed. The client (= user) can&#8217;t manipulate the content
-of SIPs - it&#8217;s only possible to reuse already registered SIPs by the user, who already owns the session.</p>
-</div>
-<div class="section" id="access-privileges">
-<h2>Access privileges<a class="headerlink" href="#access-privileges" title="Permalink to this headline">¶</a></h2>
-<p>The Typo3 FE Groups can be used to implement access privileges. Such groups are assigned to</p>
-<ul class="simple">
-<li>Typo3 FE users,</li>
-<li>Typo3 pages,</li>
-<li>and/or Typo3 content records (e.g. QFQ records).</li>
-</ul>
-<p>This will be used for general page structure privileges.</p>
-<p>A <cite>record base</cite> privileges controlling (e.g. which user can edit
-which person record) will be implicit configured, by the way that records are viewable / editable (or not) through
-SQL in the specific QFQ tt-content statements.</p>
-</div>
-<div class="section" id="typo3-qfq-content-element">
-<h2>Typo3 QFQ content element<a class="headerlink" href="#typo3-qfq-content-element" title="Permalink to this headline">¶</a></h2>
-<p>Insert one or more QFQ content elements on a Typo3 page. Specify column and language per content record as wished.</p>
-<p>The title of the QFQ content element will not be rendered. It&#8217;s only visible in the backend for orientation.</p>
-<div class="section" id="qfq-keywords-bodytext">
-<h3>QFQ Keywords (Bodytext)<a class="headerlink" href="#qfq-keywords-bodytext" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="19%" />
-<col width="81%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Explanation</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>form</td>
-<td>Formname defined in ttcontent record bodytext
-- Fix. E.g.: <strong>form = person</strong>
-- by SIP: <strong>form = {{form}}</strong>
-- by SQL: <strong>form = {{SELECT c.form FROM conference AS c WHERE c.id={{a:C}} }}</strong></td>
-</tr>
-<tr class="row-odd"><td>r</td>
-<td>&lt;record id&gt; The form will load the record with the specified id
-- Variants: <strong>r = 123</strong>, by SQL: <strong>r = {{SELECT ...}}</strong>
-- If not specified, the default is &#8216;0&#8217;</td>
-</tr>
-<tr class="row-even"><td>&lt;level&gt;.db</td>
-<td>Select a DB. Only necessary if a different than the standard DB should be used.</td>
-</tr>
-<tr class="row-odd"><td>&lt;level&gt;.fbeg</td>
-<td>Start token for every field (=column)</td>
-</tr>
-<tr class="row-even"><td>&lt;level&gt;.fend</td>
-<td>End token for every field (=column)</td>
-</tr>
-<tr class="row-odd"><td>&lt;level&gt;.head</td>
-<td>Start token for whole &lt;level&gt;</td>
-</tr>
-<tr class="row-even"><td>&lt;level&gt;.tail</td>
-<td>End token for whole &lt;level&gt;</td>
-</tr>
-<tr class="row-odd"><td>&lt;level&gt;.rbeg</td>
-<td>Start token for row.</td>
-</tr>
-<tr class="row-even"><td>&lt;level&gt;.rbgd</td>
-<td>Alternating (per row) token</td>
-</tr>
-<tr class="row-odd"><td>&lt;level&gt;.rend</td>
-<td>End token for row. Will be rendered <strong>before</strong> subsequent levels are processed</td>
-</tr>
-<tr class="row-even"><td>&lt;level&gt;.renr</td>
-<td>End token for row. Will be rendered <strong>after</strong> subsequent levels are processed</td>
-</tr>
-<tr class="row-odd"><td>&lt;level&gt;.rsep</td>
-<td>Seperator token between rows</td>
-</tr>
-<tr class="row-even"><td>&lt;level&gt;.fsep</td>
-<td>Seperator token between fields (=columns)</td>
-</tr>
-<tr class="row-odd"><td>&lt;level&gt;.sql</td>
-<td>SQL Query</td>
-</tr>
-<tr class="row-even"><td>&lt;level&gt;.althead</td>
-<td>If &lt;level&gt;.sql is empty, these token will be rendered</td>
-</tr>
-<tr class="row-odd"><td>debugShowBodyText</td>
-<td>If=&#8216;1&#8217; and config.qfq.ini:<em>SHOW_DEBUG_INFO = yes</em>, shows a tooltip with bodytext</td>
-</tr>
-<tr class="row-even"><td>sqlLog</td>
-<td>Overwrites config.qfq.ini: <a class="reference internal" href="#sql-log">SQL_LOG</a> . Only affects <cite>Report</cite>, not <cite>Form</cite>.</td>
-</tr>
-<tr class="row-odd"><td>sqlLogMode</td>
-<td>Overwrites config.qfq.ini: <a class="reference internal" href="#sql-log-mode">SQL_LOG_MODE</a> . Only affects <cite>Report</cite>, not <cite>Form</cite>.</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-</div>
-<div class="section" id="debug">
-<span id="id9"></span><h3>Debug<a class="headerlink" href="#debug" title="Permalink to this headline">¶</a></h3>
-<p>File: <a class="reference internal" href="#id5">config.qfq.ini</a></p>
-<ul class="simple" id="sql-log">
-<li><em>SQL_LOG</em><ul>
-<li>Filename where to log SQL queries and statistical data.</li>
-<li>File is relative to the extension directory or absolute (starting with &#8216;/&#8217;).</li>
-<li>Content: SQL queries and timestamp, formName/formId, fe_user, success, affected rows, newly created record
-id&#8217;s and accessed from IP.</li>
-<li>The global setting can be overwritten by defining <cite>sqlLog</cite> inside of a QFQ tt-content record.</li>
-</ul>
-</li>
-</ul>
-<ul id="sql-log-mode">
-<li><p class="first"><em>SQL_LOG_MODE = all|modify|error|none</em></p>
-<ul class="simple">
-<li><em>all</em>: logs every SQL statement.</li>
-<li><em>modify</em>: logs only statements who might potentially change data.</li>
-<li><em>error</em>: logs only queries which generate SQL errors.</li>
-<li><em>none</em>: no query logging at all.</li>
-<li>The global setting can be overwritten by defining <cite>sqlLogMode</cite> inside of a QFQ tt-content record.</li>
-</ul>
-</li>
-<li><p class="first"><em>SHOW_DEBUG_INFO = [yes|no|auto],[download]</em></p>
-<p>If active, displays additional information in the Frontend (FE). This is typically helpful during development.</p>
-<ul>
-<li><p class="first"><em>yes</em>:</p>
-<ul>
-<li><p class="first">Form:</p>
-<ul class="simple">
-<li>For every internal link/button, show tooltips with decoded SIP on mouseover.</li>
-<li>Shows an &#8216;Edit form&#8217;-button (wrench symbol) on a form. The link points to the T3 page with the <a class="reference internal" href="#form-editor"><span class="std std-ref">FormEditor</span></a>.</li>
-</ul>
-</li>
-<li><p class="first">Report: Will be configured per tt-content record.</p>
-<p><em>debugShowBodyText = 1</em></p>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>no</em>: No debug info.</p>
-</li>
-<li><p class="first"><em>auto</em>: Depending if there is a Typo3 BE session, set internally:</p>
-<ul class="simple">
-<li><em>SHOW_DEBUG_INFO = yes</em>  (BE session exist)</li>
-<li><em>SHOW_DEBUG_INFO = no</em>   (no BE session)</li>
-</ul>
-</li>
-<li><p class="first"><em>download</em>:</p>
-<ul class="simple">
-<li>During a download (especially by using wkhtml), temporary files are not deleted automatically. Also the
-<cite>wkhtmltopdf</cite> and <cite>pdftk</cite> commandlines will be logged to <a class="reference internal" href="#sql-log">SQL_LOG</a>. Use this only to debug problems on download.</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-<ul class="simple" id="redirect-all-mail-to">
-<li><em>REDIRECT_ALL_MAIL_TO=john&#64;doe.com</em><ul>
-<li>During the development, it might be helpful to configure a &#8216;catch all&#8217; email address, which QFQ uses as the final receiver
-instead of the original intended one.</li>
-<li>The setting will:<ul>
-<li>Replace the &#8216;To&#8217; with the configured one.</li>
-<li>Clear &#8216;CC&#8217; and &#8216;Bcc&#8217;</li>
-<li>Write a note and the original configured receiver at the top of the email body.</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div class="section" id="databases">
-<span id="variables"></span><h2>Databases<a class="headerlink" href="#databases" title="Permalink to this headline">¶</a></h2>
-<p>A Typo3 / QFQ Installation needs at least two databases. One for the Typo3 installation and one for QFQ.</p>
-<p>QFQ itself can be separated in &#8216;QFQ system&#8217; and &#8216;QFQ data&#8217; databases, if necessary (than at least three databases are needed).
-Furthermore a <cite>Form</cite> can operate on any additional database, specified per <cite>Form</cite>.parameter.dbIndex and configured via <a class="reference internal" href="#id5">config.qfq.ini</a>.</p>
-<ul class="simple">
-<li>Option &#8216;A&#8217; is the most simple and commonly used.</li>
-<li>Option &#8216;B&#8217; separate the T3 and QFQ databases on two database hosts.</li>
-<li>Option &#8216;C&#8217; is like &#8216;B&#8217; but with a shared &#8216;QFQ data&#8217;-database between three &#8216;Typo3 / QFQ&#8217; instances.</li>
-<li>Further variants are possible.</li>
-</ul>
-<table border="1" class="docutils">
-<colgroup>
-<col width="2%" />
-<col width="13%" />
-<col width="11%" />
-<col width="24%" />
-<col width="23%" />
-<col width="27%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">&#160;</th>
-<th class="head">Domain</th>
-<th class="head">Website Host</th>
-<th class="head">T3</th>
-<th class="head">QFQ system</th>
-<th class="head">QFQ data</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>A</td>
-<td>standalone.edu</td>
-<td>&#8216;w&#8217;</td>
-<td colspan="3">&lt;dbHost&gt;, &lt;dbname&gt;_t3, &lt;dbnameSingle&gt;_db</td>
-</tr>
-<tr class="row-odd"><td>B</td>
-<td>appB1.edu</td>
-<td>&#8216;wApp&#8217;</td>
-<td>&lt;dbHostApp&gt;, &lt;dbnameB1&gt;_t3</td>
-<td colspan="2">&lt;dbHostB1&gt;, &lt;dbnameApp&gt;_db</td>
-</tr>
-<tr class="row-even"><td>B</td>
-<td>appB2.edu</td>
-<td>&#8216;wApp&#8217;</td>
-<td>&lt;dbHostApp&gt;, &lt;dbnameB2&gt;_t3</td>
-<td colspan="2">&lt;dbHostB2&gt;, &lt;dbnameApp&gt;_db</td>
-</tr>
-<tr class="row-odd"><td>C</td>
-<td>appC1.edu</td>
-<td>&#8216;wAppC&#8217;</td>
-<td>&lt;dbHostAppC&gt;, &lt;dbnameC1&gt;_t3</td>
-<td>&lt;dbHostC&gt;, &lt;dbnameSysC1&gt;_db</td>
-<td>&lt;dbHostData&gt;_db, &lt;dbNameData&gt;_db</td>
-</tr>
-<tr class="row-even"><td>C</td>
-<td>appC2.edu</td>
-<td>&#8216;wAppC&#8217;</td>
-<td>&lt;dbHostAppC&gt;, &lt;dbnameC2&gt;_t3</td>
-<td>&lt;dbHostC&gt;, &lt;dbnameSysC2&gt;_db</td>
-<td>&lt;dbHostData&gt;_db, &lt;dbNameData&gt;_db</td>
-</tr>
-<tr class="row-odd"><td>C</td>
-<td>appC3.edu</td>
-<td>&#8216;wAppC3&#8217;</td>
-<td>&lt;dbHostAppC3&gt;, &lt;dbnameC3&gt;_t3</td>
-<td>&lt;dbHostC3&gt;, &lt;dbnameSysC3&gt;_db</td>
-<td>&lt;dbHostData&gt;_db, &lt;dbNameData&gt;_db</td>
-</tr>
-</tbody>
-</table>
-<p>In <a class="reference internal" href="#id5">config.qfq.ini</a> mutliple database credentials can be prepared. Mandatory is at least one credential setup like
-<cite>DB_1_USER</cite>, <cite>DB_1_SERVER</cite>, <cite>DB_1_PASSWORD</cite>, <cite>DB_1_NAME</cite>. The number &#8216;1&#8217; indicates the <cite>dbIndex</cite>. Increment the number
-to specify further database credential setups.</p>
-<p>Often the <cite>DB_1_xxx</cite> is identically to the used Typo3 database credentials.</p>
-<p>If not explicit specified, &#8216;QFQ system&#8217; and &#8216;QFQ database&#8217; will use the same database with the same credentials (setup &#8216;A&#8217;).</p>
-<p>To define separate &#8216;QFQ data&#8217; and &#8216;QFQ system&#8217;, in <a class="reference internal" href="#id5">config.qfq.ini</a> define  <cite>DB_1_USER</cite>, ... (e.g. &#8216;QFQ data&#8217;) and <cite>DB_2_USER</cite>,
-... (e.g. &#8216;QFQ system&#8217;) and specify the assignment:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">DB_INDEX_DATA</span> <span class="o">=</span> <span class="mi">1</span>
-<span class="nx">DB_INDEX_QFQ</span> <span class="o">=</span> <span class="mi">2</span>
-</pre></div>
-</div>
-<p>To let a form operate (show, load and save) on a different database, use <cite>Form.parameter.dbIndexData</cite> (see <a class="reference internal" href="#form-parameter">form-parameter</a>).</p>
-<div class="section" id="different-qfq-versions-shared-database">
-<h3>Different QFQ versions, shared database<a class="headerlink" href="#different-qfq-versions-shared-database" title="Permalink to this headline">¶</a></h3>
-<p>When using different QFQ versions and a shared &#8216;QFQ data&#8217;-database, there is some risk of conflicting
-&#8216;QFQ system&#8217; tables. Best is to always use the same QFQ version on all instances.</p>
-</div>
-</div>
-</div>
-<div class="section" id="variable">
-<h1>Variable<a class="headerlink" href="#variable" title="Permalink to this headline">¶</a></h1>
-<p>Most elements of a Form, FormElement or Report might contain (QFQ) variables. Such variables are surrounded by
-double curly braces. Three different types of functionality are provided. Access to:</p>
-<ul class="simple">
-<li><a class="reference internal" href="#store-variables">store-variables</a></li>
-<li><a class="reference internal" href="#sql-variables">sql-variables</a></li>
-<li><a class="reference internal" href="#column-variables">column-variables</a></li>
-</ul>
-<p>Some examples, including nesting:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># Store</span>
-<span class="c1">#---------------------------------------------</span>
-<span class="p">{{</span><span class="nx">r</span><span class="p">}}</span>
-<span class="p">{{</span><span class="nx">index</span><span class="o">:</span><span class="nx">FS</span><span class="p">}}</span>
-<span class="p">{{</span><span class="nx">name</span><span class="o">:</span><span class="nx">FS</span><span class="o">:</span><span class="nx">alnumx</span><span class="o">:</span><span class="nx">s</span><span class="p">}}</span>
-
-<span class="c1"># SQL</span>
-<span class="c1">#---------------------------------------------</span>
-<span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="mi">1234</span><span class="p">}}</span>
-
-<span class="c1"># Columns</span>
-<span class="c1">#---------------------------------------------</span>
-<span class="p">{{</span><span class="mf">10.</span><span class="nx">pId</span><span class="p">}}</span>
-<span class="p">{{</span><span class="mf">10.20</span><span class="o">.</span><span class="nx">pId</span><span class="p">}}</span>
-
-<span class="c1"># Nesting</span>
-<span class="c1">#---------------------------------------------</span>
-<span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">r</span><span class="p">}}</span> <span class="p">}}</span>
-<span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">key1</span><span class="o">:</span><span class="nx">C</span><span class="o">:</span><span class="nx">alnumx</span><span class="p">}}</span> <span class="p">}}</span> <span class="c1"># explained below</span>
-<span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span> <span class="nx">FROM</span> <span class="nx">pf</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span> <span class="p">}}</span> <span class="c1"># it&#39;s more efficient to use only one query</span>
-</pre></div>
-</div>
-<p>Leading and trailing spaces inside curly braces are removed.</p>
-<blockquote>
-<div><ul class="simple">
-<li><em>{{ SELECT &#8220;Hello World&#8221;   }}</em> becomes <em>{{SELECT &#8220;Hello World&#8221;}}</em></li>
-<li><em>{{ varname   }}</em> becomes <em>{{varname}}</em></li>
-</ul>
-</div></blockquote>
-<div class="section" id="types">
-<h2>Types<a class="headerlink" href="#types" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="store-variables">
-<span id="id10"></span><h3>Store variables<a class="headerlink" href="#store-variables" title="Permalink to this headline">¶</a></h3>
-<p>Syntax:  <em>{{VarName[:&lt;store / prio&gt;[:&lt;sanitize class&gt;[:&lt;escape&gt;]]]}}</em></p>
-<ul>
-<li><p class="first">Example:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="nx">pId</span><span class="p">}}</span>
-<span class="p">{{</span><span class="nx">pId</span><span class="o">:</span><span class="nx">FSE</span><span class="p">}}</span>
-<span class="p">{{</span><span class="nx">pId</span><span class="o">:</span><span class="nx">FSE</span><span class="o">:</span><span class="nx">digit</span><span class="p">}}</span>
-<span class="p">{{</span><span class="nx">name</span><span class="o">:</span><span class="nx">FSE</span><span class="o">:</span><span class="nx">alnumx</span><span class="o">:</span><span class="nx">m</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first">Zero or more stores might be specified to be searched for the given VarName.</p>
-</li>
-<li><p class="first">If no store is specified, the by default searched stores are: <strong>FSRVD</strong> (=FORM &gt; SIP &gt; RECORD &gt; VARS &gt; DEFAULT).</p>
-</li>
-<li><p class="first">If the VarName is not found in one store, the next store is searched,  up to the last specified store.</p>
-</li>
-<li><p class="first">If the VarName is not found in any store, nothing is replaced - the string &#8216;{{&lt;VarName&gt;}}&#8217; remains.</p>
-</li>
-<li><p class="first">If anywhere along the line an empty string is found, this <strong>is</strong> a value: therefore, the search will stop.</p>
-</li>
-</ul>
-<p>See also:</p>
-<blockquote>
-<div><ul class="simple">
-<li><a class="reference internal" href="#store">store</a></li>
-<li><a class="reference internal" href="#variable-escape">variable-escape</a></li>
-<li><a class="reference internal" href="#sanitize-class">sanitize-class</a></li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="sql-variables">
-<span id="id11"></span><h3>SQL variables<a class="headerlink" href="#sql-variables" title="Permalink to this headline">¶</a></h3>
-<ul>
-<li><p class="first">The detection of an SQL command is case <em>insensitive</em>.</p>
-</li>
-<li><p class="first">Leading  whitespace will be skipped.</p>
-</li>
-<li><p class="first">The following commands are interpreted as SQL commands:</p>
-<ul class="simple">
-<li>SELECT</li>
-<li>INSERT, UPDATE, DELETE, REPLACE, TRUNCATE</li>
-<li>SHOW, DESCRIBE, EXPLAIN, SET</li>
-</ul>
-</li>
-<li><p class="first">A SQL Statement might contain parameters, including additional SQL statements. Inner SQL queries will be executed first.</p>
-</li>
-<li><p class="first">All variables will be substituted one by one from inner to outer.</p>
-</li>
-<li><p class="first">The number of variables inside an input field or a SQL statement is not limited.</p>
-</li>
-<li><p class="first">A resultset of a SQL statement will be imploded over all: concat all columns of a row, concat all rows - there is no glue string.</p>
-</li>
-<li><p class="first">Example:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span><span class="p">,</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">Person</span><span class="p">}}</span>
-<span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="k">IF</span><span class="p">({{</span><span class="nx">feUser</span><span class="p">}}</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="s1">&#39;Yes&#39;</span><span class="p">,</span><span class="s1">&#39;No&#39;</span><span class="p">)</span>  <span class="nx">FROM</span> <span class="nx">Person</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">r</span><span class="o">:</span><span class="nx">S</span><span class="p">}}</span> <span class="p">}}</span>
-<span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span><span class="p">,</span> <span class="nx">city</span> <span class="nx">FROM</span> <span class="nx">Address</span> <span class="k">AS</span> <span class="nx">adr</span> <span class="nx">WHERE</span> <span class="nx">adr</span><span class="o">.</span><span class="nx">accId</span><span class="o">=</span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span> <span class="nx">FROM</span> <span class="nx">Account</span> <span class="k">AS</span> <span class="nx">acc</span> <span class="nx">WHERE</span> <span class="nx">acc</span><span class="o">.</span><span class="nx">name</span><span class="o">=</span><span class="p">{{</span><span class="nx">feUser</span><span class="p">}}</span> <span class="p">}}</span> <span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first">Special case for <cite>SELECT</cite> input fields and FormElement.type=action <cite>sqlValidate</cite>. To deliver a result array specify an &#8216;!&#8217; before the SELECT:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="o">!</span><span class="nx">SELECT</span> <span class="o">...</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</div>
-<div class="section" id="column-variables">
-<span id="id12"></span><h3>Column variables<a class="headerlink" href="#column-variables" title="Permalink to this headline">¶</a></h3>
-<p>Syntax:  <em>{{&lt;level&gt;.&lt;column&gt;}}</em></p>
-<p>Only used in report to access outer columns. See <a class="reference internal" href="#access-column-values">access-column-values</a> and <a class="reference internal" href="#syntax-of-report">syntax-of-report</a>.</p>
-<p>There might be name conflicts between VarName / SQL keywords and &lt;line identifier&gt;. QFQ checks first for &#8216;&lt;level&gt;&#8217;,
-than for &#8216;SQL keywords&#8217; and than for &#8216;VarNames&#8217; in stores.</p>
-<p>All types might be nested with each other. There is no limit of nesting variables.</p>
-<p>Very specific: Also, it&#8217;s possible that the content of a variable is again (including curly braces) a variable - this
-is sometimes used in text templates, where the template is retrieved from a record and
-specific locations in the text will be (automatically by QFQ) replaced by values from other sources.</p>
-</div>
-</div>
-<div class="section" id="sanitize-class">
-<span id="id13"></span><h2>Sanitize class<a class="headerlink" href="#sanitize-class" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>If a value violates a parameter sanitize class, the value becomes an empty string.</li>
-<li>Per store there is a default if sanitizing applies and if yes, which class.<ul>
-<li>Store <em>C</em> (Client=Browser) and store <em>F</em> (Form) will be sanitized with &#8216;digit&#8217;.</li>
-</ul>
-</li>
-<li>All <a class="reference internal" href="#predefined-variable-names">predefined-variable-names</a> have a specific default sanitize class. For these variables, it&#8217;s not necessary
-to specify a sanitize class.</li>
-<li>All other variables (Store: C, F) get by default the sanitize class defined in the corresponding form. If not defined,
-the default class is &#8216;digit&#8217;.</li>
-<li>A default sanitize class can be overwritten by individual definition: <em>{{a:C:all}}</em></li>
-<li>If there is a sanitized class specified, it applies to all given stores.</li>
-</ul>
-<p>For QFQ variables and FormElements:</p>
-<table border="1" class="docutils">
-<colgroup>
-<col width="15%" />
-<col width="5%" />
-<col width="6%" />
-<col width="74%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Form</th>
-<th class="head">Query</th>
-<th class="head">Pattern</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td><strong>alnumx</strong></td>
-<td>Form</td>
-<td>Query</td>
-<td>[A-Za-z][0-9]&#64;-_.,;: /() ÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜŸäëïöüÿç</td>
-</tr>
-<tr class="row-odd"><td><strong>digit</strong></td>
-<td>Form</td>
-<td>Query</td>
-<td>[0-9]</td>
-</tr>
-<tr class="row-even"><td><strong>numerical</strong></td>
-<td>Form</td>
-<td>Query</td>
-<td>[0-9.-+]</td>
-</tr>
-<tr class="row-odd"><td><strong>allbut</strong></td>
-<td>Form</td>
-<td>Query</td>
-<td>All characters allowed, but not [ ]  { } % &amp; #. The used regexp: &#8216;^[^[]{}%&amp;\#]+$&#8217;,</td>
-</tr>
-<tr class="row-even"><td><strong>all</strong></td>
-<td>Form</td>
-<td>Query</td>
-<td>no sanitizing</td>
-</tr>
-</tbody>
-</table>
-<p>Only in FormElement:</p>
-<table border="1" class="docutils">
-<colgroup>
-<col width="15%" />
-<col width="5%" />
-<col width="6%" />
-<col width="74%" />
-</colgroup>
-<tbody valign="top">
-<tr class="row-odd"><td><strong>email</strong></td>
-<td>Form</td>
-<td>Query</td>
-<td>[a-zA-Z0-9._%+-]+&#64;[a-zA-Z0-9.-]+.[a-zA-Z]{2,}</td>
-</tr>
-<tr class="row-even"><td><strong>min|max</strong></td>
-<td>Form</td>
-<td>&#160;</td>
-<td>Compares the value against an lower and upper limit (numeric or string).</td>
-</tr>
-<tr class="row-odd"><td><strong>min|max date</strong></td>
-<td>Form</td>
-<td>&#160;</td>
-<td>Compares the value against an lower and upper date or datetime.</td>
-</tr>
-<tr class="row-even"><td><strong>pattern</strong></td>
-<td>Form</td>
-<td>&#160;</td>
-<td>Compares the value against a regexp.</td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="section" id="escape">
-<span id="variable-escape"></span><h2>Escape<a class="headerlink" href="#escape" title="Permalink to this headline">¶</a></h2>
-<p>Variables used in SQL Statements might cause trouble by using: NUL (ASCII 0), \n, \r, \, &#8216;, &#8221;, and Control-Z.</p>
-<p>To protect the web application the following <cite>escape</cite> types are available:</p>
-<blockquote>
-<div><ul class="simple">
-<li>&#8216;m&#8217; - <a class="reference external" href="http://php.net/manual/en/mysqli.real-escape-string.php">real_escape_string()</a> (m = mysql)</li>
-<li>&#8216;l&#8217; - LDAP search filter values will be escaped: <a class="reference external" href="http://php.net/manual/en/function.ldap-escape.php">ldap-escape()</a> (LDAP_ESCAPE_FILTER).</li>
-<li>&#8216;L&#8217; - LDAP DN values will be escaped. <a class="reference external" href="http://php.net/manual/en/function.ldap-escape.php">ldap-escape()</a> (LDAP_ESCAPE_DN).</li>
-<li>&#8216;s&#8217; - single ticks will be escaped. str_replace() of &#8216; against \&#8217;.</li>
-<li>&#8216;d&#8217; - double ticks will be escaped: str_replace() of &#8221; against \&#8221;.</li>
-<li>&#8216;-&#8216; - no escaping.</li>
-</ul>
-</div></blockquote>
-<ul class="simple">
-<li>The <cite>escape</cite> type is defined by the fourth parameter of the variable. E.g.: <cite>{{name:FE:alnumx:m}}</cite> (m = mysql).</li>
-<li>It&#8217;s possible to combine different <cite>escape</cite> types, they will be processed in the order given. E.g. <cite>{{name:FE:alnumx:Ls}}</cite> (L, s).</li>
-<li>Escaping is typically necessary for SQL or LDAP queries.</li>
-<li>Be careful when escaping nested variables. Best is to escape <strong>only</strong> the most outer variable.</li>
-<li>In <a class="reference internal" href="#id5">config.qfq.ini</a> a global <cite>ESCAPE_TYPE_DEFAULT</cite> can be defined. The configured escape type applies to all substituted
-variables, who <em>do not</em> contain a <em>specific</em> escape type.</li>
-<li>Additionally a <cite>defaultEscapeType</cite> can be defined per <cite>Form</cite> (separate field in the <em>Form editor</em>). This overwrites the
-global definition of <cite>config.qfq.ini</cite>. By default, every <cite>Form.defaultEscapeType</cite> = &#8216;c&#8217; (=config), which means the setting
-in <a class="reference internal" href="#id5">config.qfq.ini</a>.</li>
-<li>To suppress a default escape type, define the <cite>escape type</cite> = &#8216;-&#8216; on the specific variable. E.g.: <cite>{{name:FE:alnumx:-}}</cite>.</li>
-</ul>
-</div>
-</div>
-<div class="section" id="security">
-<h1>Security<a class="headerlink" href="#security" title="Permalink to this headline">¶</a></h1>
-<p>All values passed to QFQ will be:</p>
-<ul class="simple">
-<li>Checked against max. length and allowed content, on the client and on the server side. On the server side, the check
-happens before any further processing. The &#8216;length&#8217; and &#8216;allowed&#8217; content is specified per <cite>FormElement</cite>. &#8216;alnumx&#8217; is the
-default allowed content for those. Violating the rules will stop the &#8216;save record&#8217; process (Form) or result in an empty value (Report).</li>
-<li>Only elements defined in the <cite>Form</cite> definition or requested by <cite>Report</cite> will be processed.</li>
-<li>UTF8 normalized (normalizer::normalize) to unify different ways of composing characters. It&#8217;s more a database interest
-to work with unified data.</li>
-</ul>
-<p>SQL statements are typically fired as <cite>prepared statements</cite> with separated variables.
-Further <em>custom</em> SQL statements will be defined by the webmaster - those do not use <cite>prepared statements</cite> and might be
-affected by SQL injection. To prevent SQL injection, every variable can be escaped with <cite>mysqli::real_escape_string</cite> by
-defining the <cite>escape</cite> modifier <cite>m</cite>.</p>
-<p><strong>QFQ notice</strong>:</p>
-<ul class="simple">
-<li>Variables passed by the client (=Browser) are untrusted and use the default sanitize class &#8216;digit&#8217; (if nothing else is
-specified). If alpha characters are submitted, the content violates <cite>digit</cite> and becomes therefore empty - there is no
-error message. Best is to always use SIP or digits.</li>
-</ul>
-<div class="section" id="get-parameter">
-<h2>Get Parameter<a class="headerlink" href="#get-parameter" title="Permalink to this headline">¶</a></h2>
-<p><strong>QFQ security restriction</strong>:</p>
-<ul class="simple">
-<li>GET parameter might contain urlencoded content (%xx). Therefore all GET parameter will be processed by &#8216;urldecode()&#8217;.
-As a result a text like &#8216;%nn&#8217; in GET variables will always be decoded. It&#8217;s not possible to transfer &#8216;%nn&#8217; itself.</li>
-<li>GET variables are limited to SECURITY_GET_MAX_LENGTH chars - any violation will stop QFQ.</li>
-</ul>
-</div>
-<div class="section" id="post-parameter">
-<h2>Post Parameter<a class="headerlink" href="#post-parameter" title="Permalink to this headline">¶</a></h2>
-<p>Per <cite>FormElement</cite> (HTML input) the default is to <cite>htmlspecialchars()</cite> the input. This means &amp;&lt;&gt;&#8217;&#8221; will be encoded as htmlentity
-and saved as a htmlentity in the database. In case any of these characters (e.g. for HTML tags) are
-required, the encoding can be disabled per FormElement: <cite>encode=none</cite> (default is <cite>specialchar</cite>).</p>
-<p>During Form load, htmlentities are decoded again.</p>
-</div>
-<div class="section" id="server">
-<h2>$_SERVER<a class="headerlink" href="#server" title="Permalink to this headline">¶</a></h2>
-<p>All $_SERVER vars are htmlentities encoded (all, not only specialchars!) .</p>
-</div>
-<div class="section" id="honeypot">
-<h2>Honeypot<a class="headerlink" href="#honeypot" title="Permalink to this headline">¶</a></h2>
-<p>Every QFQ Form contains &#8216;honeypot&#8217;-HTML input elements (HTML: hidden &amp; readonly). Which of them to use is configured in
-<a class="reference internal" href="#id5">config.qfq.ini</a> (default:   &#8216;username&#8217;, &#8216;password&#8217; and &#8216;email&#8217;). On every start of QFQ (form, report, save, ...),
-these variables are tested if they are non-empty. In such a case a probably malicous bot has send the request and the
-request will not be processed.</p>
-<p>If any of the default configured variable names are needed (which will never be the case for QFQ), an explicit variable name
-list have to be configured in <a class="reference internal" href="#id5">config.qfq.ini</a>.</p>
-<p><strong>QFQ security restriction</strong>:</p>
-<ul class="simple">
-<li>The honeypot variables can&#8217;t be used in GET or POST as regular HTML input elements - any values of them will terminate QFQ.</li>
-</ul>
-</div>
-<div class="section" id="violation">
-<h2>Violation<a class="headerlink" href="#violation" title="Permalink to this headline">¶</a></h2>
-<p>On any violation, QFQ will sleep SECURITY_ATTACK_DELAY seconds (<a class="reference internal" href="#id5">config.qfq.ini</a>) and than exit the running PHP process.
-A detected attack leads to a complete white (=empty) page.</p>
-<p>If SECURITY_SHOW_MESSAGE = true (<a class="reference internal" href="#id5">config.qfq.ini</a>), at least a message is displayed after the delay.</p>
-</div>
-<div class="section" id="client-parameter-via-sip">
-<h2>Client Parameter via SIP<a class="headerlink" href="#client-parameter-via-sip" title="Permalink to this headline">¶</a></h2>
-<p>Links with URL parameters, targeting to the local website, are typically SIP encoded. Instead of transferring the parameter
-as part of the URL, only one uniqe GET parameter &#8216;s&#8217; is appended at the link. The parameter &#8216;s&#8217; is uniq (equal to a
-timestamp) for the user. Assigned variables are stored as a part of the PHP user session on the server.
-Two users might have the same value of parameter &#8216;s&#8217;, but the content is completely independet.</p>
-<p>Variables needed by Typo3 remains on the link and are not &#8216;sip-encoded&#8217;.</p>
-</div>
-<div class="section" id="secure-direct-fileaccess">
-<span id="securedirectfileaccess"></span><h2>Secure direct fileaccess<a class="headerlink" href="#secure-direct-fileaccess" title="Permalink to this headline">¶</a></h2>
-<p>If the application uploads files, mostly it&#8217;s not necessary and often a security issue, to offer a direct download of
-the uploaded files. Best is to create a directory, e.g. <cite>fileadmin/protected</cite> and deny direct access via webbrowser to it.
-E.g. for Apache set a htaccess rule:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">Directory</span> <span class="s2">&quot;/var/www/html/fileadmin/protected&quot;</span><span class="o">&gt;</span>
-        <span class="k">Require</span> <span class="nx">all</span> <span class="nx">denied</span>
-<span class="o">&lt;/</span><span class="nx">Directory</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-<p><strong>Important</strong>: all QFQ uploads should then save files in or below such a directory.</p>
-<p>To offer download of those files, use the reserved columnname &#8216;_download&#8217;:<a class="reference internal" href="#download">download</a> or variants.</p>
-<p><strong>Important</strong>: To protect the installation against executing of uploaded malicious script code, disable PHP for the final upload
-directory. E.g. <cite>fileadmin</cite>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">Directory</span> <span class="s2">&quot;/var/www/html/fileadmin&quot;</span><span class="o">&gt;</span>
-        <span class="nx">php_admin_flag</span> <span class="nx">engine</span> <span class="nx">Off</span>
-<span class="o">&lt;/</span><span class="nx">Directory</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-<p>This is in general a good security improvement for directories with user supplied content.</p>
-</div>
-<div class="section" id="file-upload">
-<h2>File upload<a class="headerlink" href="#file-upload" title="Permalink to this headline">¶</a></h2>
-<p>By default the mime type of every uploaded file is checked against a whitelist of allowed mime types. The mime type of
-a file can be (easily) faked by an attacker. This check is good to handle regular user file upload for specific file types. To
-prevent attacks against uploading and executing malicous code this won&#8217;t help.</p>
-<p>Instead prohibit the execution of user contributed files by the webserver config (<a class="reference internal" href="#securedirectfileaccess">SecureDirectFileAccess</a>).</p>
-</div>
-</div>
-<div class="section" id="store">
-<span id="id15"></span><h1>Store<a class="headerlink" href="#store" title="Permalink to this headline">¶</a></h1>
-<p>Only variables that are known in a specified store can be substituted.</p>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="3%" />
-<col width="52%" />
-<col width="45%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Description</th>
-<th class="head">Content</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>F</td>
-<td><a class="reference internal" href="#store-form"><span class="std std-ref">Store: FORM - F</span></a>: data not saved in database yet.</td>
-<td>All native <em>FormElements</em>. Recent values from the Browser.</td>
-</tr>
-<tr class="row-odd"><td>S</td>
-<td><a class="reference internal" href="#store-sip"><span class="std std-ref">Store: SIP - S</span></a>: Client parameter &#8216;s&#8217; will indicate the current SIP, which will be
-loaded from the SESSION repo to the SIP-Store.</td>
-<td>sip, r (recordId), form</td>
-</tr>
-<tr class="row-even"><td>R</td>
-<td><a class="reference internal" href="#store-record"><span class="std std-ref">Store: RECORD - R</span></a>: Record - the current record loaded in the form</td>
-<td>All columns of the current record from the current table</td>
-</tr>
-<tr class="row-odd"><td>B</td>
-<td><a class="reference internal" href="#store-before"><span class="std std-ref">Store: BEFORE - B</span></a>: Record - the current record loaded in the form before any update</td>
-<td>All columns of the current record from the current table</td>
-</tr>
-<tr class="row-even"><td>P</td>
-<td>Parent record. E.g.: on multi &amp; copy forms the current record of the outer query,</td>
-<td>All columns of the MultiSQL Statement from the table for the current row</td>
-</tr>
-<tr class="row-odd"><td>D</td>
-<td>Default values column : The <em>table.column</em> specified <em>default value</em>.</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>M</td>
-<td>Column type: The <em>table.column</em> specified <em>type</em></td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>C</td>
-<td><a class="reference internal" href="#store-client"><span class="std std-ref">Store: CLIENT - C</span></a>: POST variable, if not found: GET variable</td>
-<td>Parameter sent from the Client (=Browser).</td>
-</tr>
-<tr class="row-even"><td>T</td>
-<td><a class="reference internal" href="#store-typo3"><span class="std std-ref">Store: TYPO3 (Bodytext) - T</span></a>: a) Bodytext (ttcontent record), b) Typo3 internal variables</td>
-<td>See Typo3 tt_content record configuration</td>
-</tr>
-<tr class="row-odd"><td>V</td>
-<td><a class="reference internal" href="#store-vars"><span class="std std-ref">Store: VARS - V</span></a>: Generic variables</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>L</td>
-<td><a class="reference internal" href="#store-ldap"><span class="std std-ref">Store: LDAP - L</span></a>: Will be filled on demand during processing of a <em>FormElement</em></td>
-<td>Custom specified list of LDAP attributes</td>
-</tr>
-<tr class="row-odd"><td>0</td>
-<td><em>Zero</em> - allways value: 0, might be helpful if a variable is empty or undefined and
-will be used in an SQL statement.</td>
-<td>Any key</td>
-</tr>
-<tr class="row-even"><td>E</td>
-<td><em>Empty</em> - allways an empty string, might be helpful if a variable is empty or undefined
-and will be used in an SQL statement</td>
-<td>Any key</td>
-</tr>
-<tr class="row-odd"><td>Y</td>
-<td><a class="reference internal" href="#store-system"><span class="std std-ref">Store: SYSTEM - Y</span></a>: a) Database, b) helper vars for logging/debugging:
-SYSTEM_SQL_RAW ... SYSTEM_FORM_ELEMENT_COLUMN, c) Any custom fields: CONTACT, HELP, ...</td>
-<td>&#160;</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-<ul class="simple">
-<li>Default <em>&lt;prio&gt;</em>: <em>FSRVD</em> - Form / SIP / Record / Vars / Table definition.</li>
-<li>Hint: Preferable, parameter should be submitted by SIP, not by Client (=URL).<ul>
-<li>Warning: Data submitted via &#8216;Client&#8217; can be easily spoofed and altered.</li>
-<li>Best: Data submitted via SIP never leaves the server, cannot be spoofed or altered by the user.</li>
-<li>SIPs can _only_ be defined by using <em>Report</em>. Inside of <em>Report</em> use columns &#8216;Link&#8217; (with attribute &#8216;s&#8217;), &#8216;page?&#8217; or &#8216;Page?&#8217;.</li>
-</ul>
-</li>
-</ul>
-<div class="section" id="predefined-variable-names">
-<span id="id16"></span><h2>Predefined variable names<a class="headerlink" href="#predefined-variable-names" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="store-form-f">
-<span id="store-form"></span><h3>Store: <em>FORM</em> - F<a class="headerlink" href="#store-form-f" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Sanitized: <em>yes</em></li>
-<li>Represents the values in the form, typically before saving them.</li>
-<li>Used for:<ul>
-<li><em>FormElements</em> who will be rerendered, after a parent <em>FormElement</em> has been changed by the user.</li>
-<li><em>FormElement</em> actions, before saving the form.</li>
-<li>Values will be sanitized by the class configured in corresponding the <em>FormElement</em>. By default, the sanitize class is <cite>alnumx</cite>.</li>
-</ul>
-</li>
-</ul>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="19%" />
-<col width="81%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Explanation</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>&lt;FormElement name&gt;</td>
-<td>Name of native <em>FormElement</em>. To get, exactly and only, the specified <em>FormElement</em> (for &#8216;pId&#8217;): <em>{{pId:F}}</em></td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-</div>
-<div class="section" id="store-sip-s">
-<span id="store-sip"></span><h3>Store: <em>SIP</em> - S<a class="headerlink" href="#store-sip-s" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Sanitized: <em>no</em></li>
-<li>Filled automatically by creating links. E.g.:<ul>
-<li>in <cite>Report</cite> by using <cite>_page?</cite> or <cite>_link</cite> (with active &#8216;s&#8217;)</li>
-<li>in <cite>Form</cite> by using subrecords: &#8216;new&#8217;, &#8216;edit&#8217;, &#8216;delete&#8217; links (system) or by column type <cite>_page?</cite>, <cite>_link</cite>.</li>
-</ul>
-</li>
-</ul>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="30%" />
-<col width="70%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Explanation</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>sip</td>
-<td>13 char uniqid</td>
-</tr>
-<tr class="row-odd"><td>r</td>
-<td>current record id</td>
-</tr>
-<tr class="row-even"><td>form</td>
-<td>current form name</td>
-</tr>
-<tr class="row-odd"><td>table</td>
-<td>current table name</td>
-</tr>
-<tr class="row-even"><td>urlparam</td>
-<td>all non Typo3 paramter in one string</td>
-</tr>
-<tr class="row-odd"><td>&lt;user defined&gt;</td>
-<td>additional user defined link parameter</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-</div>
-<div class="section" id="store-record-r">
-<span id="store-record"></span><h3>Store: <em>RECORD</em> - R<a class="headerlink" href="#store-record-r" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Sanitized: <em>no</em></li>
-<li>Current record loaded in Form.</li>
-<li>If r=0, all values are empty.</li>
-</ul>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="14%" />
-<col width="86%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Explanation</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>&lt;column name&gt;</td>
-<td>Name of a column of the primary table (as defined in the current form). To get, exactly and only, the specified form <em>FormElement</em>: <em>{{pId:R}}</em></td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-</div>
-<div class="section" id="store-before-b">
-<span id="store-before"></span><h3>Store: <em>BEFORE</em> - B<a class="headerlink" href="#store-before-b" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Sanitized: <em>no</em></li>
-<li>Current record loaded in Form without any modification.</li>
-<li>If r=0, all values are empty.</li>
-</ul>
-<p>This store is handy to compare new and old values of a form.</p>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="14%" />
-<col width="86%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Explanation</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>&lt;column name&gt;</td>
-<td>Name of a column of the primary table (as defined in the current form). To get, exactly and only, the specified form <em>FormElement</em>: <em>{{pId:R}}</em></td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-</div>
-<div class="section" id="store-client-c">
-<span id="store-client"></span><h3>Store: <em>CLIENT</em> - C<a class="headerlink" href="#store-client-c" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Sanitized: <em>yes</em></li>
-</ul>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="15%" />
-<col width="85%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Explanation</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>s</td>
-<td>=SIP</td>
-</tr>
-<tr class="row-odd"><td>r</td>
-<td>record id. Typically stored in SIP, rarely specified on the URL</td>
-</tr>
-<tr class="row-even"><td>keySemId</td>
-<td>always current Semester Id</td>
-</tr>
-<tr class="row-odd"><td>keySemIdUser</td>
-<td><em>{{keySemIdUser}}</em>, may be changed by user</td>
-</tr>
-<tr class="row-even"><td>HTTP_HOST</td>
-<td>current HTTP HOST</td>
-</tr>
-<tr class="row-odd"><td>REMOTE_ADDR</td>
-<td>Client IP address</td>
-</tr>
-<tr class="row-even"><td>&#8216;$_SERVER[*]&#8217;</td>
-<td>All other variables accessable by <em>$_SERVER[]</em>. Only the often used have a pre-defined sanitize class.</td>
-</tr>
-<tr class="row-odd"><td>form</td>
-<td>Unique name of current form</td>
-</tr>
-<tr class="row-even"><td>ANREDE</td>
-<td><em>{{sex}}</em> == male &gt;&gt; Sehr geehrter Herr, <em>{{sex}}</em> == female  Sehr geehrte Frau</td>
-</tr>
-<tr class="row-odd"><td>EANREDE</td>
-<td><em>{{sex}}</em> == male &gt;&gt; Dear Mr., <em>{{sex}}</em> == female &gt;&gt; Dear Mrs.</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-</div>
-<div class="section" id="store-typo3-bodytext-t">
-<span id="store-typo3"></span><h3>Store: <em>TYPO3</em> (Bodytext) - T<a class="headerlink" href="#store-typo3-bodytext-t" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Sanitized: <em>no</em></li>
-</ul>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="25%" />
-<col width="66%" />
-<col width="10%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Explanation</th>
-<th class="head">Note</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>form</td>
-<td><p class="first">Formname defined in ttcontent record bodytext</p>
-<ul class="last simple">
-<li>Fix. E.g. <em>form = person</em></li>
-<li>via SIP. E.g. <em>form = {{form}}</em></li>
-</ul>
-</td>
-<td>see note</td>
-</tr>
-<tr class="row-odd"><td>pageId</td>
-<td>Record id of current Typo3 page</td>
-<td>see note</td>
-</tr>
-<tr class="row-even"><td>pageAlias</td>
-<td>Alias of current Typo3 page</td>
-<td>see note</td>
-</tr>
-<tr class="row-odd"><td>pageTitle</td>
-<td>Title of current Typo3 page</td>
-<td>see note</td>
-</tr>
-<tr class="row-even"><td>pageType</td>
-<td>Current selected page type (typically URL parameter &#8216;type&#8217;)</td>
-<td>see note</td>
-</tr>
-<tr class="row-odd"><td>pageLanguage</td>
-<td>Current selected page language (typically URL parameter &#8216;L&#8217;)</td>
-<td>see note</td>
-</tr>
-<tr class="row-even"><td>ttcontentUid</td>
-<td>Record id of current Typo3 content element</td>
-<td>see note</td>
-</tr>
-<tr class="row-odd"><td>feUser</td>
-<td>Logged in Typo3 FE User</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>feUserUid</td>
-<td>Logged in Typo3 FE User uid</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>feUserGroup</td>
-<td>FE groups of logged in Typo3 FE User</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>beUserLoggedIn</td>
-<td>&#8216;yes&#8217; | &#8216;no&#8217; - Status if a BE-User is logged in</td>
-<td>&#160;</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-<ul class="simple">
-<li><strong>note</strong>: not available:<ul>
-<li>in <a class="reference internal" href="#dynamic-update"><span class="std std-ref">Dynamic Update</span></a> or</li>
-<li>by <em>FormElement</em> class &#8216;action&#8217; with type &#8216;beforeSave&#8217;, &#8216;afterSave&#8217;, &#8216;beforeDelete&#8217;, &#8216;afterDelete&#8217;.</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="store-vars-v">
-<span id="store-vars"></span><h3>Store: <em>VARS</em> - V<a class="headerlink" href="#store-vars-v" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Sanitized: <em>no</em></li>
-</ul>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="15%" />
-<col width="85%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Explanation</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>random</td>
-<td>random string with length of 32 chars, alphanum</td>
-</tr>
-<tr class="row-odd"><td>slaveId</td>
-<td>see <em>FormElement</em> <cite>action</cite></td>
-</tr>
-<tr class="row-even"><td>filename</td>
-<td>Original filename of an uploaded file via an &#8216;upload&#8217;-FormElement. Valid only during processing of the current &#8216;upload&#8217;-formElement.</td>
-</tr>
-<tr class="row-odd"><td>fileDestinaton</td>
-<td>Destination (path &amp; filename) for an uploaded file. Defined in an &#8216;upload&#8217;-FormElement.parameter. Valid: same as &#8216;filename&#8217;.</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-</div>
-<div class="section" id="store-ldap-l">
-<span id="store-ldap"></span><h3>Store: <em>LDAP</em> - L<a class="headerlink" href="#store-ldap-l" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Sanitized: <em>yes</em></li>
-<li>See also <a class="reference internal" href="#ldap"><span class="std std-ref">LDAP</span></a>:</li>
-</ul>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="15%" />
-<col width="85%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Explanation</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>&lt;custom defined&gt;</td>
-<td>See <em>ldapAttributes</em></td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-</div>
-<div class="section" id="store-system-y">
-<span id="store-system"></span><h3>Store: <em>SYSTEM</em> - Y<a class="headerlink" href="#store-system-y" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Sanitized: <em>no</em></li>
-</ul>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="25%" />
-<col width="75%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Explanation</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>DB_USER</td>
-<td>defined in config.qfq.ini</td>
-</tr>
-<tr class="row-odd"><td>DB_SERVER</td>
-<td>defined in config.qfq.ini</td>
-</tr>
-<tr class="row-even"><td>DB_NAME</td>
-<td>defined in config.qfq.ini</td>
-</tr>
-<tr class="row-odd"><td>DB_INIT</td>
-<td>defined in config.qfq.ini</td>
-</tr>
-<tr class="row-even"><td>SQL_LOG</td>
-<td>defined in config.qfq.ini, see <a class="reference internal" href="#sql-log">SQL_LOG</a></td>
-</tr>
-<tr class="row-odd"><td>SQL_LOG_MODE</td>
-<td>defined in config.qfq.ini, <a class="reference internal" href="#sql-log-mode">SQL_LOG_MODE</a></td>
-</tr>
-<tr class="row-even"><td>SHOW_DEBUG_INFO</td>
-<td>defined in config.qfq.ini</td>
-</tr>
-<tr class="row-odd"><td>CSS_LINK_CLASS_INTERNAL</td>
-<td>defined in config.qfq.ini</td>
-</tr>
-<tr class="row-even"><td>CSS_LINK_CLASS_EXTERNAL</td>
-<td>defined in config.qfq.ini</td>
-</tr>
-<tr class="row-odd"><td>CSS_CLASS_QFQ_CONTAINER</td>
-<td>defined in config.qfq.ini</td>
-</tr>
-<tr class="row-even"><td>EXT_PATH</td>
-<td>computed during runtime</td>
-</tr>
-<tr class="row-odd"><td>SITE_PATH</td>
-<td>computed during runtime</td>
-</tr>
-<tr class="row-even"><td>DATE_FORMAT</td>
-<td>defined in config.qfq.ini</td>
-</tr>
-<tr class="row-odd"><td>class</td>
-<td>defined in config.qfq.ini (CSS_CLASS_QFQ_FORM) or form definition</td>
-</tr>
-<tr class="row-even"><td>classPill</td>
-<td>defined in config.qfq.ini (CSS_CLASS_QFQ_FORM_PILL) or form definition</td>
-</tr>
-<tr class="row-odd"><td>classBody</td>
-<td>defined in config.qfq.ini (CSS_CLASS_QFQ_FORM_BODY) or form definition</td>
-</tr>
-<tr class="row-even"><td>data-pattern-error</td>
-<td>defined in config.qfq.ini or form definition</td>
-</tr>
-<tr class="row-odd"><td>data-require-error</td>
-<td>defined in config.qfq.ini or form definition</td>
-</tr>
-<tr class="row-even"><td>data-match-error</td>
-<td>defined in config.qfq.ini or form definition</td>
-</tr>
-<tr class="row-odd"><td>data-error</td>
-<td>defined in config.qfq.ini or form definition</td>
-</tr>
-<tr class="row-even"><td>bsColumns</td>
-<td>defined in config.qfq.ini (FORM_BS_COLUMNS) or form definition</td>
-</tr>
-<tr class="row-odd"><td>bsLabelColumns</td>
-<td>defined in config.qfq.ini (FORM_BS_LABEL_COLUMNS) or form definition</td>
-</tr>
-<tr class="row-even"><td>bsInputColumns</td>
-<td>defined in config.qfq.ini (FORM_BS_INPUT_COLUMNS) or form definition</td>
-</tr>
-<tr class="row-odd"><td>bsNoteColumns</td>
-<td>defined in config.qfq.ini (FORM_BS_NOTE_COLUMNS) or form definition</td>
-</tr>
-<tr class="row-even"><td>sqlFinal</td>
-<td>computed during runtime, used for error reporting</td>
-</tr>
-<tr class="row-odd"><td>sqlParamArray</td>
-<td>computed during runtime, used for error reporting</td>
-</tr>
-<tr class="row-even"><td>sqlCount</td>
-<td>computed during runtime, used for error reporting</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-</div>
-</div>
-</div>
-<div class="section" id="ldap">
-<span id="id17"></span><h1>LDAP<a class="headerlink" href="#ldap" title="Permalink to this headline">¶</a></h1>
-<p>A form can retrieve data from LDAP server(s) to display or to save them. Configuration options for LDAP will be specified
-in the <em>parameter</em> field of the <em>Form</em> and/or the <em>FormElement</em>. Definitions of the <em>FormElement</em> will overwrite definitions
-of the <em>Form</em>. One LDAP Server can be configured per <em>FormElement</em>. Multiple <em>FormElements</em> might use individual LDAP
-Server configurations.</p>
-<p>To decide which Parameter should be placed on <em>Form.parameter</em> and which on <em>FormElement.parameter</em>: If LDAP access is ...</p>
-<ul class="simple">
-<li>only necessary in one <em>FormElement</em>, most usefull setup is to specify all values in that specific <em>FormElement</em>,</li>
-<li>needed on multiple <em>FormElement*s (of the same *Form</em>, e.g. one <em>input</em> with <em>typeAhead</em>, one <em>note</em> and one <em>action</em>), it&#8217;s more
-efficient to specify the base parameter <em>ldapServer</em>, <em>ldapBaseDn</em> in <em>Form.parameter</em> and the rest on the current
-<em>FormElement</em>.</li>
-</ul>
-<table border="1" class="docutils">
-<colgroup>
-<col width="19%" />
-<col width="22%" />
-<col width="41%" />
-<col width="4%" />
-<col width="8%" />
-<col width="6%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Parameter</th>
-<th class="head">Example</th>
-<th class="head">Description</th>
-<th class="head">Form</th>
-<th class="head">FormElement</th>
-<th class="head">Used for</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>ldapServer</td>
-<td>directory.example.com</td>
-<td>Hostname. For LDAPS: <cite>ldaps://directory.example.com:636</cite></td>
-<td>x</td>
-<td>x</td>
-<td>TA, FSL</td>
-</tr>
-<tr class="row-odd"><td>ldapBaseDn</td>
-<td>ou=Addressbook,dc=example,dc=com</td>
-<td>Base DN to start the search</td>
-<td>x</td>
-<td>x</td>
-<td>TA, FSL</td>
-</tr>
-<tr class="row-even"><td>ldapAttributes</td>
-<td>cn, email</td>
-<td>List of attributes to save in STORE_LDAP</td>
-<td>x</td>
-<td>x</td>
-<td>FSL</td>
-</tr>
-<tr class="row-odd"><td>ldapSearch</td>
-<td>(<a class="reference external" href="mailto:mail=john&#46;doe&#37;&#52;&#48;example&#46;com">mail=john<span>&#46;</span>doe<span>&#64;</span>example<span>&#46;</span>com</a>)</td>
-<td>Regular LDAP search expresssion</td>
-<td>x</td>
-<td>x</td>
-<td>FSL</td>
-</tr>
-<tr class="row-even"><td>ldapTimeLimit</td>
-<td>3 (default)</td>
-<td>Maximum time to wait for an answer of the LDAP Server</td>
-<td>x</td>
-<td>x</td>
-<td>TA, FSL</td>
-</tr>
-<tr class="row-odd"><td>ldapUseBindCredentials</td>
-<td>ldapUseBindCredentials=1</td>
-<td>Use LDAP_1_* crendentials from config.qfq.ini for ldap_bind()</td>
-<td>x</td>
-<td>x</td>
-<td>TA, FSL</td>
-</tr>
-<tr class="row-even"><td>typeAheadLdap</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>Enable LDAP as &#8216;Typeahead&#8217; data source</td>
-<td>&#160;</td>
-<td>x</td>
-<td>TA</td>
-</tr>
-<tr class="row-odd"><td>typeAheadLdapSearch</td>
-<td><cite>(|(cn=*?*)(mail=*?*))</cite></td>
-<td>Regular LDAP search expresssion, returns upto typeAheadLimit</td>
-<td>x</td>
-<td>x</td>
-<td>TA</td>
-</tr>
-<tr class="row-even"><td>typeAheadLdapSearchPrefetch</td>
-<td><cite>(mail=?)</cite></td>
-<td>Regular LDAP search expresssion, typically return one record</td>
-<td>x</td>
-<td>x</td>
-<td>TA</td>
-</tr>
-<tr class="row-odd"><td>typeAheadLdapSearchPerToken</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><dl class="first last docutils">
-<dt>Split search value in token and OR-combine every search with</dt>
-<dd>the individual tokens</dd>
-</dl>
-</td>
-<td>x</td>
-<td>x</td>
-<td>TA</td>
-</tr>
-<tr class="row-even"><td>typeAheadLdapValuePrintf</td>
-<td><cite>&#8216;%s / %s&#8217;, cn, mail</cite></td>
-<td>Custom format to display attributes, as <cite>value</cite></td>
-<td>x</td>
-<td>x</td>
-<td>TA</td>
-</tr>
-<tr class="row-odd"><td>typeAheadLdapIdPrintf</td>
-<td><cite>&#8216;%s&#8217;, mail</cite></td>
-<td>Custom format to display attributes, as <cite>id</cite></td>
-<td>x</td>
-<td>x</td>
-<td>TA</td>
-</tr>
-<tr class="row-even"><td>typeAheadLimit</td>
-<td>20 (default)</td>
-<td>Result will be limited to this number of entries</td>
-<td>x</td>
-<td>x</td>
-<td>TA</td>
-</tr>
-<tr class="row-odd"><td>typeAheadPedantic</td>
-<td>typeAheadPedantic</td>
-<td>Activate &#8216;pedantic&#8217; mode - only valid keys are allowed</td>
-<td>x</td>
-<td>x</td>
-<td>TA</td>
-</tr>
-<tr class="row-even"><td>typeAheadMinLength</td>
-<td>2 (default)</td>
-<td>Minimum number of characters before starting the search</td>
-<td>x</td>
-<td>x</td>
-<td>TA</td>
-</tr>
-<tr class="row-odd"><td>fillStoreLdap</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>Activate <cite>Fill STORE LDAP</cite> with the first retrieved record</td>
-<td>&#160;</td>
-<td>x</td>
-<td>FSL</td>
-</tr>
-</tbody>
-</table>
-<ul class="simple">
-<li><em>typeAheadLimit</em>: there might be a hard limit on the server side (e.g. 100) - which can&#8217;t be extended.</li>
-<li><em>ldapUseBindCredentials</em> is only necessary if <cite>anonymous</cite> access is not possible. RDN and password has to be configured in
-<cite>config.qfq.ini</cite>.</li>
-</ul>
-<div class="section" id="typeahead-ta">
-<span id="ldap-typeahead"></span><h2>Typeahead (TA)<a class="headerlink" href="#typeahead-ta" title="Permalink to this headline">¶</a></h2>
-<p><em>Typeahead</em> offers continous searching of a LDAP directoy by using a regular <em>FormElement</em> of type <em>text</em>.
-The <em>FormElement.parameter*=*typeAheadLdap</em> will trigger LDAP searches on every user <strong>keystroke</strong>
-(starting after <em>typeAheadMinLength</em> keystrokes) for the current <em>FormElement</em> - this is different from <em>dynamicUpdate</em>
-(triggered by leaving focus of an input element). Typeahead delivers a list of elements.</p>
-<ul class="simple">
-<li><em>FormElement.parameter.typeAheadLdap</em> - activate the mode <em>Typeahead</em> - no value is needed, the existence is suffucient.</li>
-<li><em>Form.parameter</em> or <em>FormElement.parameter</em>:<ul>
-<li><em>ldapServer</em> = <cite>directory.example.com</cite></li>
-<li><em>ldapBaseDn</em> =  <cite>ou=Addressbook,dc=example,dc=com</cite></li>
-<li><em>typeAheadLdapSearch</em> = <cite>(|(cn=*?*)(mail=*?*))</cite></li>
-<li><em>typeAheadLdapValuePrintf</em> = <cite>&#8216;%s / %s&#8217;, cn, email</cite></li>
-<li><em>typeAheadLdapIdPrintf</em> = <cite>&#8216;%s&#8217;, email</cite></li>
-<li>Optional: <em>ldapUseBindCredentials</em> = 1</li>
-</ul>
-</li>
-</ul>
-<p>All fetched LDAP values will be formatted with:</p>
-<ul class="simple">
-<li><em>typeAheadLdapValuePrintf</em>, shown to the user in a drop-down box and</li>
-<li><em>typeAheadLdapIdPrintf</em>, which represents the final data to save.</li>
-</ul>
-<p>The <cite>id/value</cite> translation is compareable to a regular select drop-down box with id/value pairs.
-Only attributes, defined in <em>typeAheadLdapValuePrintf</em> / <em>typeAheadLdapIdPrintf</em> will be fetched from the LDAP directory.
-To examine all possible values of an LDAP server, use the commandline tool <cite>ldapsearch</cite>. E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">ldapsearch</span> <span class="o">-</span><span class="nx">x</span> <span class="o">-</span><span class="nx">h</span> <span class="nx">directory</span><span class="o">.</span><span class="nx">example</span><span class="o">.</span><span class="nx">com</span> <span class="o">-</span><span class="nx">L</span> <span class="o">-</span><span class="nx">b</span> <span class="nx">ou</span><span class="o">=</span><span class="nx">Addressbook</span><span class="p">,</span><span class="nx">dc</span><span class="o">=</span><span class="nx">example</span><span class="p">,</span><span class="nx">dc</span><span class="o">=</span><span class="nx">com</span> <span class="s2">&quot;(mail=john.doe@example.com)&quot;</span>
-</pre></div>
-</div>
-<p>All occurences of a &#8216;?&#8217; in <em>ldapSearch</em> will be replaced by the user data typed in via the text-<em>FormElement</em>.
-The typed data will be escaped to fullfill LDAP search limitations.
-Regular <em>Form</em> variables might be used on all parameter and will be evaluated during form load (!) - <em>not</em> at the time when
-the user types something.</p>
-<div class="section" id="pedantic">
-<h3>Pedantic<a class="headerlink" href="#pedantic" title="Permalink to this headline">¶</a></h3>
-<p>In case the typed value (technically this is the value of the <em>id</em>, latest in the moment when loosing the focus) have
-to be a valid (= exist on the LDAP server), the <em>typeAheadPedantic</em> mode can be activated.
-If the user typed something and that is not a valid <em>id</em>, the client (=browser) will delete the input when loosing the focus.
-To identify the exact <em>id</em>, an additional search filter is necessary: <cite>ypeAheadLdapSearchPrefetch</cite> - see next topic.</p>
-<ul class="simple">
-<li><em>Form.parameter</em> or <em>FormElement.parameter</em>:<ul>
-<li><em>typeAheadPedantic</em></li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="prefetch">
-<h3>Prefetch<a class="headerlink" href="#prefetch" title="Permalink to this headline">¶</a></h3>
-<p>After &#8216;form load&#8217; with an existing record, the user epects to see the previous saved data. In case there is an <em>id</em> to
-<em>value</em> translation, the <em>value</em> does not exist in the database, instead it has to be fetched again dynamically from the
-LDAP server. A precise LDAP query has to be defined to force this:</p>
-<ul class="simple">
-<li><em>Form.parameter</em> or <em>FormElement.parameter</em>:<ul>
-<li><em>typeAheadLdapSearchPrefetch</em> = <cite>(mail=?)</cite></li>
-</ul>
-</li>
-</ul>
-<p>This situation also applies in <em>pedantic</em> mode to verify the user input after each change.</p>
-</div>
-<div class="section" id="pertoken">
-<h3>PerToken<a class="headerlink" href="#pertoken" title="Permalink to this headline">¶</a></h3>
-<p>Sometimes a LDAP server only provides attributes like &#8216;sn&#8217; and &#8216;givenName&#8217;, but not &#8216;displayName&#8217; or another practial
-combination of multiple attributes - than it is difficult to search for &#8216;firstname&#8217; <em>and</em> (=human AND) &#8216;lastname&#8217;.
-E.g. &#8216;John Doe&#8217;, results to search like <cite>(|(sn=*John Doe*)(givenName=*John Doe*))</cite> which will be probably always be empty.
-Instead, the user input has to be splitted in token and the search string has to repeated for every token.</p>
-<ul class="simple">
-<li><em>Form.parameter</em> or <em>FormElement.parameter</em>:<ul>
-<li><em>typeAheadLdapSearchPerToken</em> - no value needed.</li>
-</ul>
-</li>
-</ul>
-<p>This will repeat the search string per token.</p>
-<p>E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">User</span> <span class="nx">search</span> <span class="nx">string</span><span class="o">:</span> <span class="nx">X</span> <span class="nx">Y</span>
-<span class="nx">Ldap</span> <span class="nx">search</span> <span class="nx">string</span><span class="o">:</span> <span class="p">(</span><span class="o">|</span><span class="p">(</span><span class="nx">a</span><span class="o">=*?*</span><span class="p">)(</span><span class="nx">b</span><span class="o">=*?*</span><span class="p">))</span>
-
-<span class="nx">Result</span><span class="o">:</span> <span class="p">(</span><span class="o">&amp;</span> <span class="p">(</span><span class="o">|</span><span class="p">(</span><span class="nx">a</span><span class="o">=*</span><span class="nx">X</span><span class="o">*</span><span class="p">)(</span><span class="nx">b</span><span class="o">=*</span><span class="nx">X</span><span class="o">*</span><span class="p">))</span> <span class="p">(</span><span class="o">|</span><span class="p">(</span><span class="nx">a</span><span class="o">=*</span><span class="nx">Y</span><span class="o">*</span><span class="p">)(</span><span class="nx">b</span><span class="o">=*</span><span class="nx">Y</span><span class="o">*</span><span class="p">))</span>
-</pre></div>
-</div>
-<p>Attention: this option is only usefull in specific environments. Only use it, if it is really needed. The query becomes
-much more cpu / IO intensive.</p>
-</div>
-</div>
-<div class="section" id="fill-store-ldap-fsl">
-<span id="fill-ldap-store"></span><h2>Fill STORE LDAP (FSL)<a class="headerlink" href="#fill-store-ldap-fsl" title="Permalink to this headline">¶</a></h2>
-<p>Before processing a <em>FormElement</em>, an optional configured FSL-action loads <strong>one</strong> record from a LDAP directory and stores
-the named attributes in STORE_LDAP. If the LDAP search query selects more than one record, only the first record is processed.
-The attributes names always becomes lowercase (PHP implentation detail on get_ldap_entries()) in the store. To make
-accessing STORE_LDAP easily, the keys are implemented case insensitive for this specific store. FLS is triggered during <em>Form</em>-...</p>
-<ul class="simple">
-<li>load,</li>
-<li>dynamic update,</li>
-<li>save.</li>
-</ul>
-<p>The FLS happens <em>before</em> the <em>FormElement</em> processing starts. Therefore the fetched LDAP data (specified by <em>ldapAttributes</em>),
-are available via <cite>{{&lt;attributename&gt;:L:allbut:s}}</cite> during the regular <em>FormElement</em> processing. Take care to specify
-a sanitize class and optional escaping on further processing of those data.</p>
-<p>Also, the STORE LDAP remains filled, during the whole form processing time. E.g. if the values are needed for a person
-name and email, it&#8217;s sufficient to fire one FSL on the first FormElement Action element, and use the same values during further FormElement
-Action Elements.</p>
-<p>Important: LDAP access might slow down the <em>Form</em> processing on load, update or save! The timeout (default: 3 seconds) have
-to be multiplied by the number of accesses. E.g. a broken LDAP connection and 3 <em>FormElements</em> with <em>FSL</em>
-results to 9 seconds delay on save. Also be prepared not to receive the expected data.</p>
-<ul class="simple">
-<li><em>FormElement.parameter.fillStoreLdap</em> - activate the mode <em>Fill S</em> - no value is needed, the existence is suffucient.</li>
-<li><em>Form.parameter</em> or <em>FormElement.parameter</em>:<ul>
-<li><em>ldapServer</em> = <cite>directory.example.com</cite></li>
-<li><em>ldapBaseDn</em> =  <cite>ou=Addressbook,dc=example,dc=com</cite></li>
-<li><em>typeAheadLdapSearch</em> = <cite>(|(cn=*?*)(mail=*?*))</cite></li>
-<li><em>ldapAttributes</em> = <cite>givenName, sn, telephoneNumber, email</cite></li>
-<li><em>ldapSearch</em> = <cite>(mail={{email::l}})</cite></li>
-<li>Optional: <em>ldapUseBindCredentials</em> = 1</li>
-</ul>
-</li>
-</ul>
-<p>After filling the store, access the content via <cite>{{&lt;attributename&gt;:allbut:L:s}}</cite>.</p>
-</div>
-</div>
-<div class="section" id="form">
-<h1>Form<a class="headerlink" href="#form" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="id18">
-<h2>General<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>Forms will be created by using the <em>Form Editor</em> on the Typo3 frontend (HTML form).</li>
-<li>The <em>Form editor</em> itself consist of two predefined QFQ forms: <em>form</em> and <em>formElement</em> - these forms are often updated
-during the installation of new QFQ versions.</li>
-<li>Every form consist of a) a <em>Form</em> record and b) multiple <em>FormElement</em> records.</li>
-<li>A form is assigned to a  <em>table</em>. Such a table is called the <em>primary table</em> for this form.</li>
-<li>Forms can roughly categorized into:<ul>
-<li><em>Simple</em> form: the form acts on one record, stored in one table.<ul>
-<li>The form will create necessary SQL commands for insert, update and delete (only primary record) automatically.</li>
-</ul>
-</li>
-<li><em>Advanced</em> form: the form acts on multiple records, stored in more than one table.<ul>
-<li>Fields of the primary table acts like a <em>simple</em> form, all other fields have to be specified with <em>action/afterSave</em> records.</li>
-</ul>
-</li>
-<li><em>Multi</em> form: the form acts simultanously on more than one record. All records use the same <em>FormElements</em>.<ul>
-<li>The <em>FormElements</em> are defined as a regular <em>simple</em> / or <em>advanced</em> form, plus a SQL Query, which selects and
-iterates over all records. Those records will be loaded at the same time.</li>
-</ul>
-</li>
-<li><em>Delete</em> form: any form can be used as a form to <a class="reference internal" href="#delete-record">delete-record</a>.</li>
-</ul>
-</li>
-<li>Form mode: The parameter &#8216;r&#8217; (given via URL or via SIP) decide if the form is in mode:<ul>
-<li><cite>New</cite>:<ul>
-<li>Missing parameter &#8216;r&#8217; or &#8216;r=0&#8217;</li>
-<li>On form load, no record is displayed.</li>
-<li>Saving the form creates a new primary record.</li>
-<li>E.g.: <cite>http://example.com/index.php?id=home&amp;form=Person</cite>  or <cite>http://example.com/index.php?id=home&amp;form=Person&amp;r=0</cite></li>
-</ul>
-</li>
-<li><cite>Edit</cite>:<ul>
-<li>Parameter &#8216;r&gt;0&#8217;</li>
-<li>On form load, the specified record (&lt;tablename&gt;.id= &lt;r&gt;) will be loaded and displayed.</li>
-<li>Saving the form will update the existing record.</li>
-<li>E.g.: <cite>http://example.com/index.php?id=home&amp;form=Person&amp;r=123</cite></li>
-</ul>
-</li>
-</ul>
-</li>
-<li>Display a form:<ul>
-<li>Create a QFQ tt_content record on a Typo 3 page.</li>
-<li>Inside the QFQ record: <cite>form  = &lt;formname&gt;</cite>. E.g.:<ul>
-<li>Static: <cite>form = Person</cite></li>
-<li>Dynamic: <cite>form  = {{form:S}}</cite>  (the left <cite>form</cite> is a keyword for QFQ, the right <cite>form</cite> is a free chooseable variable name)</li>
-</ul>
-</li>
-<li>With the <cite>Dynamic</cite> option, it&#8217;s easily possible to use one Typo3 page and display different forms on that specific
-page. This is nice to configure few Typo 3 pages. The disadvantage is that the user might loose the navigation.</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="record-locking">
-<span id="id19"></span><h2>Record locking<a class="headerlink" href="#record-locking" title="Permalink to this headline">¶</a></h2>
-<p>Forms and &#8216;record delete&#8217;-function support basic record locking. If a user opens a form and start to change content, a
-record lock will be acquired in the background. If the lock is denied (another user already owns a lock on the record) an
-alert is shown.
-By default the record lock mode is &#8216;exclusive&#8217; and the default timeout is 15 minutes. Both can be configured per form. The
-initial default timeout can also be configured in <a class="reference internal" href="#id5">config.qfq.ini</a> (will be copied to the form during creating the form).</p>
-<p>If a timeout expires, the lock is deleted. During the next change in a form, the lock is acquired again.</p>
-<p>A lock is assgined to a record of a table. Multiple forms, with the same primary table, uses the same lock for a given record.</p>
-<p>If a <cite>Form</cite> acts on further records (e.g. via FE action), those records are not protected by this basic record locking.</p>
-<p>If a user tries to delete a record and another user already owns a lock on that record, the delete action is denied.</p>
-<p>If there are different locking modes in mulitiple forms, the most restricting mode applies for the current lock.</p>
-<div class="section" id="exclusive">
-<h3>Exclusive<a class="headerlink" href="#exclusive" title="Permalink to this headline">¶</a></h3>
-<p>An existing lock on a record forbids any write action on that record.</p>
-</div>
-<div class="section" id="advisory">
-<h3>Advisory<a class="headerlink" href="#advisory" title="Permalink to this headline">¶</a></h3>
-<p>An existing lock on a record informs the user that another user is currently working on that record. Nevertheless,
-writing is allowed.</p>
-</div>
-<div class="section" id="none">
-<h3>None<a class="headerlink" href="#none" title="Permalink to this headline">¶</a></h3>
-<p>No locking at all.</p>
-</div>
-</div>
-<div class="section" id="comment-and-space-character">
-<span id="comment-space-character"></span><h2>Comment- and space-character<a class="headerlink" href="#comment-and-space-character" title="Permalink to this headline">¶</a></h2>
-<p>The following applies to the fields <cite>Form.parameter</cite> and <cite>FormElement.parameter</cite>:</p>
-<ul class="simple">
-<li>Lines will be trimmed - leading and trailing spaces will be removed.</li>
-<li>If a leading and/or trailing space is needed, escape it: &#8216;hello world &#8216; &gt; &#8216; hello world &#8216;.</li>
-<li>Lines starting with a &#8216;#&#8217; are treated as a comment and will not be parsed. Such lines are treated as &#8216;empty lines&#8217;.</li>
-<li>The comment sign can be escaped with &#8216;\&#8217;.</li>
-</ul>
-</div>
-<div class="section" id="definition">
-<span id="form-main"></span><h2>Definition<a class="headerlink" href="#definition" title="Permalink to this headline">¶</a></h2>
-<table border="1" class="docutils">
-<colgroup>
-<col width="14%" />
-<col width="86%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Description</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>Name</td>
-<td>Unique and speaking name of the <em>Form</em>. Form will be identified by this name. Use only &#8216;[a-zA-Z0-9._+-]&#8217;. <span class="target" id="form-name">form-name</span></td>
-</tr>
-<tr class="row-odd"><td>Title</td>
-<td>Title, shown on/above the form. <span class="target" id="form-title">form-title</span></td>
-</tr>
-<tr class="row-even"><td>Note</td>
-<td>Personal editor notes. <span class="target" id="form-note">form-note</span></td>
-</tr>
-<tr class="row-odd"><td>Table</td>
-<td>Primary table of the form. <span class="target" id="form-tablename">form-tablename</span></td>
-</tr>
-<tr class="row-even"><td>Required Parameter NEW</td>
-<td>Name of required SIP parameter to create a new record (r=0), separated by comma. &#8216;#&#8217; as comment delimiter. See <a class="reference internal" href="#form-requiredparameter">form-requiredParameter</a></td>
-</tr>
-<tr class="row-odd"><td>Required Parameter EDIT</td>
-<td>Name of required SIP parameter to edit an existing record (r&gt;0), separated by comma. &#8216;#&#8217; as comment delimiter. See <a class="reference internal" href="#form-requiredparameter">form-requiredParameter</a></td>
-</tr>
-<tr class="row-even"><td>Permit New</td>
-<td>&#8216;sip, logged_in, logged_out, always, never&#8217; (Default: sip): See <a class="reference internal" href="#form-permitnewedit">form-permitNewEdit</a></td>
-</tr>
-<tr class="row-odd"><td>Permit Edit</td>
-<td>&#8216;sip, logged_in, logged_out, always, never&#8217; (Default: sip): See <a class="reference internal" href="#form-permitnewedit">form-permitNewEdit</a></td>
-</tr>
-<tr class="row-even"><td>Escape Type Default</td>
-<td>See <a class="reference internal" href="#variable-escape">variable-escape</a>.</td>
-</tr>
-<tr class="row-odd"><td>Show button</td>
-<td>&#8216;new, delete, close, save&#8217; (Default: &#8216;new,delete,close,save&#8217;): Shown named buttons in the upper right corner of the form.  See <a class="reference internal" href="#form-showbutton">form-showButton</a></td>
-</tr>
-<tr class="row-even"><td>Forward Mode</td>
-<td>&#8216;client | no | url | url-skip-history&#8217; (Default: client): See <a class="reference internal" href="#form-forward">form-forward</a>.</td>
-</tr>
-<tr class="row-odd"><td>Forward (Mode) Page</td>
-<td><ol class="first last loweralpha simple">
-<li>URL / Typo3 page id/alias or b) Forward Mode (via &#8216;{{...}}&#8217;) or combination of a) &amp; b). See <a class="reference internal" href="#form-forward">form-forward</a>.</li>
-</ol>
-</td>
-</tr>
-<tr class="row-even"><td>Parameter</td>
-<td>Misc additional parameters. See <a class="reference internal" href="#form-parameter">form-parameter</a>.</td>
-</tr>
-<tr class="row-odd"><td>BS Label Columns</td>
-<td rowspan="3">The bootstrap grid system is based on 12 columns. The sum of <em>bsLabelColumns</em>,
-<em>bsInputColumns</em> and <em>bsNoteColumns</em> should be 12. These values here are the base values
-for all <em>FormElements</em>. Exceptions per <em>FormElement</em> can be specified per <em>FormElement</em>.
-Default: label=3, input=6, note=3. See <a class="reference internal" href="#form-layout">form-layout</a>.</td>
-</tr>
-<tr class="row-even"><td>BS Input Columns</td>
-</tr>
-<tr class="row-odd"><td>BS Note Columns</td>
-</tr>
-<tr class="row-even"><td>multiMode</td>
-<td>NOT IMPLEMENTED - &#8216;none, horizontal, vertical&#8217; (Default &#8216;none&#8217;)</td>
-</tr>
-<tr class="row-odd"><td>multiSql</td>
-<td>NOT IMPLEMENTED - Optional. SQL Query which selects all records to edit.</td>
-</tr>
-<tr class="row-even"><td>multiDetailForm</td>
-<td>NOT IMPLEMENTED - Optional. Form to open, if a record is selected to edit (double click on record line)</td>
-</tr>
-<tr class="row-odd"><td>multiDetailFormParameter</td>
-<td>NOT IMPLEMENTED - Optional. Translated Parameter submitted to detailform (like subrecord parameter)</td>
-</tr>
-</tbody>
-</table>
-<div class="section" id="permitnew-permitedit">
-<span id="form-permitnewedit"></span><h3>permitNew &amp; permitEdit<a class="headerlink" href="#permitnew-permitedit" title="Permalink to this headline">¶</a></h3>
-<p>Depending on <cite>r</cite>, the following access permission will be taken:</p>
-<ul class="simple">
-<li><cite>r=0</cite> - permitNew</li>
-<li><cite>r&gt;0</cite> - permitEdit</li>
-</ul>
-<table border="1" class="docutils">
-<colgroup>
-<col width="11%" />
-<col width="89%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Option</th>
-<th class="head">Description</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>sip</td>
-<td>The parameter &#8216;form&#8217; and &#8216;r&#8217; must be supplied via SIP or hard coded in the QFQ tt_content record.</td>
-</tr>
-<tr class="row-odd"><td>logged_in</td>
-<td>The form will only be shown if the current User is logged in as a FE User</td>
-</tr>
-<tr class="row-even"><td>logged_out</td>
-<td>The form will only be shown if the current User is <em>not</em> logged in as a FE User</td>
-</tr>
-<tr class="row-odd"><td>always</td>
-<td>No access restriction, the form will always be shown</td>
-</tr>
-<tr class="row-even"><td>never</td>
-<td>The form will never be shown</td>
-</tr>
-</tbody>
-</table>
-<ul class="simple">
-<li><cite>sip</cite><ul>
-<li>is <em>always</em> the preferred way. With &#8216;sip&#8217; it&#8217;s not necessary to differ between logged in or not, cause the SIP
-only  exist and is only valid, if it&#8217;s created via QFQ/report earlier. This means &#8216;creating&#8217; the SIP implies
-&#8216;access granted&#8217;. The grant will be revoked when the QFQ session is destroyed - this happens when a user loggs out or
-the webbrowser is closed.</li>
-</ul>
-</li>
-<li><cite>logged_in</cite> / <cite>logged_out</cite>: for forms which might be displayed without a SIP, but maybe on a protected or even unprotected page. <em>The option is probably not often used.</em></li>
-<li><cite>always</cite>: such a form is always allowed to be loaded.<ul>
-<li><cite>permitNew=always</cite>: Public accessible forms (e.g. for registration) will allow users to fill and save
-the form.</li>
-<li><cite>permitEdit=always</cite>: Public accessible forms will allow users to update existing data. This
-is dangerous, cause the URL paramater (recordId) &#8216;r&#8217; might be changed by the user (URL manipulating) and therefore
-the user might see and/or change data from other users. <em>The option is probably not often used.</em></li>
-</ul>
-</li>
-<li><cite>never</cite>: such a form is not allowed to be loaded.<ul>
-<li><cite>permitNew=never</cite>: Public accessible forms. It&#8217;s not possible to create new records.</li>
-<li><cite>permitEdit=none</cite>: Public accessible forms. It&#8217;s not possible to update records.</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="required-parameter-new-edit">
-<span id="form-requiredparameter"></span><h3>Required Parameter New|Edit<a class="headerlink" href="#required-parameter-new-edit" title="Permalink to this headline">¶</a></h3>
-<p>Comma separated list of variable names. On form load, an error message will be shown in case of missing parameters.
-The parameters must be given by SIP.</p>
-<p>The list of required parameter has to be defined for <cite>New</cite> (r=0, create a new record) and for <cite>Edit</cite> (r&gt;0, edit existing
-record).</p>
-<p>Optional a comment might be attached after the parameter definition.</p>
-<p>E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="k">New</span><span class="o">:</span> <span class="nx">grId</span><span class="p">,</span> <span class="nx">pId</span> <span class="c1"># Always specify a person, grId2</span>
-<span class="nx">Edit</span><span class="o">:</span> <span class="nx">pId</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="showbutton">
-<span id="form-showbutton"></span><h3>showButton<a class="headerlink" href="#showbutton" title="Permalink to this headline">¶</a></h3>
-<p>Display or hide the button <cite>new</cite>, <cite>delete</cite>, <cite>close</cite>, <cite>save</cite>.</p>
-<ul class="simple">
-<li><em>new</em>: Creates a new record. If the form needs any special parameter via SIP or Client (=browser), hide this &#8216;new&#8217; button - the necessary parameter are not provided.</li>
-<li><em>delete</em>: This either deletes the current record only, or (if defined via action <em>FormElement</em> &#8216;beforeDelete&#8217; ) any specified subrecords.</li>
-<li><em>close</em>: Close the current form. If there are changes, a popup opens and ask to save / close / cancel. The last page from the history will be shown.</li>
-<li><em>save</em>: Save the form.</li>
-<li>Default: show all buttons.</li>
-</ul>
-</div>
-<div class="section" id="forward-save-close">
-<span id="form-forward"></span><h3>Forward: Save / Close<a class="headerlink" href="#forward-save-close" title="Permalink to this headline">¶</a></h3>
-<div class="section" id="forward-forwardmode">
-<h4>Forward (=forwardMode)<a class="headerlink" href="#forward-forwardmode" title="Permalink to this headline">¶</a></h4>
-<p>After the user presses <em>Save</em>, <em>Close</em>, <em>Delete</em> or <em>New</em>, different actions are possible where the browser redirects to.</p>
-<ul class="simple">
-<li><cite>client</cite> (default) - the QFQ browser Javascript logic, decides to stay on the page or to force a redirection
-to a previous page.<ul>
-<li><em>Close</em> closes the current page and goes back to the previous page. Note: if a new tab is opened and the user presses
-QFQ close (in any way) - in that new browser tab there is no previous page! QFQ won&#8217;t close the tab, instead a message
-is shown</li>
-<li><em>Save</em> stays on the current page.</li>
-</ul>
-</li>
-<li><cite>no</cite> - no change, the browser remains on the current side. Close does not close the page. It just triggers a save if
-there are modified data.</li>
-<li><cite>url</cite> - the browser redirects to the URL or T3 page named in <cite>Forward URL / Page</cite>. Independent if the user presses <cite>save</cite> or <cite>close</cite>.</li>
-<li><cite>url-skip-history</cite> - same as <cite>url</cite>, but the current location won&#8217;t saved in the browser history.</li>
-</ul>
-<p>Only with <cite>Forward</cite> == <cite>url</cite> | <cite>url-skip-history</cite>, the definition of <cite>Forward URL / Page</cite> becomes active.</p>
-</div>
-<div class="section" id="forward-url-page-forwardpage">
-<h4>Forward URL / Page (=forwardPage)<a class="headerlink" href="#forward-url-page-forwardpage" title="Permalink to this headline">¶</a></h4>
-<p>Format: [&lt;url&gt;] or [&lt;mode&gt;|&lt;url&gt;]</p>
-<ul class="simple">
-<li><cite>&lt;url&gt;</cite>:<ul>
-<li><cite>http://www.example.com/index.html?a=123#bottom</cite></li>
-<li><cite>website.html?a=123#bottom</cite></li>
-<li><cite>?&lt;T3 Alias pageid&gt;&amp;a=123#bottom, ?id=&lt;T3 page id&gt;&amp;a=123#bottom</cite></li>
-<li><cite>{{SELECT ...}}</cite></li>
-<li><cite>&lt;mode&gt;|&lt;url&gt;</cite></li>
-</ul>
-</li>
-<li><cite>&lt;mode&gt;</cite> - Valid keywords are as above: <cite>no|client|url|url-skip-history</cite></li>
-</ul>
-<p>Specifying the mode in <cite>forwardPage</cite> overwrites <cite>formMode</cite> (but only if <cite>formMode</cite> is <cite>url...</cite>).</p>
-<p>Also regular QFQ statements like {{var}} or {{SELECT ...}} are possible in <cite>forwardPage</cite>. This is useful to dynamically
-redirect to different targets, depending on user input or any other dependencies.</p>
-<p>If a forwardMode &#8216;url...&#8217; is specified and there is no <cite>forwardPage</cite>, QFQ falls down to <cite>client</cite> mode.</p>
-<p>On a form, the user might click &#8216;save&#8217; or &#8216;save,close&#8217; or &#8216;close&#8217; (with modified data this leads to &#8216;save,close&#8217;).
-The CLIENT <cite>submit_reason</cite> shows the user action:</p>
-<ul class="simple">
-<li><cite>{{submit_reason:CE:alnumx}}</cite> = <cite>save</cite> or <cite>save,close</cite></li>
-</ul>
-</div>
-</div>
-<div class="section" id="example-forwardpage">
-<h3>Example forwardPage<a class="headerlink" href="#example-forwardpage" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li><cite>{{SELECT IF(&#8216;{{formModeGlobal:S:anumx}}&#8217;=&#8217;requiredOff&#8217;, &#8216;no&#8217;, &#8216;client&#8217;) }}</cite></li>
-<li><cite>{{SELECT IF(&#8216;{{submit_reason:CE:alnumx}}&#8217;=&#8217;save&#8217;, &#8216;no&#8217;, &#8216;url&#8217;), &#8216;|http://example.com&#8217; }}</cite></li>
-</ul>
-</div>
-<div class="section" id="type-combined-dynamic-mode-url-page">
-<h3>Type: combined dynamic mode &amp; URL/page<a class="headerlink" href="#type-combined-dynamic-mode-url-page" title="Permalink to this headline">¶</a></h3>
-<p>Syntax: <cite>forwardPage=&lt;mode&gt;|&lt;page&gt;</cite></p>
-<ul class="simple">
-<li><cite>forwardPage={{SELECT IF(a.url=&#8217;&#8216;,&#8217;no&#8217;,&#8217;url&#8217;), &#8216;|&#8217;, a.url FROM address AS a }}</cite></li>
-</ul>
-</div>
-<div class="section" id="parameter">
-<span id="form-parameter"></span><h3>Parameter<a class="headerlink" href="#parameter" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>The following parameter are optional and can be configured in the <em>Form.parameter</em> field.</li>
-</ul>
-<table border="1" class="docutils">
-<colgroup>
-<col width="20%" />
-<col width="6%" />
-<col width="74%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Type</th>
-<th class="head">Description</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>dbIndexData</td>
-<td>int</td>
-<td>Database credential index, given via <a class="reference internal" href="#id5">config.qfq.ini</a> to let the current <cite>Form</cite> operate on the database.</td>
-</tr>
-<tr class="row-odd"><td>bsColumns</td>
-<td>int</td>
-<td>Wrap the whole form in &#8216;&lt;div class=&#8221;col-md-??&#8221;&gt;</td>
-</tr>
-<tr class="row-even"><td>maxVisiblePill</td>
-<td>int</td>
-<td>Show pills upto &lt;maxVisiblePill&gt; as button, all further in a drop-down menu. Eg.: maxVisiblePill=3.</td>
-</tr>
-<tr class="row-odd"><td>class</td>
-<td>string</td>
-<td>HTML div with given class, surrounding the whole form. Eg.: class=container-fluid.</td>
-</tr>
-<tr class="row-even"><td>classPill</td>
-<td>string</td>
-<td>HTML div with given class, surrounding the <cite>pill</cite> title line.</td>
-</tr>
-<tr class="row-odd"><td>classBody</td>
-<td>string</td>
-<td>HTML div with given class, surrounding all <em>FormElement</em>.</td>
-</tr>
-<tr class="row-even"><td>submitButtonText</td>
-<td>string</td>
-<td>Show save button, with the &lt;submitButtonText&gt; at the bottom of the form.</td>
-</tr>
-<tr class="row-odd"><td>extraDeleteForm</td>
-<td>string</td>
-<td>Name of a form which specifies how to delete the primary record and optional slave records.</td>
-</tr>
-<tr class="row-even"><td>data-pattern-error</td>
-<td>string</td>
-<td>Pattern violation: Text for error message used for all FormElements of current form.</td>
-</tr>
-<tr class="row-odd"><td>data-required-error</td>
-<td>string</td>
-<td>Required violation: Text for error message used for all FormElements of current form.</td>
-</tr>
-<tr class="row-even"><td>data-match-error</td>
-<td>string</td>
-<td>Match violation: Text for error message used for all FormElements of current form.</td>
-</tr>
-<tr class="row-odd"><td>data-error</td>
-<td>string</td>
-<td>If none specific is defined: Text for error message used for all FormElements of current form.</td>
-</tr>
-<tr class="row-even"><td>buttonOnChangeClass</td>
-<td>string</td>
-<td>Color for save button after user modified some content or current form. E.g.: &#8216;btn-info alert-info&#8217;.</td>
-</tr>
-<tr class="row-odd"><td>ldapServer</td>
-<td>string</td>
-<td>FQDN Ldap Server. E.g.: directory.example.com.</td>
-</tr>
-<tr class="row-even"><td>ldapBaseDn</td>
-<td>string</td>
-<td>E.g.: <cite>ou=Addressbook,dc=example,dc=com</cite>.</td>
-</tr>
-<tr class="row-odd"><td>ldapAttributes</td>
-<td>string</td>
-<td>List of attributes to fill STORE_LDAP with. E.g.: cn, email.</td>
-</tr>
-<tr class="row-even"><td>ldapSearch</td>
-<td>string</td>
-<td>E.g.: <cite>(mail={{email::alnumx:l}})</cite></td>
-</tr>
-<tr class="row-odd"><td>ldapTimeLimit</td>
-<td>int</td>
-<td>Maximum time to wait for an answer of the LDAP Server.</td>
-</tr>
-<tr class="row-even"><td>typeAheadLdap</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>Enable LDAP as &#8216;Typeahead&#8217; data source.</td>
-</tr>
-<tr class="row-odd"><td>typeAheadLdapSearch</td>
-<td>string</td>
-<td>Regular LDAP search expresssion. E.g.:  <cite>(|(cn=*?*)(mail=*?*))</cite></td>
-</tr>
-<tr class="row-even"><td>typeAheadLdapValuePrintf</td>
-<td>string</td>
-<td>Value formatting of LDAP result, per entry. E.g.: <cite>&#8216;%s / %s / %s&#8217;, mail, roomnumber, telephonenumber</cite></td>
-</tr>
-<tr class="row-odd"><td>typeAheadLdapIdPrintf</td>
-<td>string</td>
-<td>Key formatting of LDAP result, per entry. E.g.: <cite>&#8216;%s&#8217;, mail</cite></td>
-</tr>
-<tr class="row-even"><td>typeAheadLdapSearchPerToken</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>Split search value in token and OR-combine every search with the individual tokens.</td>
-</tr>
-<tr class="row-odd"><td>typeAheadLimit</td>
-<td>int</td>
-<td>Maximum number of entries. The limit is applied to the server (LDAP or SQL) and the Client.</td>
-</tr>
-<tr class="row-even"><td>typeAheadMinLength</td>
-<td>int</td>
-<td>Minimum number of characters which have to typed to start the search.</td>
-</tr>
-<tr class="row-odd"><td>mode</td>
-<td>string</td>
-<td>The value <cite>readonly</cite> will activate a global readonly mode of the form - the user can&#8217;t change any data.
-See <a class="reference internal" href="#form-mode-global"><span class="std std-ref">Form mode global</span></a></td>
-</tr>
-<tr class="row-even"><td>saveButtonActive</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>Make the &#8216;save&#8217;-button active on <em>Form</em> load (instead of waiting for the first user change).</td>
-</tr>
-<tr class="row-odd"><td>saveButtonText</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: SAVE_BUTTON_TEXT</td>
-</tr>
-<tr class="row-even"><td>saveButtonTooltip</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: SAVE_BUTTON_TOOLTIP</td>
-</tr>
-<tr class="row-odd"><td>saveButtonClass</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: SAVE_BUTTON_CLASS</td>
-</tr>
-<tr class="row-even"><td>saveButtonGlyphIcon</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: SAVE_BUTTON_GLYPH_ICON</td>
-</tr>
-<tr class="row-odd"><td>closeButtonText</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: CLOSE_BUTTON_TEXT</td>
-</tr>
-<tr class="row-even"><td>closeButtonTooltip</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: CLOSE_BUTTON_TOOLTIP</td>
-</tr>
-<tr class="row-odd"><td>closeButtonClass</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: CLOSE_BUTTON_CLASS</td>
-</tr>
-<tr class="row-even"><td>closeButtonGlyphIcon</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: CLOSE_BUTTON_GLYPH_ICON</td>
-</tr>
-<tr class="row-odd"><td>deleteButtonText</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: DELETE_BUTTON_TEXT</td>
-</tr>
-<tr class="row-even"><td>deleteButtonTooltip</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: DELETE_BUTTON_TOOLTIP</td>
-</tr>
-<tr class="row-odd"><td>deleteButtonClass</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: DELETE_BUTTON_CLASS</td>
-</tr>
-<tr class="row-even"><td>deleteButtonGlyphIcon</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: DELETE_BUTTON_GLYPH_ICON</td>
-</tr>
-<tr class="row-odd"><td>newButtonText</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: NEW_BUTTON_TEXT</td>
-</tr>
-<tr class="row-even"><td>newButtonTooltip</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: NEW_BUTTON_TOOLTIP</td>
-</tr>
-<tr class="row-odd"><td>newButtonClass</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: NEW_BUTTON_CLASS</td>
-</tr>
-<tr class="row-even"><td>newButtonGlyphIcon</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: NEW_BUTTON_GLYPH_ICON</td>
-</tr>
-<tr class="row-odd"><td>extraButtonInfoClass</td>
-<td>string</td>
-<td>Overwrite default from config.qfq.ini: EXTRA_BUTTON_INFO_CLASS</td>
-</tr>
-</tbody>
-</table>
-<ul class="simple">
-<li>Example:<ul>
-<li>maxVisiblePill = 5</li>
-<li>class = container-fluid</li>
-<li>classBody = qfq-form-right</li>
-</ul>
-</li>
-</ul>
-<div class="section" id="submitbuttontext">
-<h4>submitButtonText<a class="headerlink" href="#submitbuttontext" title="Permalink to this headline">¶</a></h4>
-<p>If specified and non empty, display a regular submit button at the bottom of the page with the given text.
-This gives the form a ordinary HTML-form look&#8217;n&#8217; feel. With this option, the standard buttons on the top right border
-should be hided to not confuse the user.</p>
-<ul class="simple">
-<li>Optional.</li>
-<li>Default: Empty</li>
-</ul>
-</div>
-<div class="section" id="class">
-<h4>class<a class="headerlink" href="#class" title="Permalink to this headline">¶</a></h4>
-<ul class="simple">
-<li>Optional.</li>
-<li>Default: <cite>container</cite></li>
-<li>Any CSS class name(s) can be specified.</li>
-<li>Check <cite>typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css</cite> for predefined classes.</li>
-<li>Typical use: adjust the floating rules of the form.
-* See: <a class="reference external" href="http://getbootstrap.com/css/#overview-container">http://getbootstrap.com/css/#overview-container</a>
-* Expand the form over the whole area: <cite>container-fluid</cite></li>
-</ul>
-</div>
-<div class="section" id="classpill">
-<h4>classPill<a class="headerlink" href="#classpill" title="Permalink to this headline">¶</a></h4>
-<ul class="simple">
-<li>Optional.</li>
-<li>Default: <cite>qfq-color-grey-1</cite></li>
-<li>Any CSS class name(s) can be specified.</li>
-<li>Check <cite>typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css</cite> for predefined classes.</li>
-<li>Typical use: adjust the background color of the <cite>pill title</cite> area.</li>
-<li>Predefined background colors: <cite>qfq-color-white</cite>, <cite>qfq-color-grey-1</cite> (dark), <cite>qfq-color-grey-2</cite> (light),
-<cite>qfq-color-blue-1</cite> (dark), <cite>qfq-color-blue-2</cite>. (light)</li>
-<li><cite>classPill</cite> is only visible on forms with container elemants of type &#8216;Pill&#8217;.</li>
-</ul>
-</div>
-<div class="section" id="classbody">
-<h4>classBody<a class="headerlink" href="#classbody" title="Permalink to this headline">¶</a></h4>
-<ul class="simple">
-<li>Optional.</li>
-<li>Default: <cite>qfq-color-grey-2</cite></li>
-<li>Any CSS class name(s) can be specified.</li>
-<li>Check <cite>typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css</cite> for predefined classes.</li>
-<li>Typical use:<ul>
-<li>adjust the background color of the <em>FormElement</em> area.</li>
-<li>make all form labels right align: <cite>qfq-form-right</cite>.</li>
-</ul>
-</li>
-<li>Predefined background colors: <cite>qfq-color-white</cite>, <cite>qfq-color-grey-1</cite> (dark), <cite>qfq-color-grey-2</cite> (light),
-<cite>qfq-color-blue-1</cite> (dark), <cite>qfq-color-blue-2</cite>. (light)</li>
-</ul>
-</div>
-<div class="section" id="extradeleteform">
-<h4>extraDeleteForm<a class="headerlink" href="#extradeleteform" title="Permalink to this headline">¶</a></h4>
-<p>Depending on the database definition, it might be necessary to delete the primary record <em>and</em> corresponding slave records.
-To not repeat such &#8216;slave record delete definition&#8217;, an &#8216;extraDeleteForm&#8217; can be specified. If the user opens a record
-in a form and clicks on the &#8216;delete&#8217; button, a defined &#8216;extraDeleteForm&#8217;-form will be used to delete primary and slave
-records instead of using the current form.
-E.g. if there are multiple different forms to work on the same table, all of theses forms might reference to the same
-&#8216;extraDeleteForm&#8217;-form. This simplifies the maintenance.</p>
-<p>The &#8216;extraDeleteForm&#8217; parameter might be specified for a &#8216;form&#8217; and/or for &#8216;subrecords&#8217;</p>
-<p>See also: <a class="reference internal" href="#delete-record">delete-record</a>.</p>
-</div>
-<div class="section" id="form-mode-global">
-<span id="id20"></span><h4>Form mode global<a class="headerlink" href="#form-mode-global" title="Permalink to this headline">¶</a></h4>
-<p>The Form global mode <cite>mode</cite> is given by default with <cite>{{formModeGlobal:SE:alnumx}}</cite>.</p>
-<p>Optional it might be defined via <em>Form.parameter</em></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">mode</span><span class="o">=</span><span class="nx">readonly</span><span class="o">|</span><span class="nx">requiredOff</span>
-</pre></div>
-</div>
-<ul class="simple">
-<li><cite>readonly</cite>: all <cite>FormElement</cite> of the whole form are temporarily in <cite>readonly</cite> mode. This is a fast way to use an
-existing <em>Form</em> just to display the form data, without a possibility for the user to change any data of the form.</li>
-<li><cite>requiredOff</cite>: all <cite>FormElement</cite> of the whole, with <cite>mode=required</cite>, will temporarily switch to <cite>mode=show</cite>. In this
-mode, the user might save the form without providing all necessary data. Later on, when application logic requires a
-final submit, this mode is not used any longer (call the form as regular without the &#8216;formModeGlobal&#8217; parameter) and
-the form can only be saved with all data given.
-Than, e.g. an action-FormElement &#8216;afterSave&#8217; can be used to detect the final submit situation and do some extra stuff,
-necessary for the final submit.</li>
-</ul>
-<p>The following shows the same <em>Form</em> in the <cite>regular</cite>, <cite>readonly</cite> and <cite>requiredOff</cite> mode:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;from&amp;form=person&amp;r=&#39;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span><span class="p">,</span> <span class="s1">&#39;|Regular&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="nx">_Pagee</span><span class="p">,</span>
-                <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;from&amp;form=person&amp;formModeGlobal=readonly&amp;r=&#39;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span><span class="p">,</span> <span class="s1">&#39;|Readonly&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="nx">_Pagee</span><span class="p">,</span>
-                <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;from&amp;form=person&amp;formModeGlobal=requiredOff&amp;r=&#39;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span><span class="p">,</span> <span class="s1">&#39;|Required off&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="nx">_Pagee</span>
-                <span class="nx">FROM</span> <span class="nx">Person</span> <span class="k">AS</span> <span class="nx">p</span>
-</pre></div>
-</div>
-</div>
-</div>
-</div>
-<div class="section" id="formelements">
-<h2>FormElements<a class="headerlink" href="#formelements" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>Each <em>form</em> contains one or more <em>FormElement</em>.</li>
-<li>The <em>FormElements</em> are divided in three categories:<ul>
-<li><a class="reference internal" href="#class-container">class-container</a></li>
-<li><a class="reference internal" href="#class-native">class-native</a></li>
-<li><a class="reference internal" href="#class-action">class-action</a></li>
-</ul>
-</li>
-<li>Ordering and grouping: Native <em>FormElements</em> and Container-Elements (both with feIdContainer=0) will be ordered by &#8216;ord&#8217;.</li>
-<li>Inside of a container, all nested elements will be displayed.</li>
-<li>Technical, it&#8217;s <em>not</em> necessary to configure a FormElement for the primary index column <cite>id</cite>.</li>
-<li>Additional options to a <em>FormElement</em> will be configured via the <em>FormElement.parameter</em> field (analog to <em>Form.parameter</em>
-for <em>Forms</em> ).<ul>
-<li>See also: <a class="reference internal" href="#comment-space-character">comment-space-character</a></li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="class-container">
-<span id="id21"></span><h2>Class: Container<a class="headerlink" href="#class-container" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>Pills are containers for &#8216;fieldset&#8217; <em>and</em> / <em>or</em> &#8216;native&#8217; <em>FormElements</em>.</li>
-<li>Fieldsets are containers for &#8216;native&#8217; <em>FormElements</em>.</li>
-<li>TemplateGroups are containers for &#8216;fieldset&#8217; <em>and</em> / <em>or</em> &#8216;native&#8217; <em>FormElements</em>.</li>
-</ul>
-<div class="section" id="type-fieldset">
-<h3>Type: fieldset<a class="headerlink" href="#type-fieldset" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Native <em>FormElements</em> can be assigned to a fieldset.</li>
-<li>FormElement settings:<ul>
-<li><em>name</em>: technical name, used as HTML identifier.</li>
-<li><em>label</em>: Shown title of the fieldset.</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="type-pill">
-<h3>Type: pill<a class="headerlink" href="#type-pill" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Pill is synonymous for a tab. A pill looks like a tab.</li>
-<li>Pills are only available with mode render=&#8217;bootstrap&#8217;.</li>
-<li>If there is at least one pill defined, every native <em>FormElement</em> needs to be assigned to a pill or to a fieldset.</li>
-<li>If there is at least one pill defined, every <em>fieldset</em> needs to be assigned to a pill.</li>
-<li>Pills are not &#8216;dynamicUpdate&#8217; aware (at the moment). At least during form load, <em>modeSql</em> can be dynamically computed to
-switch the pill in show / readonly (disabled) / hidden state.</li>
-<li>FormElement settings:<ul>
-<li><em>name</em>: technical name, used as HTML identifier.</li>
-<li><em>label</em>: Label shown on the corresponding pill button or inside the drop-down menu.</li>
-<li><em>mode</em>:<ul>
-<li><em>show</em>, <em>required</em>: regular mode. The pill will be shown.</li>
-<li><em>readonly</em>: the pill and it&#8217;s name is visible, but not clickable.</li>
-<li><em>hidden</em>: the pill is not shown at all.</li>
-</ul>
-</li>
-<li><em>modeSql</em>:</li>
-<li><em>type</em>: <em>pill</em></li>
-<li><em>feIdContainer</em>: <cite>0</cite>  - Pill&#8217;s can&#8217;t be nested.</li>
-<li><em>parameter</em>:<ul>
-<li><em>maxVisiblePill</em>: <cite>&lt;nr&gt;</cite> - Number of Pill-Buttons shown. Undefined means unlimited. Excess Pill buttons will be
-displayed as a drop-down menu.</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="type-templategroup">
-<h3>Type: templateGroup<a class="headerlink" href="#type-templategroup" title="Permalink to this headline">¶</a></h3>
-<p><em>TemplateGroups</em> will be used to create a series of grouped (by the given <em>templateGroup</em>) <em>FormElements</em>.</p>
-<p><em>FormElements</em> can be assigned to a <em>templateGroup</em>. These <em>templateGroup</em> will be rendered upto <em>n</em>-times. On &#8216;form load&#8217;
-only a single (=first) copy of the <em>templateGroup</em> will be shown. Below the last copy of the <em>templateGroup</em> an &#8216;add&#8217;-button is
-shown. If the user click on it, an additional copy of the <em>templateGroup</em> is displayed. This can be repeated up to
-<em>templateGroup.maxLength</em> times. Also, the user can &#8216;remove&#8217; previously created copies by clicking on a remove button near
-beside every <em>templateGroup</em>. The first copy of a templateGroup can&#8217;t be removed.</p>
-<ul class="simple">
-<li>FormElement settings:<ul>
-<li><em>label</em>: Shown in the FormElement-editor <em>container</em> field.</li>
-<li><em>maxLength</em>: Maximum number of copies of the current <em>templateGroup</em>. Default: 5.</li>
-<li><em>bsLabelColumn</em>, <em>bsInputColumn</em>, <em>bsNoteColumn</em>: column widths for row with the &#8216;Add&#8217; button.</li>
-<li><em>parameter</em>:<ul>
-<li><em>tgAddClass</em>: Class of the &#8216;add&#8217; button. Default: <cite>btn btn-default</cite>.</li>
-<li><em>tgAddText</em>: Text shown on the button. Default: <cite>Add</cite>.</li>
-<li><em>tgRemoveClass</em>: Class of the &#8216;remove&#8217; button. Default: <cite>btn btn-default</cite>.</li>
-<li><em>tgRemoveText</em>: Text shown on the button. Default: <cite>Remove</cite>.</li>
-<li><em>tgClass</em>: Class wrapped around every copy of the <em>templateGroup</em>.
-E.g. the class <cite>qfq-child-margin-top</cite> adds a margin between two copies of the <em>templateGroup</em>. Default: empty</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-<p>Multiple <em>templateGroups</em> per form are allowed.</p>
-<p>The name of the native FormElements, inside the templateGroup, which represents the effective table columns, uses the placeholder
-<cite>%d</cite>. E.g. the columns <cite>grade1</cite>, <cite>grade2</cite>, <cite>grade3</cite> needs a <em>FormElement.name</em> = <cite>grade%d</cite>. The counting will always start with 1.
-The placeholder <cite>%d</cite> can also be used in the <em>FormElement.label</em></p>
-<p>Example of styling the Add/ Delete Button: <a class="reference internal" href="#example-class-template-group"><span class="std std-ref">Icons Template Group</span></a></p>
-<div class="section" id="column-primary-record">
-<h4>Column: primary record<a class="headerlink" href="#column-primary-record" title="Permalink to this headline">¶</a></h4>
-<p>If the columns <cite>&lt;name&gt;%d</cite> are real columns on the primary table, saving and delete (=empty string) are done automatically.
-E.g. if there are upto five elements <cite>grade1, ..., grade5</cite> and the user inputs only the first three, the remaining will be set
-to an empty string.</p>
-</div>
-<div class="section" id="column-non-primary-record">
-<h4>Column: non primary record<a class="headerlink" href="#column-non-primary-record" title="Permalink to this headline">¶</a></h4>
-<p>Additional logic is required to load, update, insert and/or delete slave records.</p>
-<div class="section" id="load">
-<h5>Load<a class="headerlink" href="#load" title="Permalink to this headline">¶</a></h5>
-<p>On each native <em>FormElement</em> of the <em>templateGroup</em> define a SQL query in the <em>FormElement.value</em> field. The query has to
-select <strong>all</strong> values of all possible existing copies of the <em>FormElement</em> - therefore the exclamation mark is necessary.
-Also define the order. E.g. <em>FormElement.value</em>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="o">!</span><span class="nx">SELECT</span> <span class="nx">street</span> <span class="nx">FROM</span> <span class="nx">Address</span> <span class="nx">WHERE</span> <span class="nx">personId</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="p">}}</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">id</span><span class="p">}}</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="insert-update-delete">
-<h5>Insert / Update / Delete<a class="headerlink" href="#insert-update-delete" title="Permalink to this headline">¶</a></h5>
-<p>Add an <em>action</em> record, type=&#8217;afterSave&#8217;, and assign the record to the given <em>templateGroup</em>.</p>
-<p>In the parameter field define:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">slaveId</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span> <span class="nx">FROM</span> <span class="nx">Address</span> <span class="nx">WHERE</span> <span class="nx">personId</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="p">}}</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">id</span> <span class="nx">LIMIT</span> <span class="o">%</span><span class="nx">D</span><span class="p">,</span><span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlHonorFormElements</span> <span class="o">=</span> <span class="nx">city</span><span class="o">%</span><span class="nx">d</span><span class="p">,</span> <span class="nx">street</span><span class="o">%</span><span class="nx">d</span>
-<span class="nx">sqlUpdate</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">Address</span> <span class="nx">SET</span> <span class="nx">city</span><span class="o">=</span><span class="s1">&#39;{{city%d:FE:alnumx:s}}&#39;</span><span class="p">,</span> <span class="nx">street</span><span class="o">=</span><span class="s1">&#39;{{street%d:FE:alnumx:s}}&#39;</span>  <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlInsert</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">INSERT</span> <span class="nx">INTO</span> <span class="nx">Address</span> <span class="p">(</span><span class="sb">`personId`</span><span class="p">,</span> <span class="sb">`city`</span><span class="p">,</span> <span class="sb">`street`</span><span class="p">)</span> <span class="nx">VALUES</span> <span class="p">({{</span><span class="nx">id</span><span class="p">}},</span> <span class="s1">&#39;{{city%d:FE:alnumx:s}}&#39;</span> <span class="p">,</span> <span class="s1">&#39;{{street%d:FE:alnumx:s}}&#39;</span><span class="p">)</span> <span class="p">}}</span>
-<span class="nx">sqlDelete</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">DELETE</span> <span class="nx">FROM</span> <span class="nx">Address</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-</pre></div>
-</div>
-<p>The <cite>slaveId</cite> needs attention: the placeholder <cite>%d</cite> starts always at 1. The <cite>LIMIT</cite> directive starts at 0 - therefore
-use <cite>%D</cite> instead of <cite>%d</cite>, cause <cite>%D</cite> is always one below <cite>%d</cite> - but can <strong>only</strong> be used on the action element.</p>
-</div>
-</div>
-</div>
-</div>
-<div class="section" id="class-native">
-<span id="id22"></span><h2>Class: Native<a class="headerlink" href="#class-native" title="Permalink to this headline">¶</a></h2>
-<p>Fields:</p>
-<table border="1" class="docutils">
-<colgroup>
-<col width="14%" />
-<col width="19%" />
-<col width="67%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Type</th>
-<th class="head">Description</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>Container</td>
-<td>int</td>
-<td>0 or <em>FormElement</em>.id of container element (pill, fieldSet, templateGroup) part the current <em>Form</em></td>
-</tr>
-<tr class="row-odd"><td>Enabled</td>
-<td>enum(&#8216;yes&#8217;|&#8217;no&#8217;)</td>
-<td>Process the current FormElement</td>
-</tr>
-<tr class="row-even"><td>Dynamic Update</td>
-<td>enum(&#8216;yes&#8217;|&#8217;no&#8217;)</td>
-<td>In the browser, <em>FormElements</em> with &#8220;dynamicUpdate=&#8217;yes&#8217;&#8221;  will be updated depending on user
-input. <a class="reference internal" href="#dynamic-update"><span class="std std-ref">Dynamic Update</span></a></td>
-</tr>
-<tr class="row-odd"><td>Name</td>
-<td>string</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>Label</td>
-<td>string</td>
-<td>Label of <em>FormElement</em>. Depending on layout model, left or on top of the <em>FormElement</em>
-Additional label description can be added by wrapping in HTML tag &#8216;&lt;small&gt;&#8217;</td>
-</tr>
-<tr class="row-odd"><td>Mode</td>
-<td>enum(&#8216;show&#8217;, &#8216;readonly&#8217;,
-&#8216;required&#8217;,
-&#8216;disabled&#8217; )</td>
-<td><em>Show</em>: regular user input field. This is the default.
-<em>Required</em>: User has to specify a value. Typically, an &lt;empty string&gt; represents &#8216;no value&#8217;.
-<em>Readonly</em>: user can&#8217;t change any data. Data not saved.
-<em>Disabled</em>: <em>FormElement</em> is not visible.</td>
-</tr>
-<tr class="row-even"><td>Mode sql</td>
-<td><cite>SELECT</cite> statement with
-a value like in <cite>mode</cite></td>
-<td>A value given here overwrites the setting from <cite>mode</cite>. Most usefull with <a class="reference internal" href="#dynamic-update"><span class="std std-ref">Dynamic Update</span></a>.
-E.g.: {{SELECT IF( &#8216;{{otherFunding:FR:alnumx}}&#8217;=&#8217;yes&#8217; ,&#8217;show&#8217;, &#8216;hidden&#8217; }}</td>
-</tr>
-<tr class="row-odd"><td>Class</td>
-<td>enum(&#8216;native&#8217;, &#8216;action&#8217;,
-&#8216;container&#8217;)</td>
-<td>Details below.</td>
-</tr>
-<tr class="row-even"><td>Type</td>
-<td colspan="2">enum(&#8216;checkbox&#8217;, &#8216;date&#8217;, &#8216;time&#8217;, &#8216;datetime&#8217;,  &#8216;dateJQW&#8217;, &#8216;datetimeJQW&#8217;, &#8216;extra&#8217;, &#8216;gridJQW&#8217;, &#8216;text&#8217;, &#8216;editor&#8217;, &#8216;note&#8217;,
-&#8216;password&#8217;, &#8216;radio&#8217;, &#8216;select&#8217;, &#8216;subrecord&#8217;, &#8216;upload&#8217;, &#8216;fieldset&#8217;, &#8216;pill&#8217;, &#8216;beforeLoad&#8217;, &#8216;beforeSave&#8217;,
-&#8216;beforeInsert&#8217;, &#8216;beforeUpdate&#8217;, &#8216;beforeDelete&#8217;, &#8216;afterLoad&#8217;, &#8216;afterSave&#8217;, &#8216;afterInsert&#8217;, &#8216;afterUpdate&#8217;, &#8216;afterDelete&#8217;,
-&#8216;sendMail&#8217;)</td>
-</tr>
-<tr class="row-odd"><td>Encode</td>
-<td>&#8216;none&#8217;, &#8216;specialchar&#8217;</td>
-<td>With &#8216;specialchar&#8217; (default) the chars &lt;&gt;&#8221;&#8217;&amp; will be encoded to their htmlentity. <span class="target" id="field-encode">field-encode</span></td>
-</tr>
-<tr class="row-even"><td>Check Type</td>
-<td>enum(&#8216;min|max&#8217;, &#8216;pattern&#8217;,
-&#8216;number&#8217;, &#8216;email&#8217;)</td>
-<td><span class="target" id="field-checktype">field-checkType</span></td>
-</tr>
-<tr class="row-odd"><td>Check Pattern</td>
-<td>&#8216;regexp&#8217;</td>
-<td>If $checkType==&#8217;pattern&#8217;: pattern to match</td>
-</tr>
-<tr class="row-even"><td>Order</td>
-<td>string</td>
-<td>Display order of <em>FormElements</em> (&#8216;order&#8217; is a reserved keyword)  <span class="target" id="field-ord">field-ord</span></td>
-</tr>
-<tr class="row-odd"><td>tabindex</td>
-<td>string</td>
-<td>HTML tabindex attribute   <span class="target" id="field-tabindex">field-tabindex</span></td>
-</tr>
-<tr class="row-even"><td>Size</td>
-<td>string</td>
-<td>Visible length of input element. Might be ommited, depending on the choosen form layout.
-Format: &lt;width&gt;,&lt;height&gt; (in characters)   <span class="target" id="field-size">field-size</span></td>
-</tr>
-<tr class="row-odd"><td>BS Label Columns</td>
-<td>string</td>
-<td>Number of bootstrap grid columns for label. By default empty, value inherits from the form.
-<span class="target" id="field-bslabelcolumns">field-bsLabelColumns</span></td>
-</tr>
-<tr class="row-even"><td>BS Input Columns</td>
-<td>string</td>
-<td>Number of bootstrap grid columns for input. By default empty, value inherits from the form.</td>
-</tr>
-<tr class="row-odd"><td>BS Note Columns</td>
-<td>string</td>
-<td>Number of bootstrap grid columns for note. By default empty, value inherits from the form.</td>
-</tr>
-<tr class="row-even"><td>Label / Input / Note</td>
-<td>enum(...)</td>
-<td>Switch on/off opening|closing of bootstrap form classes <span class="target" id="field-rowlabelinputnote">field-rowLabelInputNote</span></td>
-</tr>
-<tr class="row-odd"><td>Maxlength</td>
-<td>string</td>
-<td>Maximum characters for input. <span class="target" id="field-maxlength">field-maxLength</span></td>
-</tr>
-<tr class="row-even"><td>Note</td>
-<td>string</td>
-<td>Note of <em>FormElement</em>. Depending on layout model, right or below of the <em>FormElement</em>. <span class="target" id="field-note">field-note</span></td>
-</tr>
-<tr class="row-odd"><td>Tooltip</td>
-<td>text</td>
-<td>Display this text as tooltip on mouse over.  <span class="target" id="field-tooltip">field-tooltip</span></td>
-</tr>
-<tr class="row-even"><td>Placeholder</td>
-<td>string</td>
-<td>Text, displayed inside the input element in light grey. <span class="target" id="field-placeholder">field-placeholder</span></td>
-</tr>
-<tr class="row-odd"><td>value</td>
-<td>text</td>
-<td>Default value: See <a class="reference internal" href="#field-value">field-value</a></td>
-</tr>
-<tr class="row-even"><td>sql1</td>
-<td>text</td>
-<td>SQL query</td>
-</tr>
-<tr class="row-odd"><td>Parameter</td>
-<td>text</td>
-<td>Might contain misc parameter. See <a class="reference internal" href="#fe-parameter-attributes">fe-parameter-attributes</a></td>
-</tr>
-<tr class="row-even"><td>feGroup</td>
-<td>string</td>
-<td>Comma-separated list of Typo3 FE Group ID. NOT SURE IF THIS WILL BE IMPLEMENTED. Native
-<em>FormElements</em>, fieldsets and pills can be assigned to feGroups. Group status: show, hidden,
-disabled. Group Access: FE-Groups. User will be assigned to FE-Groups and the form definition
-reference such FE-groups. Easy way of granting permission.</td>
-</tr>
-<tr class="row-odd"><td>Deleted</td>
-<td>string</td>
-<td>&#8216;yes&#8217;|&#8217;no&#8217;.</td>
-</tr>
-</tbody>
-</table>
-<div class="section" id="fe-value">
-<span id="field-value"></span><h3>FE: Value<a class="headerlink" href="#fe-value" title="Permalink to this headline">¶</a></h3>
-<p>By default this field is empty: QFQ will fill it with the corresponding existing column value on form load.
-For a customized default value define:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="nx">SELECT</span> <span class="k">IF</span><span class="p">(</span><span class="s1">&#39;{{column:RE}}&#39;</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span><span class="s1">&#39;custom default&#39;</span><span class="p">,{{</span><span class="nx">column</span><span class="o">:</span><span class="nx">R</span><span class="p">}})</span> <span class="p">}}</span>
-</pre></div>
-</div>
-<p>For non primary records, this is the place to load an existing value. E.g. we&#8217;re on a &#8216;Person&#8217; detail form and would like
-to edit, on the same form, a corresponding person email address (which is in a separate table):</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">a</span><span class="o">.</span><span class="nx">email</span> <span class="nx">FROM</span> <span class="nx">Address</span> <span class="k">AS</span> <span class="nx">a</span> <span class="nx">WHERE</span> <span class="nx">a</span><span class="o">.</span><span class="nx">pId</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">a</span><span class="o">.</span><span class="nx">id</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="fe-report-notation">
-<h3>FE: &#8216;Report&#8217; notation<a class="headerlink" href="#fe-report-notation" title="Permalink to this headline">¶</a></h3>
-<p>The FE fields &#8216;value&#8217; and &#8216;note&#8217; understand the <a class="reference internal" href="#report">Report</a> syntax. Nested SQL queries as well as links with SIP encoding
-are possible. To distinguish between &#8216;Form&#8217; and &#8216;Report&#8217; syntax, the first line has to be <cite>#!report</cite></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1">#!report</span>
-
-<span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="o">...</span>
-
-<span class="mi">20</span> <span class="p">{</span>
-  <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="o">...</span>
-  <span class="mf">5.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="o">...</span>
-<span class="p">}</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="attributes-defined-in-the-parameter-field">
-<span id="fe-parameter-attributes"></span><h3>Attributes defined in the parameter field<a class="headerlink" href="#attributes-defined-in-the-parameter-field" title="Permalink to this headline">¶</a></h3>
-<p>See also at specific <em>FormElement</em> definitions.</p>
-<table border="1" class="docutils">
-<colgroup>
-<col width="17%" />
-<col width="6%" />
-<col width="77%" />
-</colgroup>
-<tbody valign="top">
-<tr class="row-odd"><td>Name</td>
-<td>Type</td>
-<td>Note</td>
-</tr>
-<tr class="row-even"><td>data-pattern-error</td>
-<td>string</td>
-<td>Pattern violation: Text for error message used for all FormElements of current form</td>
-</tr>
-<tr class="row-odd"><td>data-required-error</td>
-<td>string</td>
-<td>Required violation: Text for error message used for all FormElements of current form</td>
-</tr>
-<tr class="row-even"><td>data-match-error</td>
-<td>string</td>
-<td>Match violation: Text for error message used for all FormElements of current form</td>
-</tr>
-<tr class="row-odd"><td>data-error</td>
-<td>string</td>
-<td>If none specific is defined: Text for error message used for all FormElements of current form</td>
-</tr>
-<tr class="row-even"><td>htmlBefore</td>
-<td>string</td>
-<td>HTML Code wrapped before the complete <em>FormElement</em></td>
-</tr>
-<tr class="row-odd"><td>htmlAfter</td>
-<td>string</td>
-<td>HTML Code wrapped after the complete <em>FormElement</em></td>
-</tr>
-<tr class="row-even"><td>wrapRow</td>
-<td>string</td>
-<td rowspan="4">If specified, skip default wrapping (<cite>&lt;div class=&#8217;col-md-?&gt;</cite>). Instead the given string is used.</td>
-</tr>
-<tr class="row-odd"><td>wrapLabel</td>
-<td>string</td>
-</tr>
-<tr class="row-even"><td>wrapInput</td>
-<td>string</td>
-</tr>
-<tr class="row-odd"><td>wrapNote</td>
-<td>string</td>
-</tr>
-<tr class="row-even"><td>extraButtonLock</td>
-<td>none</td>
-<td>No value. Show a &#8216;lock&#8217; on the right side of the input element. See <a class="reference internal" href="#extrabuttonlock">extraButtonLock</a></td>
-</tr>
-<tr class="row-odd"><td>extraButtonPassword</td>
-<td>none</td>
-<td>No value. Show an &#8216;eye&#8217; on the right side of the input element. See <a class="reference internal" href="#extrabuttonpassword">extraButtonPassword</a></td>
-</tr>
-<tr class="row-even"><td>extraButtonInfo</td>
-<td>string</td>
-<td>Text. Show an &#8216;i&#8217; on the right side of the input element. See <a class="reference internal" href="#extrabuttoninfo">extraButtonInfo</a></td>
-</tr>
-<tr class="row-odd"><td>extraButtonInfoClass</td>
-<td>string</td>
-<td>By default empty. Specify any class to be assigned to wrap extraButtonInfo</td>
-</tr>
-<tr class="row-even"><td>autofocus</td>
-<td>string</td>
-<td>See <a class="reference internal" href="#input-option-autofocus">input-option-autofocus</a></td>
-</tr>
-<tr class="row-odd"><td>checkBoxMode
-checked
-unchecked
-label2
-itemList
-emptyHide
-emptyItemAtStart
-emptyItemAtEnd
-buttonClass</td>
-<td>string
-string
-string
-string
-string
-string
-string
-string
-string</td>
-<td>See <a class="reference internal" href="#input-checkbox">input-checkbox</a>, <a class="reference internal" href="#input-radio">input-radio</a>, <a class="reference internal" href="#input-select">input-select</a></td>
-</tr>
-<tr class="row-even"><td>dateFormat</td>
-<td>string</td>
-<td>yyyy-mm-dd | dd.mm.yyyy</td>
-</tr>
-<tr class="row-odd"><td>showSeconds</td>
-<td>string</td>
-<td>0|1 - Shows the seconds on form load. Default: 0</td>
-</tr>
-<tr class="row-even"><td>showZero</td>
-<td>string</td>
-<td>0|1 - Empty timestamp: &#8216;0&#8217;(default) - nothing shown, &#8216;1&#8217; - the string &#8216;0000-00-00 00:00:00&#8217; is displayed</td>
-</tr>
-<tr class="row-odd"><td>retype
-retypeLabel
-retypeNote
-characterCountWrap
-hideZero
-emptyMeansNull</td>
-<td>string
-string
-string
-string
-string
-string</td>
-<td>See <a class="reference internal" href="#input-text">input-text</a></td>
-</tr>
-<tr class="row-even"><td>typeAheadLimit
-typeAheadMinLength
-typeAheadSql</td>
-<td>string
-string
-string</td>
-<td>See <a class="reference internal" href="#input-typeahead">input-typeahead</a></td>
-</tr>
-<tr class="row-odd"><td>editor-plugins
-editor-toolbar
-editor-statusbar</td>
-<td>string
-string
-string</td>
-<td>See <a class="reference internal" href="#input-editor">input-editor</a></td>
-</tr>
-<tr class="row-even"><td>form
-page
-title
-extraDeleteForm
-detail
-subrecordTableClass</td>
-<td>string
-string
-string
-string
-string
-string</td>
-<td>See <a class="reference internal" href="#subrecord-option">subrecord-option</a></td>
-</tr>
-<tr class="row-odd"><td>capture
-accept
-maxFileSize
-fileDestination
-slaveId
-fileReplace
-sqlBefore
-sqlInsert
-sqlUpdate
-sqlDelete
-sqlAfter</td>
-<td>string
-string
-string
-string
-string
-string
-string
-string
-string
-string
-string</td>
-<td>See <a class="reference internal" href="#input-upload">input-upload</a></td>
-</tr>
-<tr class="row-even"><td>fileButtonText</td>
-<td>string</td>
-<td>Overwrite default &#8216;Choose File&#8217;</td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="section" id="effect-matrix">
-<h3>Effect matrix<a class="headerlink" href="#effect-matrix" title="Permalink to this headline">¶</a></h3>
-<table border="1" class="docutils">
-<colgroup>
-<col width="14%" />
-<col width="7%" />
-<col width="6%" />
-<col width="9%" />
-<col width="7%" />
-<col width="6%" />
-<col width="5%" />
-<col width="4%" />
-<col width="7%" />
-<col width="5%" />
-<col width="6%" />
-<col width="8%" />
-<col width="6%" />
-<col width="6%" />
-<col width="6%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Attribute</th>
-<th class="head">checkbox</th>
-<th class="head">dateJQW</th>
-<th class="head">datetimeJQW</th>
-<th class="head">gridJQW</th>
-<th class="head">extra</th>
-<th class="head">text</th>
-<th class="head">note</th>
-<th class="head">password</th>
-<th class="head">radio</th>
-<th class="head">select</th>
-<th class="head">subrecord</th>
-<th class="head">timeJQW</th>
-<th class="head">upload</th>
-<th class="head">editor</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>id</td>
-<td colspan="14">Internal id</td>
-</tr>
-<tr class="row-odd"><td>formId</td>
-<td colspan="13">Form</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>containerId</td>
-<td colspan="13">Assign the <em>FormElement</em> to user defined fieldSet or pill</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>enabled</td>
-<td colspan="13"><em>FormElement</em> is active or not</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>name</td>
-<td colspan="13">Name of a column of the primary table. <em>FormElements</em> with a corresponding table will be saved automatically.</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>label</td>
-<td colspan="13">Label shown to the user.</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>mode</td>
-<td colspan="13">show, readonly, required, lock, disable.</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>class</td>
-<td colspan="13">native</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>type</td>
-<td>checkbox</td>
-<td>dateJQW</td>
-<td>datetimeJQW</td>
-<td>gridJQW</td>
-<td>extra</td>
-<td>text</td>
-<td>note</td>
-<td>password</td>
-<td>radio</td>
-<td>select</td>
-<td>subrecord</td>
-<td>timeJQW</td>
-<td>upload</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>checkType</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-even"><td>checkPattern</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-odd"><td>onChange</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-even"><td>ord</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-odd"><td>tabindex</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-even"><td>size</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li>2</li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li>?</li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-odd"><td>maxLength</td>
-<td>1</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li>1</li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>note</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-odd"><td>tooltip</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>?</td>
-</tr>
-<tr class="row-even"><td>placeholder</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-odd"><td>clientJs</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-even"><td>value</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-odd"><td>sql1</td>
-<td colspan="14">?</td>
-</tr>
-<tr class="row-even"><td colspan="15"><em>Additional attributes in Field &#8216;parameter&#8217;. Typically in key=value format.</em></td>
-</tr>
-<tr class="row-odd"><td>type</td>
-<td>checkbox</td>
-<td>dateJQW</td>
-<td>datetimeJQW</td>
-<td>gridJQW</td>
-<td>extra</td>
-<td>text</td>
-<td>note</td>
-<td>password</td>
-<td>radio</td>
-<td>select</td>
-<td>subrecord</td>
-<td>timeJQW</td>
-<td>upload</td>
-<td>editor</td>
-</tr>
-<tr class="row-even"><td>accept</td>
-<td colspan="14">?</td>
-</tr>
-<tr class="row-odd"><td>alt</td>
-<td colspan="13">?</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>autocomplete</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>autofocus</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-even"><td>checkBoxMode</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>checked</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>unchecked</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>label2</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>itemList</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>emptyItemAtStart</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>emptyItemAtEnd</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>emptyHide</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>retype</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>accept</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li>3</li>
-</ul>
-</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>slaveId</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>fileDestination</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>sqlBefore</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>sqlInsert</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>sqlDelete</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>sqlAfter</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>extraButtonLock</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>extraButtonPassword</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>extraButtonInfo</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-</tbody>
-</table>
-<ul class="simple">
-<li>1: A line break created every &lt;size&gt; elements. Easy way to make checkboxes or radio vertical instead of horizontal.</li>
-<li>2: Any number &gt;1 makes the &#8216;select&#8217; input &#8216;multiple&#8217; ready.</li>
-<li>3: Accepted file mime types. See: <a class="reference external" href="https://www.w3.org/TR/html5/forms.html#file-upload-state-(type=file">https://www.w3.org/TR/html5/forms.html#file-upload-state-(type=file</a>)</li>
-</ul>
-<div class="section" id="native-formelements">
-<h4>Native <em>FormElements</em><a class="headerlink" href="#native-formelements" title="Permalink to this headline">¶</a></h4>
-<ul class="simple">
-<li>Like &#8216;input&#8217;, &#8216;checkbox&#8217;, ...</li>
-</ul>
-<div class="section" id="autofocus">
-<span id="input-option-autofocus"></span><h5>autofocus<a class="headerlink" href="#autofocus" title="Permalink to this headline">¶</a></h5>
-<p>The first <em>FormElement</em> with this attribute will get the focus after form load. If there is no such attribute
-given to any <em>FormElement</em>, the attribute will be automatically assigned to the first editable <em>FormElement</em>.</p>
-<p>To disable &#8216;autofocus&#8217; on a form, set &#8216;autofocus=0&#8217; on the first editable <em>FormElement</em>.</p>
-<p>Note: If there are multiple pills defined on a form, only the first pill will be set with &#8216;autofocus&#8217;.</p>
-</div>
-<div class="section" id="extrabuttonlock">
-<span id="id23"></span><h5>extraButtonLock<a class="headerlink" href="#extrabuttonlock" title="Permalink to this headline">¶</a></h5>
-<ul class="simple">
-<li>The user has to click on the lock, before it&#8217;s possible to change the value. This will protect data against unwanted modification.</li>
-<li>After Form load, the value is shown, but not editable.</li>
-<li>Shows a &#8216;lock&#8217; on the right side of an input element of type <cite>text</cite>, <cite>date</cite>, <cite>time</cite> or <cite>datetime</cite>.</li>
-<li>This option is not available for FormElements with <cite>mode=readonly</cite>.</li>
-<li>There is no value needed for this parameter.</li>
-</ul>
-</div>
-<div class="section" id="extrabuttonpassword">
-<span id="id24"></span><h5>extraButtonPassword<a class="headerlink" href="#extrabuttonpassword" title="Permalink to this headline">¶</a></h5>
-<ul class="simple">
-<li>The user has to click on the eye (unhide) to see the value.</li>
-<li>After Form load, the data is hided by asteriks.</li>
-<li>Shows an &#8216;eye&#8217; on the right side of an input element of type <cite>text</cite>, <cite>date</cite>, <cite>time</cite> or <cite>datetime</cite>.</li>
-<li>There is no value needed for this parameter.</li>
-</ul>
-</div>
-<div class="section" id="extrabuttoninfo">
-<span id="id25"></span><h5>extraButtonInfo<a class="headerlink" href="#extrabuttoninfo" title="Permalink to this headline">¶</a></h5>
-<ul class="simple">
-<li>The user has to click on the <cite>info</cite> button/icon to see an additional message.</li>
-<li>After Form load, the information message is hidden.</li>
-<li>The value of this parameter is the text shown.</li>
-<li>Shows an <cite>info</cite> button/icon, depending of EXTRA_BUTTON_INFO_POSITION in <a class="reference internal" href="#id5">config.qfq.ini</a><ul>
-<li><cite>auto</cite>, depending on <cite>FormElement</cite> type:<ul>
-<li>on the right side of an input element for type <cite>text</cite>, <cite>date</cite>, <cite>time</cite> or <cite>datetime</cite>,</li>
-<li>below the FormElement for all other types.</li>
-</ul>
-</li>
-<li><cite>below</cite>: below the FormElement for all types.</li>
-</ul>
-</li>
-<li>With display <cite>below</cite>, a defined class in <cite>extraButtonInfoClass</cite> (FE, F, config.qfq.ini) will be applied. E.g. this
-might be <cite>pull-right</cite> to align the grafic on the right side of the input element.</li>
-</ul>
-</div>
-</div>
-</div>
-<div class="section" id="type-checkbox">
-<span id="input-checkbox"></span><h3>Type: checkbox<a class="headerlink" href="#type-checkbox" title="Permalink to this headline">¶</a></h3>
-<p>Checkboxes can be rendered in mode:</p>
-<ul>
-<li><p class="first"><em>single</em>:</p>
-<ul class="simple">
-<li>One column in a table corresponds to one checkbox.</li>
-<li>The value for statuses <em>checked</em> and <em>unchecked</em> are free to choose.</li>
-<li>This mode is selected, if a) <em>checkBoxMode</em> = single, or b) <em>checkBoxMode</em> is missing <strong>and</strong> the number of fields of the column definition is &lt;3.</li>
-<li><em>FormElement.parameter</em>:<ul>
-<li><em>checkBoxMode</em> = single (optional)</li>
-<li><em>checked</em> = &lt;value&gt; (optional, the value which represents &#8216;checked&#8217;)<ul>
-<li>If <em>checked</em> is empty or missing: If <em>type</em> = &#8216;enum&#8217; or &#8216;set&#8217;, get first item of the definition. If <em>type</em> = string, get default.</li>
-</ul>
-</li>
-<li><em>unchecked</em> = &lt;value&gt; (optional, the value which represents &#8216;unchecked&#8217;)<ul>
-<li>If <em>unchecked</em> is empty or missing: If <em>type</em> = &#8216;enum&#8217; or &#8216;set&#8217;, get second item of checked. If <em>type</em> = &#8216;string&#8217;, get &#8216;&#8217;.</li>
-</ul>
-</li>
-<li><em>label2</em> = &lt;value&gt;       (Text right beside checkbox) (optional)</li>
-</ul>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>multi</em>:</p>
-<ul>
-<li><p class="first">One column in a table represents multiple checkboxes. This is typically useful for the column type <em>set</em>.</p>
-</li>
-<li><p class="first">The value for status <em>checked</em> are free to choose, the value for status <em>unchecked</em> is always the empty string.</p>
-</li>
-<li><p class="first">Each field key (or the corresponding value from the key/value pair) will be rendered right beside the checkbox.</p>
-</li>
-<li><p class="first"><em>FormElement.parameter</em></p>
-<ul class="simple">
-<li><em>checkBoxMode</em> = multi</li>
-<li><em>itemList</em> - E.g.:<ul>
-<li><code class="docutils literal"><span class="pre">itemList=red,blue,orange</span></code></li>
-<li><code class="docutils literal"><span class="pre">itemList=1:red,2:blue,3:orange</span></code></li>
-<li>If &#8216;:&#8217; or &#8216;,&#8217; are part of key or value, it needs to escaped by &#8216;&#8217;. E.g.: <cite>itemList=1:red:,2:blue,,3:orange`</cite></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>FormElement.sql1</em> = <code class="docutils literal"><span class="pre">{{!SELECT</span> <span class="pre">id,</span> <span class="pre">value</span> <span class="pre">FROM</span> <span class="pre">someTable}}</span></code></p>
-</li>
-<li><p class="first"><em>FormElement.maxlength</em> - vertical or horizontal alignment:</p>
-<blockquote>
-<div><ul class="simple">
-<li>Value: &#8216;&#8217;, 0, 1 - The check boxes will be aligned vertical.</li>
-<li>Value: &gt;1 - The  check boxes will be aligned horizontal, with a linebreak every &#8216;value&#8217; elements.</li>
-</ul>
-</div></blockquote>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>FormElement.parameter</em>:</p>
-<ul class="simple">
-<li><em>emptyHide</em>: Existence of this item hides an entry with an empty string. This is useful for e.g. Enums, which have an empty
-entry, but the empty value should not be selectable.</li>
-<li><em>emptyItemAtStart</em>: Existence of this item inserts an empty entry at the beginning of the selectlist.</li>
-<li><em>emptyItemAtEnd</em>: Existence of this item inserts an empty entry at the end of the selectlist.</li>
-<li><em>buttonClass</em>: Instead of the plain HTML  checkbox fields, Bootstrap
-<a class="reference external" href="http://getbootstrap.com/javascript/#buttons-checkbox-radio">buttons</a>. are rendered as <cite>checkbox</cite> elements. Use
-one of the following <a class="reference external" href="http://getbootstrap.com/css/#buttons-options">classes</a>:
-* <cite>btn-default</cite> (default, grey),
-* <cite>btn-primary</cite> (blue),
-* <cite>btn-success</cite> (green),
-* <cite>btn-info</cite> (light blue),
-* <cite>btn-warning</cite> (orange),
-* <cite>btn-danger</cite> (red).
-With a given <em>buttonClass</em>, all buttons (=radios) are rendered horizontal. A value in <em>FormElement.maxlength</em> has no effect.</li>
-</ul>
-</li>
-<li><p class="first"><em>No preselection</em>:</p>
-<ul>
-<li><p class="first">If a form is in &#8216;new&#8217; mode and if there is a default value configured on a table column, such a value is shown by default.
-There might be situations, where the user should be forced to select a value (e.g. specifying the gender). An unwanted
-default value can be suppressed by specifying an explicit definition on the FormElement field <cite>value</cite>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="o">&lt;</span><span class="nx">columnname</span><span class="o">&gt;:</span><span class="nx">RZ</span><span class="p">}}</span>
-</pre></div>
-</div>
-<p>For existing records the shown value is as expected the value of the record. For new records, it&#8217;s the value <cite>0</cite>,
-which is typically not one of the ENUM / SET values and therefore nothing is selected.</p>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="type-date">
-<h3>Type: date<a class="headerlink" href="#type-date" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Range datetime: &#8216;1000-01-01&#8217; to &#8216;9999-12-31&#8217; or &#8216;0000-00-00&#8217;. (<a class="reference external" href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html">http://dev.mysql.com/doc/refman/5.5/en/datetime.html</a>)</li>
-<li>Optional:<ul>
-<li><em>FormElement.parameter.dateFormat</em>: yyyy-mm-dd | dd.mm.yyyy</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="type-datetime">
-<h3>Type: datetime<a class="headerlink" href="#type-datetime" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Range datetime: &#8216;1000-01-01 00:00:00&#8217; to &#8216;9999-12-31 23:59:59&#8217; or &#8216;0000-00-00 00:00:00&#8217;. (<a class="reference external" href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html">http://dev.mysql.com/doc/refman/5.5/en/datetime.html</a>)</li>
-<li>Optional:<ul>
-<li><em>FormElement.parameter</em>:<ul>
-<li><em>dateFormat</em>: yyyy-mm-dd | dd.mm.yyyy</li>
-<li><em>showSeconds</em>: 0|1 - shows the seconds. Independent if the user specifies seconds, they are displayed &#8216;1&#8217; or not &#8216;0&#8217;.</li>
-<li><em>showZero</em>: 0|1 - For an empty timestamp, With &#8216;0&#8217; nothing is displayed. With &#8216;1&#8217; the string &#8216;0000-00-00 00:00:00&#8217; is displayed.</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="type-extra">
-<h3>Type: extra<a class="headerlink" href="#type-extra" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Element is not shown in the browser.</li>
-<li>The element can be used to define / precalculate values for a column, which do not already exist as a native <em>FormElement</em>.</li>
-<li>The element is build / computed on form load and saved alongside with the SIP parameter of the current form.</li>
-<li>Access the value without specifying any store (default store priority is sufficient).</li>
-</ul>
-</div>
-<div class="section" id="type-text">
-<span id="input-text"></span><h3>Type: text<a class="headerlink" href="#type-text" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>General input for text and number.</li>
-<li><em>FormElement.size</em>:<ul>
-<li>&lt;number&gt;:  width of input element in characters. Lineheight = 1.</li>
-<li>&lt;cols&gt;,&lt;rows&gt;: input element = textarea, width=&lt;cols&gt;, height=&lt;rows&gt;</li>
-</ul>
-</li>
-<li><em>FormElement.parameter</em>:<ul>
-<li><em>retype</em> = 1 (optional): Current input element will be rendered twice. The form can only submitted if both elements are equal.</li>
-<li><em>retypeLabel</em> = &lt;text&gt; (optional): The label of the second element.</li>
-<li><em>retypeNote</em> = &lt;text&gt; (optional): The note of the second element.</li>
-<li><em>characterCountWrap</em> = &lt;text1&gt;|&lt;text2&gt; (optional). Displays a character counter below the input/textarea element. If
-<cite>text1</cite> / <cite>text2</cite> is missing, just display <cite>&lt;current&gt;/&lt;/max&gt;</cite>. Customization: <cite>characterCountWrap=&lt;div class=qfq-cc-style&gt;Count: |&lt;/div&gt;</cite></li>
-<li>Also check the  <a class="reference internal" href="#fe-parameter-attributes"><span class="std std-ref">Attributes defined in the parameter field</span></a> <em>data-...-error</em> to customize error messages shown by the validator.</li>
-<li><em>hideZero</em> = 0|1 (optional): <cite>with hideZero=1</cite> a &#8216;0&#8217; in the value will be replaced by an empty string.</li>
-<li><em>emptyMeansNull</em> = [0|1] (optional): with <cite>emptyMeansNull</cite> or <cite>emptyMeansNull=1</cite> a NULL value will be written if
-the value is an empty string</li>
-</ul>
-</li>
-</ul>
-<div class="section" id="type-ahead">
-<span id="input-typeahead"></span><h4>Type Ahead<a class="headerlink" href="#type-ahead" title="Permalink to this headline">¶</a></h4>
-<p>Activating <cite>typeahead</cite> functionality offers an instant lookup of data and displaying them to the user, while the user is
-typing, a drop-down box offers the results. As datasource the regular SQL connection or a LDAP query can be used.
-With every keystroke (starting from the <em>typeAheadMinLength</em> characters), the already typed value will be transmitted to
-the server, the lookup will be performed and the result, upto <em>typeAheadLimit</em> entries, are displayed as a drop-down box.</p>
-<ul class="simple">
-<li><em>FormElement.parameter</em>:<ul>
-<li><em>typeAheadLimit</em> = &lt;number&gt;. Max numbers of result records to be shown. Default is 20.</li>
-<li><em>typeAheadMinLength</em> = &lt;number&gt;. Minimum length to type before the first lookup starts.</li>
-</ul>
-</li>
-</ul>
-<p>Depending of the <cite>typeahead</cite> setup, the given FormElement will contain the displayed <cite>value</cite> or <cite>id</cite> (if an id/value dict is
-configured).</p>
-<div class="section" id="configuration-via-form-formelement">
-<h5>Configuration via Form / FormElement<a class="headerlink" href="#configuration-via-form-formelement" title="Permalink to this headline">¶</a></h5>
-<p>All of the <cite>typeAhead*</cite> (except <cite>typeAheadLdap</cite>) and <cite>ldap*</cite> parameter can be specified either in
-<em>Form.parameter</em> or in <em>FormElement.parameter</em>.</p>
-</div>
-<div class="section" id="sql">
-<h5>SQL<a class="headerlink" href="#sql" title="Permalink to this headline">¶</a></h5>
-<ul class="simple">
-<li><em>FormElement.parameter</em>:<ul>
-<li><em>typeAheadSql</em> = <cite>SELECT ... AS &#8216;id&#8217;, ... AS &#8216;value&#8217; WHERE name LIKE ? OR firstName LIKE ? LIMIT 100</cite><ul>
-<li>If there is only one column in the SELECT statement, that one will be used and there is no dict (key/value pair).</li>
-<li>If there is no column <cite>id</cite> or no column <cite>value</cite>, than the first column becomes <cite>id</cite> and the second column becomes <cite>value</cite>.</li>
-<li>The query will be fired as a &#8216;prepared statement&#8217;.</li>
-<li>The value, typed by the user, will be replaced on all places where a <cite>?</cite> appears.</li>
-<li>All <cite>?</cite> will be automatically surrounded by &#8216;%&#8217;. Therefore wildcard search is implemented: <cite>... LIKE &#8216;%&lt;?&gt;%&#8217; ...</cite></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="id26">
-<h5>LDAP<a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h5>
-<p>See <a class="reference internal" href="#ldap-typeahead"><span class="std std-ref">Typeahead (TA)</span></a></p>
-</div>
-</div>
-</div>
-<div class="section" id="type-editor">
-<span id="input-editor"></span><h3>Type: editor<a class="headerlink" href="#type-editor" title="Permalink to this headline">¶</a></h3>
-<ul>
-<li><p class="first">TinyMCE (<a class="reference external" href="https://www.tinymce.com">https://www.tinymce.com</a>, community edition) is used as the QFQ Rich Text Editor.</p>
-</li>
-<li><p class="first">The content will be saved as HTML inside the database.</p>
-</li>
-<li><p class="first">All configuration and plugins will be configured via the &#8216;parameter&#8217; field. Just prepend the word &#8216;editor-&#8216; in front
-of each TinyMCE keyword. Check possible options under:</p>
-<ul class="simple">
-<li><a class="reference external" href="https://www.tinymce.com/docs/configure/">https://www.tinymce.com/docs/configure/</a>,</li>
-<li><a class="reference external" href="https://www.tinymce.com/docs/plugins/">https://www.tinymce.com/docs/plugins/</a>,</li>
-<li><a class="reference external" href="https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols">https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols</a></li>
-</ul>
-</li>
-<li><p class="first">Bars:</p>
-<ul class="simple">
-<li>Top: <em>menubar</em> - by default hidden.</li>
-<li>Top: <em>toolbar</em> - by default visible.</li>
-<li>Bottom: <em>statusbar</em> - by default hidden, exception: <em>min_height</em> and <em>max_height</em> are given via size parameter.</li>
-</ul>
-</li>
-<li><p class="first">The default setting in <em>FormElement.parameter</em> is:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">editor</span><span class="o">-</span><span class="nx">plugins</span><span class="o">=</span><span class="nx">code</span> <span class="nb">link</span> <span class="nx">searchreplace</span> <span class="nx">table</span> <span class="nx">textcolor</span> <span class="nx">textpattern</span> <span class="nx">visualchars</span>
-<span class="nx">editor</span><span class="o">-</span><span class="nx">toolbar</span><span class="o">=</span><span class="nx">code</span> <span class="nx">searchreplace</span> <span class="nx">undo</span> <span class="nx">redo</span> <span class="o">|</span> <span class="nx">styleselect</span> <span class="nb">link</span> <span class="nx">table</span> <span class="o">|</span> <span class="nx">fontselect</span> <span class="nx">fontsizeselect</span> <span class="o">|</span> <span class="nx">bullist</span> <span class="nx">numlist</span> <span class="nx">outdent</span> <span class="nx">indent</span> <span class="o">|</span> <span class="nx">forecolor</span> <span class="nx">backcolor</span> <span class="nx">bold</span> <span class="nx">italic</span> <span class="nx">editor</span><span class="o">-</span><span class="nx">menubar</span><span class="o">=</span><span class="k">false</span>
-<span class="nx">editor</span><span class="o">-</span><span class="nx">statusbar</span><span class="o">=</span><span class="k">false</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first">To deactivate the surrouding <cite>&lt;p&gt;</cite> tag, configure in <em>FormElement.parameter</em>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">editor</span><span class="o">-</span><span class="nx">forced_root_block</span><span class="o">=</span><span class="k">false</span>
-</pre></div>
-</div>
-<p>This might have impacts on the editor. See <a class="reference external" href="https://www.tinymce.com/docs/configure/content-filtering/#forced_root_block">https://www.tinymce.com/docs/configure/content-filtering/#forced_root_block</a></p>
-</li>
-<li><p class="first"><em>FormElement.size</em>:</p>
-<ul class="simple">
-<li>&lt;min_height&gt;,&lt;max_height&gt;: in pixels, including top and bottom bars. E.g.: 300,600</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="type-note">
-<h3>Type: note<a class="headerlink" href="#type-note" title="Permalink to this headline">¶</a></h3>
-<p>An FormElement without any &#8216;input&#8217; functionality -just to show some text. Use the typical fields &#8216;label&#8217;, &#8216;value&#8217; and
-&#8216;note&#8217; to be displayed in the corresponding three standard columns.</p>
-</div>
-<div class="section" id="type-password">
-<h3>Type: password<a class="headerlink" href="#type-password" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Like a <cite>text</cite> element, but every character is shown as an asterisk.</li>
-</ul>
-</div>
-<div class="section" id="type-radio">
-<span id="input-radio"></span><h3>Type: radio<a class="headerlink" href="#type-radio" title="Permalink to this headline">¶</a></h3>
-<ul>
-<li><p class="first">Radio Buttons will be built from one of three sources:</p>
-<ol class="arabic simple">
-<li>&#8216;sql1&#8217;: E.g. <em>{{!SELECT type AS label FROM car }}</em> or <em>{{!SELECT type AS label, typeNr AS id FROM car}}</em> or <em>{{!SHOW tables}}</em>.</li>
-</ol>
-<blockquote>
-<div><ul class="simple">
-<li>Resultset format &#8216;named&#8217;: column &#8216;label&#8217; and optional a column &#8216;id&#8217;.</li>
-<li>Resultset format &#8216;index&#8217;:<ul>
-<li>One column in resultset &gt;&gt; first column represents <em>label</em></li>
-<li>Two or more columns in resultset &gt;&gt; first column represents <em>id</em> and second column represents <em>label</em>.</li>
-</ul>
-</li>
-</ul>
-</div></blockquote>
-<ol class="arabic simple" start="2">
-<li><em>FormElement.parameter</em>:</li>
-</ol>
-<blockquote>
-<div><ul class="simple">
-<li><em>itemList</em> = <cite>&lt;attribute&gt;</cite> E.g.: <em>itemList=red,blue,orange</em> or <em>itemList=1:red,2:blue,3:orange</em></li>
-<li>If &#8216;:&#8217; or &#8216;,&#8217; are part of key or value, it needs to escaped by &#8216;&#8217;. E.g.: <cite>itemList=1:red:,2:blue,,3:orange`</cite></li>
-</ul>
-</div></blockquote>
-<ol class="arabic simple" start="3">
-<li>Definition of the <em>enum</em> or <em>set</em> field (only labels, ids are not possible).</li>
-</ol>
-</li>
-<li><p class="first"><em>FormElement.maxlength</em> = <cite>&lt;value&gt;</cite></p>
-<blockquote>
-<div><ul class="simple">
-<li>Applies only to &#8216;plain&#8217; radio elements (not the Bootstrap &#8216;buttonClass&#8217; from below)</li>
-<li><em>vertical</em> or <em>horizontal</em> alignment:<ul>
-<li><cite>&lt;value&gt;</cite>: &#8216;&#8217;, 0, 1 - The radios will be aligned <em>vertical</em>.</li>
-<li><cite>&lt;value&gt;</cite>: &gt;1 - The readios will be aligned <em>horizontal</em>, with a linebreak every &#8216;value&#8217; elements.</li>
-</ul>
-</li>
-</ul>
-</div></blockquote>
-</li>
-<li><p class="first"><em>FormElement.parameter</em>:</p>
-<ul class="simple">
-<li><em>emptyHide</em>: Existence of this item hides an entry with an empty string. This is useful for e.g. Enums, which have an empty
-entry, but the empty value should not be selectable.</li>
-<li><em>emptyItemAtStart</em>: Existence of this item inserts an empty entry at the beginning of the selectlist.</li>
-<li><em>emptyItemAtEnd</em>: Existence of this item inserts an empty entry at the end of the selectlist.</li>
-<li><em>buttonClass</em>: Instead of the plain radio fields, Bootstrap
-<a class="reference external" href="http://getbootstrap.com/javascript/#buttons-checkbox-radio">buttons</a>. are rendered as <cite>radio</cite> elements. Use
-one of the following <a class="reference external" href="http://getbootstrap.com/css/#buttons-options">classes</a>:
-* <cite>btn-default</cite> (default, grey),
-* <cite>btn-primary</cite> (blue),
-* <cite>btn-success</cite> (green),
-* <cite>btn-info</cite> (light blue),
-* <cite>btn-warning</cite> (orange),
-* <cite>btn-danger</cite> (red).
-With a given <em>buttonClass</em>, all buttons (=radios) are rendered horizontal. A value in <em>FormElement.maxlength</em> has no effect.</li>
-</ul>
-</li>
-<li><p class="first"><em>No preselection</em>:</p>
-<ul>
-<li><p class="first">If there is a default configured on a table column, such a value is selected by default. If the user should actively
-choose an option, the &#8216;preselection&#8217; can be omitted by specifying an explicit definition on the FormElement field <cite>value</cite>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="o">&lt;</span><span class="nx">columnname</span><span class="o">&gt;:</span><span class="nx">RZ</span><span class="p">}}</span>
-</pre></div>
-</div>
-<p>For existing records the shown value is as expected the value of the record. For new records, it&#8217;s the value <cite>0</cite>,
-which is typically not one of the ENUM values and therefore nothing is selected.</p>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="type-select">
-<span id="input-select"></span><h3>Type: select<a class="headerlink" href="#type-select" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Select lists will be built from one of three sources:<ul>
-<li>&#8216;sql1&#8217;: E.g. <em>{{!SELECT type AS label FROM car }}</em> or <em>{{!SELECT type AS label, typeNr AS id FROM car}}</em> or <em>{{!SHOW tables}}</em>.<ul>
-<li>Resultset format &#8216;named&#8217;: column &#8216;label&#8217; and optional a column &#8216;id&#8217;.</li>
-<li>Resultset format &#8216;index&#8217;:<ul>
-<li>One column in resultset &gt;&gt; first column represents <em>label</em></li>
-<li>Two or more columns in resultset &gt;&gt; first column represents <em>id</em> and second column represents <em>label</em>.</li>
-</ul>
-</li>
-</ul>
-</li>
-<li><em>FormElement.parameter</em>:<ul>
-<li><em>itemList</em> = <cite>&lt;attribute&gt;</cite> - E.g.: <em>itemList=red,blue,orange</em> or <em>itemList=1:red,2:blue:3:orange</em></li>
-<li>If &#8216;:&#8217; or &#8216;,&#8217; are part of key or value, it needs to escaped by &#8216;&#8217;. E.g.: <cite>itemList=1:red:,2:blue,,3:orange`</cite></li>
-</ul>
-</li>
-<li>Definition of the <em>enum</em> or <em>set</em> field (only labels, ids are not possible).</li>
-</ul>
-</li>
-<li><em>FormElement.size</em>: <cite>&lt;value&gt;</cite><ul>
-<li><cite>&lt;value&gt;</cite>: &lt;empty&gt;|0|1: drop-down list.</li>
-<li><cite>&lt;value&gt;</cite>: &gt;1: Select field with <em>size</em> rows height. Multiple selection of items is possible.</li>
-</ul>
-</li>
-<li><em>FormElement.parameter</em>:<ul>
-<li><em>emptyItemAtStart</em>: Existence of this item inserts an empty entry at the beginning of the selectlist.</li>
-<li><em>emptyItemAtEnd</em>: Existence of this item inserts an empty entry at the end of the selectlist.</li>
-<li><em>emptyHide</em>: Existence of this item hides the empty entry. This is useful for e.g. Enums, which have an empty
-entry and the empty value should not be an option to be selected.</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="type-subrecord">
-<span id="subrecord-option"></span><h3>Type: subrecord<a class="headerlink" href="#type-subrecord" title="Permalink to this headline">¶</a></h3>
-<p>The <em>FormElement</em> type &#8216;subrecord&#8217; renders a list of records (so called secondary records), typically to show, edit, delete
-or add new records. The list is defined as a SQL query. The number of records shown is not limited. These <em>FormElement</em>
-will be rendered inside the form as a HTML table.</p>
-<ul>
-<li><p class="first"><em>mode / modeSql</em>:</p>
-<ul class="simple">
-<li><em>show / required</em>: the regular mode to show the subrecords</li>
-<li><em>readonly</em>: New / Edit / Delete Buttons are disabled</li>
-<li><em>hidden</em>: The FormElement is rendered, but disabled with <cite>display=&#8217;none&#8217;</cite>.</li>
-</ul>
-</li>
-<li><p class="first"><em>dynamicUpdate</em>: not supported at the moment.</p>
-</li>
-<li><p class="first"><em>sql1</em>: SQL query to select records. E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="o">!</span><span class="nx">SELECT</span> <span class="nx">a</span><span class="o">.</span><span class="nx">id</span> <span class="k">AS</span> <span class="nx">id</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="nx">a</span><span class="o">.</span><span class="nx">street</span><span class="p">,</span> <span class="nx">a</span><span class="o">.</span><span class="nx">streetnumber</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">a</span><span class="p">,</span> <span class="nx">a</span><span class="o">.</span><span class="nx">city</span> <span class="k">AS</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">a</span><span class="o">.</span><span class="nx">zip</span> <span class="k">AS</span> <span class="nx">c</span> <span class="nx">FROM</span> <span class="nx">Address</span> <span class="k">AS</span> <span class="nx">a</span><span class="p">}}</span>
-</pre></div>
-</div>
-<ul>
-<li><p class="first">Notice the <strong>exclamation mark</strong> after &#8216;{{&#8216; - this is necessary to return an array of elements, instead of a single string.</p>
-</li>
-<li><p class="first">Exactly one column <strong>&#8216;id&#8217;</strong> has to exist; it specifies the primary record for the target form.
-In case the id should not be visible to the user, it has to be named <strong>&#8216;_id&#8217;</strong>.</p>
-</li>
-<li><p class="first">Columnname: <em>[title=]&lt;title&gt;[|[maxLength=]&lt;number&gt;][|width=&lt;number&gt;][|nostrip][|icon][|link][|url][|mailto][|_rowClass][|_rowTooltip]</em></p>
-<ul>
-<li><p class="first">If the keyword is used, all parameter are position independent.</p>
-</li>
-<li><p class="first">Parameter are seperated by &#8216;|&#8217;.</p>
-</li>
-<li><p class="first"><em>[title=]&lt;text&gt;</em>: Title of the column. The keyword &#8216;title=&#8217; is optional. Columns with a title starting with &#8216;_&#8217; won&#8217;t be rendered.</p>
-</li>
-<li><dl class="first docutils">
-<dt><em>[maxLength=]&lt;number&gt;</em>: Max. number of characters displayed per cell. The keyword &#8216;maxLength=&#8217; is optional. Default</dt>
-<dd><p class="first last">maxLength &#8216;20&#8217;. A value of &#8216;0&#8217; means no limit. This setting also affects the title of the column.</p>
-</dd>
-</dl>
-</li>
-<li><p class="first"><em>nostrip</em>: by default, html tags will be stripped off the cell content before rendering. This protects the table
-layout. &#8216;nostrip&#8217; deactivates the cleaning to make pure html possible.</p>
-</li>
-<li><p class="first"><em>icon</em>: the cell value contains the name of an icon in <em>typo3conf/ext/qfq/Resources/Public/icons</em>. Empty cell values
-will omit an html image tag (=nothing rendered in the cell).</p>
-</li>
-<li><p class="first"><em>link</em>: value will be rendered as described under <a class="reference internal" href="#column-link"><span class="std std-ref">Column: _link</span></a></p>
-</li>
-<li><p class="first"><em>url</em>: value will be rendered as a href url.</p>
-</li>
-<li><p class="first"><em>mailto</em>: value will be rendered as a href mailto.</p>
-</li>
-<li><p class="first"><em>_rowClass</em></p>
-<ul class="simple">
-<li>The value is a CSS class name(s) which will be rendered in the <em>&lt;tr class=&#8221;&lt;_rowClass&gt;&#8221;&gt;</em> of the subrecord table.</li>
-<li>The column itself is not rendered.</li>
-<li>By using Bootstrap, the following predefined classes are available:<ul>
-<li>Text color: <em>text-muted|text-primary|text-success|text-info|text-warning|text-danger</em> (<a class="reference external" href="http://getbootstrap.com/css/#helper-classes">http://getbootstrap.com/css/#helper-classes</a>)</li>
-<li>Row background: <em>active|success|info|warning|danger</em> (<a class="reference external" href="http://getbootstrap.com/css/#tables-contextual-classes">http://getbootstrap.com/css/#tables-contextual-classes</a>)</li>
-</ul>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>_rowTooltip</em></p>
-<ul class="simple">
-<li>Defines the title attribute (=tooltip) of a subrecord table row.</li>
-</ul>
-</li>
-<li><p class="first">Examples:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="o">!</span><span class="nx">SELECT</span> <span class="nx">id</span><span class="p">,</span> <span class="nx">note1</span> <span class="k">AS</span> <span class="s1">&#39;Comment&#39;</span><span class="p">,</span> <span class="nx">note2</span> <span class="k">AS</span> <span class="s1">&#39;Comment|50&#39;</span> <span class="p">,</span> <span class="nx">note3</span> <span class="k">AS</span> <span class="s1">&#39;title=Comment|maxLength=100|nostrip&#39;</span><span class="p">,</span> <span class="nx">note4</span> <span class="k">AS</span> <span class="s1">&#39;50|Comment&#39;</span><span class="p">,</span>
-<span class="s1">&#39;checked.png&#39;</span> <span class="k">AS</span> <span class="s1">&#39;Status|icon&#39;</span><span class="p">,</span> <span class="nx">email</span> <span class="k">AS</span> <span class="s1">&#39;mailto&#39;</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="nx">homepage</span><span class="p">,</span> <span class="s1">&#39;|Homepage&#39;</span><span class="p">)</span> <span class="k">AS</span> <span class="s1">&#39;url&#39;</span><span class="p">,</span>
-<span class="nx">ELT</span><span class="p">(</span><span class="nx">status</span><span class="p">,</span><span class="s1">&#39;info&#39;</span><span class="p">,</span><span class="s1">&#39;warning&#39;</span><span class="p">,</span><span class="s1">&#39;danger&#39;</span><span class="p">)</span> <span class="k">AS</span> <span class="s1">&#39;_rowClass&#39;</span><span class="p">,</span> <span class="nx">help</span> <span class="k">AS</span> <span class="s1">&#39;_rowTooltip&#39;</span> <span class="o">...</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>FormElement.parameter</em></p>
-<ul>
-<li><p class="first"><em>form</em>: Target form, e.g. <em>form=person</em></p>
-</li>
-<li><p class="first"><em>page</em>: Target page with detail form. If none specified, use the current page.</p>
-</li>
-<li><p class="first"><em>title</em>: Title displayed over the table in the current form.</p>
-</li>
-<li><p class="first"><em>extraDeleteForm</em>: Optional. The per row delete Button will reference the form specified here (for deleting) instead of the default (<em>form</em>).</p>
-</li>
-<li><p class="first"><em>detail</em>: Mapping of values from a) the primary form, b) the current row, c) any constant or &#8216;{{...}}&#8217; - to the target form (defined via <cite>form=...</cite>).</p>
-<ul>
-<li><p class="first">Syntax:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">source</span> <span class="nx">table</span> <span class="nx">column</span> <span class="nx">name</span> <span class="mi">1</span><span class="o">|&amp;</span><span class="nb">constant</span> <span class="mi">1</span><span class="o">&gt;:&lt;</span><span class="nx">target</span> <span class="nx">column</span> <span class="nx">name</span> <span class="mi">1</span><span class="o">&gt;</span><span class="p">[,</span><span class="o">&lt;</span><span class="nx">source</span> <span class="nx">table</span> <span class="nx">column</span> <span class="nx">name</span> <span class="mi">2</span><span class="o">|&amp;</span><span class="nb">constant</span> <span class="mi">2</span><span class="o">&gt;:&lt;</span><span class="nx">target</span> <span class="nx">column</span> <span class="nx">name</span> <span class="mi">2</span><span class="o">&gt;</span><span class="p">][</span><span class="o">...</span><span class="p">]</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first">Example: <em>detail=id:personId,rowId:secId,&amp;12:xId,&amp;{{a}}:personId</em>  (rowId is a column of the current selected row defined by sql1)</p>
-</li>
-<li><p class="first">By default, the given value will overwrite values on the target record. In most situations, this is the wished behaviour.</p>
-</li>
-<li><p class="first">Exceptions of the default behaviour have to be defined on the target form in the corresponding <em>FormElement</em> in the
-field <em>value</em> by changing the default Store priority definition. E.g. <cite>{{&lt;columnname&gt;:RS0}}</cite> - For existing records,
-the store <cite>R</cite> will provide a value. For new records, store <cite>R</cite> is empty and store S will be searched for a value:
-the value defined in <cite>detail</cite> will be choosen. At last the store &#8216;0&#8217; is defined as a fallback.</p>
-</li>
-<li><p class="first"><em>source table column name</em>: E.g. A person form is opened with person.id=5 (r=5). The definition <cite>detail=id:personId</cite>
-and <cite>form=address</cite> maps person.id to address.personId. On the target record, the column personId becomes &#8216;5&#8217;.</p>
-</li>
-<li><p class="first"><em>Constant &#8216;&amp;&#8217;</em>: Indicate a &#8216;constant&#8217; value. E.g. <cite>&amp;12:xId</cite> or <cite>{{...}}</cite> (all possibilities, incl. further SELECT
-statements) might be used.</p>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>subrecordTableClass</em>: Optional. Default: &#8216;table table-hover&#8217;. If given, the default will be overwritten.</p>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="type-time">
-<h3>Type: time<a class="headerlink" href="#type-time" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Range time: &#8216;00:00:00&#8217; to &#8216;23:59:59&#8217; or &#8216;00:00:00&#8217;. (<a class="reference external" href="http://dev.mysql.com/doc/refman/5.5/en/datetime.html">http://dev.mysql.com/doc/refman/5.5/en/datetime.html</a>)</li>
-<li>Optional:</li>
-<li><em>FormElement.parameter</em>
-* <em>showSeconds</em>: 0|1 - shows the seconds. Independent if the user specifies seconds, they are displayed &#8216;1&#8217; or not &#8216;0&#8217;.
-* <em>showZero</em>: 0|1 - For an empty timestamp, With &#8216;0&#8217; nothing is displayed. With &#8216;1&#8217; the string &#8216;00:00[:00]&#8217; is displayed.</li>
-</ul>
-</div>
-<div class="section" id="type-upload">
-<span id="input-upload"></span><h3>Type: upload<a class="headerlink" href="#type-upload" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>See: <a class="reference external" href="https://www.w3.org/TR/html5/forms.html#file-upload-state-(type=file">https://www.w3.org/TR/html5/forms.html#file-upload-state-(type=file</a>)</li>
-</ul>
-<p>An upload element is based on a &#8216;file browse&#8217;-button and a &#8216;trash&#8217;-button (=delete). Only one of them is shown at a time.
-The &#8216;file browse&#8217;-button is displayed, if there is no file uploaded already.
-The &#8216;trash&#8217;-button is displayed, if there is a file uploaded already.</p>
-<p>After clicking on the browse brutton, the user select a file from the local filesystem.
-After choosing the file, the upload starts immediately, shown by a turning wheel. When the server received the whole file
-and accepts (see below) the file, the &#8216;file browse&#8217;-button disappears and the filename is shown, followed by a &#8216;trash&#8217;-button.
-Either the user is satisfied now or the user can delete the uploaded file (and maybe upload another one).</p>
-<p>Until this point, the file is cached on the server but not copied to the <cite>fileDestination</cite>. The user have to save the
-current record, either to finalize the upload and/or to delete a previous uploaded file.</p>
-<p>The FormElement behaves like a</p>
-<ul class="simple">
-<li>&#8216;native FormElement&#8217; (showing controls/text on the form) as well as an</li>
-<li>&#8216;action FormElement&#8217; by fireing queries and doing some additional actions during form save.</li>
-</ul>
-<p>Inside the <em>Form editor</em> it&#8217;s shown as a &#8216;native FormElement&#8217;.
-During saving the current record, it behaves like an action FormElement
-and will be processed after saving the primary record and before any action FormElements are processed.</p>
-<ul>
-<li><p class="first"><em>FormElement.value</em>: By default, the full path of any already uploaded file is shown. To show something different, e.g.
-only the filename, define:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">SUBSTRING_INDEX</span><span class="p">(</span><span class="nx">pathFilenamePicture</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span> <span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first"><em>FormElement.parameter</em>:</p>
-<ul>
-<li><p class="first"><em>capture=camera</em>: On a smartphone, after pressing the &#8216;open file&#8217; button, the camera will be opened and a
-choosen picture will be uploaded. Automatically set/overwrite <cite>accept=image/*</cite>.</p>
-</li>
-<li><p class="first"><em>accept</em>: <cite>&lt;mime type&gt;,image/*,video/*,audio/*,.doc,.docx,.pdf</cite></p>
-<ul class="simple">
-<li>List of mime types (also known as &#8216;media types&#8217;): <a class="reference external" href="http://www.iana.org/assignments/media-types/media-types.xhtml">http://www.iana.org/assignments/media-types/media-types.xhtml</a></li>
-<li>If none is specified, &#8216;application/pdf&#8217; is set. This forces that always (!) one type is specified.</li>
-<li>One or more media types might be specified, seperated by &#8216;,&#8217;.</li>
-<li>Different browser respect the given definitions in different ways. Typically the &#8216;file choose&#8217; dialog offer:<ul>
-<li>the specified mime type (some browers only show &#8216;custom&#8217;, if more than one mime type is given),</li>
-<li>the option &#8216;All files&#8217; (the user is always free to <strong>try</strong> to upload other filetypes),</li>
-<li>the &#8216;file choose&#8217; dialog only offers files of the selected (in the dialog) type.</li>
-</ul>
-</li>
-<li>If for a specific filetype is no mime type available, the definition of file extension(s) is possible. This is <strong>less
-secure</strong>, cause there is no <em>content</em> check on the server after the upload.</li>
-</ul>
-</li>
-<li><p class="first"><em>maxFileSize</em>: max filesize in bytes for an uploaded file. Default: 10485760 (=10MB)</p>
-</li>
-<li><p class="first"><em>fileDestination</em>: Destination where to copy the file. A good practice is to specify a relative <cite>fileDestination</cite> -
-such an installation (filesystem and database) are moveable.</p>
-<ul>
-<li><p class="first">If the original filename should be part of <cite>fileDestination</cite>, the variable <em>{{filename}}</em> (STORE_VARS) can be used. Example</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">fileDestination</span><span class="o">=</span><span class="p">{{</span><span class="nx">SELECT</span> <span class="s1">&#39;fileadmin/user/pictures/&#39;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span><span class="p">,</span> <span class="s1">&#39;-{{filename}}&#39;</span> <span class="nx">FROM</span> <span class="nx">Person</span> <span class="k">AS</span> <span class="nx">p</span> <span class="nx">WHERE</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span> <span class="p">}}</span>
-</pre></div>
-</div>
-<ul class="simple">
-<li>The original filename will be sanitized: only &#8216;&lt;alnum&gt;&#8217;, &#8216;.&#8217; and &#8216;_&#8217; characters are allowed. German &#8216;umlaut&#8217; will
-be replaced by &#8216;ae&#8217;, &#8216;ue&#8217;, &#8216;oe&#8217;. All non valid characters will be replaced by &#8216;_&#8217;.</li>
-</ul>
-</li>
-<li><p class="first">If a file already exist under <cite>fileDestination</cite>, an error message is shown and &#8216;save&#8217; is aborted. The user has no
-possibility to overwrite the already existing file. If the whole workflow is correct, this situation should no
-arise. Check also <em>fileReplace</em> below.</p>
-</li>
-<li><p class="first">All necessary subdirectories in <cite>fileDestination</cite> are automatically created.</p>
-</li>
-<li><p class="first">Using the current record id in the <cite>fileDestination</cite>: Using {{r}} is problematic for a &#8216;new&#8217; primary record: that
-one is still &#8216;0&#8217; at the time of saving. Use <cite>{{id:R0}}</cite> instead.</p>
-</li>
-<li><p class="first">Uploading of malicious code (e.g. PHP files) is hard to detect. The default mime type check can be easily faked
-by an attacker. Therefore it&#8217;s recommended to use a <cite>fileDestination</cite>-directory, which is secured against script
-execution (even if the file has been uploaded, the webserver won&#8217;t execute it) - see <a class="reference internal" href="#securedirectfileaccess">SecureDirectFileAccess</a>.</p>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>slaveId</em>, <em>sqlBefore</em>, <em>sqlInsert</em>, <em>sqlUpdate</em>, <em>sqlDelete</em>, <em>sqlUpdate</em>, <em>sqlAfter</em>: Only used in <a class="reference internal" href="#upload-advanced-mode"><span class="std std-ref">Upload advanced mode</span></a>.</p>
-</li>
-<li><p class="first"><em>fileReplace=always</em>: If <cite>fileDestination</cite> exist - replace it by the new one.</p>
-</li>
-</ul>
-</li>
-</ul>
-<p>Immediately after the upload finished (before the user press save), the file will be checked on the server for it&#8217;s
-content or file extension (see &#8216;accept&#8217;).</p>
-<p>The maximum size is defined by the minimum of <cite>upload_max_filesize</cite>, <cite>post_max_size</cite> and <cite>memory_limit</cite> (PHP script) in the php.ini.</p>
-<p>In case of broken uploads, please also check <cite>max_input_time</cite> in php.ini.</p>
-<div class="section" id="deleting-a-record-and-the-referenced-file">
-<h4>Deleting a record and the referenced file<a class="headerlink" href="#deleting-a-record-and-the-referenced-file" title="Permalink to this headline">¶</a></h4>
-<p>If the user deletes a record (e.g. pressing the delete button on a form) which contains reference(s) to files, such files
-are deleted too. Slave records, which might be also deleted through a &#8216;delete&#8217;-form, are <em>not</em> checked for file references
-and therefore such files are not deleted on the filesystem.</p>
-<p>Only columns where the columname contains <cite>pathFileName</cite> are checked for file references. Therefore, always choose a
-columnanme which contains <cite>pathFileName</cite>.</p>
-<p>If there are other records, which references the same file, such files are not deleted.
-It&#8217;s a very basic check: just the current column of the current table is compared. In general it&#8217;s not a good idea to
-have mutliple references to a single file. Therefore this check is just a fallback.</p>
-<div class="section" id="upload-simple-mode">
-<span id="id29"></span><h5>Upload simple mode<a class="headerlink" href="#upload-simple-mode" title="Permalink to this headline">¶</a></h5>
-<p>Requires: <em>&#8216;upload&#8217;-FormElement.name = &#8216;column name&#8217;</em> of an column in the primary table.</p>
-<p>After moving the file to <cite>fileDestination</cite>, the current record/column will be updated to <cite>fileDestination</cite>.
-The database definition of the named column has to be a string variant (varchar, text but not numeric or else).
-On form load, the column value will be displayed as path/filename.
-Deleting an uploaded file in the form (by clicking on the trash near beside) will delete
-the file on the filesystem as well. The column will be updated to an empty string.</p>
-<p>This happens automatically without any further definiton in the &#8216;upload&#8217;-FormElement.</p>
-<p>Multiple &#8216;upload&#8217;-FormElements per form are possible. Each of it needs an own table column.</p>
-</div>
-<div class="section" id="upload-advanced-mode">
-<span id="id30"></span><h5>Upload advanced mode<a class="headerlink" href="#upload-advanced-mode" title="Permalink to this headline">¶</a></h5>
-<p>Requires: <em>&#8216;upload&#8217;-FormElement.name</em> is unknown as a column in the primary table.</p>
-<p>This mode will serve further database structure scenarios.</p>
-<p>A typical name for such an &#8216;upload&#8217;-FormElement, to show that the name does not exist in the table, might start with &#8216;my&#8217;, e.g. &#8216;myUpload1&#8217;.</p>
-<ul>
-<li><p class="first"><em>FormElement.value</em>: The path/filename, shown during &#8216;form load&#8217; to indicate a previous uploaded file, has to be queried
-with this field. E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">pathFilenamePicture</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first"><em>FormElement.parameter</em>:</p>
-<ul>
-<li><p class="first"><em>fileDestination</em>: determine the path/filename. E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">fileDestination</span><span class="o">=</span><span class="nx">fileadmin</span><span class="o">/</span><span class="nx">person</span><span class="o">/</span><span class="p">{{</span><span class="nx">name</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span><span class="nx">_</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R</span><span class="p">}}</span><span class="o">/</span><span class="nx">uploads</span><span class="o">/</span><span class="nx">picture_</span><span class="p">{{</span><span class="nx">filename</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first"><em>slaveId</em>: Defines the target record where to retrieve and store the path/filename of the uploaded file. Check also <a class="reference internal" href="#slave-id"><span class="std std-ref">Parameter: slaveId</span></a>. E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">slaveId</span><span class="o">=</span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">pId</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span> <span class="k">AND</span> <span class="nx">type</span><span class="o">=</span><span class="s1">&#39;picture&#39;</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first"><em>sqlBefore</em>: fired during a form save, before the following queries are fired.</p>
-</li>
-<li><p class="first"><em>sqlInsert</em>: fired if <cite>slaveId=0</cite> and an upload exist (user has choosen a file):</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">sqlInsert</span><span class="o">=</span><span class="p">{{</span><span class="nx">INSERT</span> <span class="nx">INTO</span> <span class="nx">Note</span> <span class="p">(</span><span class="nx">pId</span><span class="p">,</span> <span class="nx">type</span><span class="p">,</span> <span class="nx">pathFileName</span><span class="p">)</span> <span class="nx">VALUE</span> <span class="p">({{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}},</span> <span class="s1">&#39;image&#39;</span><span class="p">,</span> <span class="s1">&#39;{{fileDestination}}&#39;</span><span class="p">)</span> <span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first"><em>sqlUpdate</em>: fired if <cite>slaveId&gt;0</cite> and an upload exist (user has choosen a file). E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">sqlUpdate</span><span class="o">=</span><span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">Note</span> <span class="nx">SET</span> <span class="nx">pathFileName</span> <span class="o">=</span> <span class="s1">&#39;{{fileDestination}}&#39;</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first"><em>sqlDelete</em>: fired if <cite>slaveId&gt;0</cite> and no upload exist (user has not choosen a file). E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">sqlDelete</span><span class="o">=</span><span class="p">{{</span><span class="nx">DELETE</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="o">:</span><span class="nx">V</span><span class="p">}}</span>  <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first"><em>sqlAfter</em>: fired after all previous queries have been fired. Might update the new created id to a primary record. E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">sqlAfter</span><span class="o">=</span><span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">Person</span> <span class="nx">SET</span> <span class="nx">noteIdPicture</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-</div>
-</div>
-<div class="section" id="class-action">
-<span id="id31"></span><h2>Class: Action<a class="headerlink" href="#class-action" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="type-before-after">
-<h3>Type: before... | after...<a class="headerlink" href="#type-before-after" title="Permalink to this headline">¶</a></h3>
-<p>These type of &#8216;action&#8217; <em>FormElements</em> will be used to implement data validation or creating/updating additional records.</p>
-<p>Types:</p>
-<blockquote>
-<div><ul class="simple">
-<li>beforeLoad (e.g. good to check access permission)</li>
-<li>afterLoad</li>
-<li>beforeSave (e.g. to prohibit creating of duplicate records)</li>
-<li>afterSave (e.g. to to create &amp; update additional records)</li>
-<li>beforeInsert</li>
-<li>afterInsert</li>
-<li>beforeUpdate</li>
-<li>afterUpdate</li>
-<li>beforeDelete (e.g. to delete slave records)</li>
-<li>afterDelete</li>
-<li>paste (configure copy/paste forms)</li>
-</ul>
-</div></blockquote>
-<div class="section" id="parameter-sqlvalidate">
-<h4>Parameter: sqlValidate<a class="headerlink" href="#parameter-sqlvalidate" title="Permalink to this headline">¶</a></h4>
-<blockquote>
-<div><p>Perform checks by fireing a SQL query and expecting a predefined number of selected records.</p>
-<ul class="simple">
-<li>OK: the <cite>expectRecords</cite> number of records has been selected. Continue processing the next <em>FormElement</em>.</li>
-<li>Fail: the <cite>expectRecords</cite> number of records has not been selected (less or more): Display the error message
-<cite>messageFail</cite> and abort the whole (!) current form load or save.</li>
-</ul>
-<p><em>FormElement.parameter</em>:</p>
-<ul class="simple">
-<li><em>requiredList</em> - List of <cite>native</cite>-<em>FormElement</em> names: only if all of those elements are filled (!=0 and !=&#8217;&#8216;), the <em>current</em>
-<cite>action</cite>-<em>FormElement</em> will be processed. This will enable or disable the check, based on the user input! If no
-<cite>native</cite>-<em>FormElement</em> names are given, the specified check will always be performed.</li>
-<li><em>sqlValidate</em> - validation query. E.g.: <cite>sqlValidate={{!SELECT id FROM Person AS p WHERE p.name LIKE {{name:F:all}} AND p.firstname LIKE {{firstname:F:all}} }}</cite><ul>
-<li>Pay attention to <cite>{{!...</cite> after the equal sign.</li>
-</ul>
-</li>
-<li><em>expectRecords</em> - number of expected records.<ul>
-<li><em>expectRecords</em> = <cite>0</cite> or <em>expectRecords</em> = <cite>0,1</cite> or <em>expectRecords</em> = <cite>{{SELECT COUNT(id) FROM Person}}</cite></li>
-<li>Separate multiple valid record numbers by &#8216;,&#8217;. If at least one of those matches, the check will pass successfully.</li>
-</ul>
-</li>
-<li><em>messageFail</em> - Message to show. E.g.: <em>messageFail</em> = <cite>There is already a person called {{firstname:F:all}} {{name:F:all}}</cite></li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="parameter-slaveid">
-<span id="slave-id"></span><h4>Parameter: slaveId<a class="headerlink" href="#parameter-slaveid" title="Permalink to this headline">¶</a></h4>
-<p><em>FormElement.parameter</em>:</p>
-<blockquote>
-<div><ul class="simple">
-<li><em>slaveId</em>:<ul>
-<li>Auto fill: name the action <cite>action</cite>-<em>FormElement</em> equal to an existing column (table from the current form definition).
-<em>slaveId</em> will be automatically filled with the value of the named column.<ul>
-<li>If there is no such named columnname, set <em>slaveId</em> = <cite>0</cite>.</li>
-</ul>
-</li>
-<li>Explicit definition: <em>slaveId</em> = <cite>123</cite> or <em>slaveId</em> = <cite>{{SELECT id ...}}</cite></li>
-</ul>
-</li>
-</ul>
-</div></blockquote>
-<p>Note:</p>
-<blockquote>
-<div><ul class="simple">
-<li><cite>{{slaveId}}</cite> can be used in any query of the current <em>FormElement</em>.</li>
-<li>If the <cite>action</cite>-<em>FormElement</em> name exist as a column in the master record: Update that column <em>automatically</em> with the
-recent slaveId</li>
-<li>After an INSERT the <cite>last_insert_id()</cite> becomes the <em>slaveId</em>).</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="parameter-sqlbefore-sqlinsert-sqlupdate-sqldelete-sqlafter">
-<h4>Parameter: sqlBefore / sqlInsert / sqlUpdate / sqlDelete / sqlAfter<a class="headerlink" href="#parameter-sqlbefore-sqlinsert-sqlupdate-sqldelete-sqlafter" title="Permalink to this headline">¶</a></h4>
-<blockquote>
-<div><ul class="simple">
-<li>Save values of a form to different record(s), optionally on different table(s).</li>
-<li>Typically useful on &#8216;afterSave&#8217; - be careful when using it earlier, e.g. beforeLoad.</li>
-</ul>
-</div></blockquote>
-<p><em>FormElement.parameter</em>:</p>
-<blockquote>
-<div><ul class="simple">
-<li><em>requiredList</em> - List of <cite>native</cite>-<em>FormElement</em>: only if all of those elements are filled, the current
-<cite>action</cite>-<em>FormElement</em> will be processed.</li>
-<li><em>sqlBefore</em>: always fired (before any <em>sqlInsert</em>, <em>sqlUpdate</em>, ..)</li>
-<li><em>sqlInsert</em>: fired if <em>slaveId</em> == <cite>0</cite> or <em>slaveId</em> == <cite>&#8216;&#8217;</cite>.</li>
-<li><em>sqlUpdate</em>: fired if <em>slaveId</em> &gt; <cite>0</cite>.</li>
-<li><em>sqlDelete</em>: fired if <em>slaveId</em> &gt; <cite>0</cite>, after <em>sqlInsert</em> or <em>sqlUpdate</em>. Be carefull not to delete filled records!
-Always add a check, if values given, not to delete the record! <em>sqlHonorFormElements</em> helps to skip such checks.</li>
-<li><em>sqlAfter</em>: always fired (after <em>sqlInsert</em>, <em>sqlUpdate</em> or <em>sqlDelete</em>).</li>
-<li><em>sqlHonorFormElements</em>: list of <em>FormElement</em> names (this parameter is optional).<ul>
-<li>If one of the named <em>FormElements</em> is not empty:<ul>
-<li>fire <em>sqlInsert</em> if <em>slaveId</em> == <cite>0</cite>,</li>
-<li>fire <em>sqlUpdate</em> if <em>slaveId</em> &gt; <cite>0</cite></li>
-</ul>
-</li>
-<li>If all of the named <em>FormElements</em> are empty:<ul>
-<li>fire <em>sqlDelete</em> if <em>slaveId</em> &gt; <cite>0</cite></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="example">
-<h4>Example<a class="headerlink" href="#example" title="Permalink to this headline">¶</a></h4>
-<p>Situation 1: master.xId=slave.id (1:1)</p>
-<blockquote>
-<div><ul>
-<li><p class="first">Name the action element &#8216;xId&#8217;: than {{slaveId}} will be automatically set to the value of &#8216;master.xId&#8217;</p>
-<ul class="simple">
-<li>{{slaveId}} == 0 ? &#8216;sqlInsert&#8217; will be fired.</li>
-<li>{{slaveId}} != 0 ? &#8216;sqlUpdate&#8217; will be fired.</li>
-</ul>
-</li>
-<li><p class="first">In case of fireing &#8216;sqlInsert&#8217;, the &#8216;slave.id&#8217; of the new created record are copied to master.xId (the database will
-be updated automatically).</p>
-</li>
-<li><p class="first">If the automatic update of the master record is not suitable, the action element should have no name or a name
-which does not exist as a column of the master record. Define  <cite>slaveId={{SELECT id ...}}</cite></p>
-</li>
-<li><p class="first">Two <em>FormElements</em>  <cite>myStreet</cite> and <cite>myCity</cite>:</p>
-<blockquote>
-<div><ul>
-<li><p class="first">Without <em>sqlHonorFormElements</em>. Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">sqlInsert</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">INSERT</span> <span class="nx">INTO</span> <span class="nx">address</span> <span class="p">(</span><span class="sb">`street`</span><span class="p">,</span> <span class="sb">`city`</span><span class="p">)</span> <span class="nx">VALUES</span> <span class="p">(</span><span class="s1">&#39;{{myStreet:FE:alnumx:s}}&#39;</span><span class="p">,</span> <span class="s1">&#39;{{myCity:FE:alnumx:s}}&#39;</span><span class="p">)</span> <span class="p">}}</span>
-<span class="nx">sqlUpdate</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">address</span> <span class="nx">SET</span> <span class="sb">`street`</span> <span class="o">=</span> <span class="s1">&#39;{{myStreet:FE:alnumx:s}}&#39;</span><span class="p">,</span> <span class="sb">`city`</span> <span class="o">=</span> <span class="s1">&#39;{{myCity:FE:alnumx:s}}&#39;</span>  <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-<span class="nx">sqlDelete</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">DELETE</span> <span class="nx">FROM</span> <span class="nx">address</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="k">AND</span> <span class="s1">&#39;{{myStreet:FE:alnumx:s}}&#39;</span><span class="o">=</span><span class="s1">&#39;&#39;</span> <span class="k">AND</span> <span class="s1">&#39;{{myCity:FE:alnumx:s}}&#39;</span><span class="o">=</span><span class="s1">&#39;&#39;</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first">With <em>sqlHonorFormElements</em>. Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">sqlHonorFormElements</span> <span class="o">=</span> <span class="nx">myStreet</span><span class="p">,</span> <span class="nx">myCity</span>     <span class="c1"># Non Templategroup</span>
-<span class="nx">sqlInsert</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">INSERT</span> <span class="nx">INTO</span> <span class="nx">address</span> <span class="p">(</span><span class="sb">`street`</span><span class="p">,</span> <span class="sb">`city`</span><span class="p">)</span> <span class="nx">VALUES</span> <span class="p">(</span><span class="s1">&#39;{{myStreet:FE:alnumx:s}}&#39;</span><span class="p">,</span> <span class="s1">&#39;{{myCity:FE:alnumx:s}}&#39;</span><span class="p">)</span> <span class="p">}}</span>
-<span class="nx">sqlUpdate</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">address</span> <span class="nx">SET</span> <span class="sb">`street`</span> <span class="o">=</span> <span class="s1">&#39;{{myStreet:FE:alnumx:s}}&#39;</span><span class="p">,</span> <span class="sb">`city`</span> <span class="o">=</span> <span class="s1">&#39;{{myCity:FE:alnumx:s}}&#39;</span>  <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-<span class="nx">sqlDelete</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">DELETE</span> <span class="nx">FROM</span> <span class="nx">address</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-
-<span class="c1"># For Templategroups: sqlHonorFormElements = myStreet%d, myCity%d</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</div></blockquote>
-</li>
-</ul>
-</div></blockquote>
-<p>Situation 2: master.id=slave.xId (1:n)</p>
-<blockquote>
-<div><ul>
-<li><p class="first">Name the action element <em>different</em> to any columnname of the master record (or no name).</p>
-</li>
-<li><p class="first">Determine the slaveId: <cite>slaveId={{SELECT id FROM slave WHERE slave.xxx={{...}} LIMIT 1}}</cite></p>
-<ul class="simple">
-<li>{{slaveId}} == 0 ? &#8216;sqlInsert&#8217; will be fired.</li>
-<li>{{slaveId}} != 0 ? &#8216;sqlUpdate&#8217; will be fired.</li>
-</ul>
-</li>
-<li><p class="first">Two <em>FormElements</em>  <cite>myStreet</cite> and <cite>myCity</cite>. The <cite>person</cite> is the master record, <cite>address</cite> is the slave:</p>
-<blockquote>
-<div><ul>
-<li><p class="first">Without <em>sqlHonorFormElements</em>. Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">slaveId</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span> <span class="nx">FROM</span> <span class="nx">address</span> <span class="nx">WHERE</span> <span class="nx">personId</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="p">}}</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">id</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-<span class="nx">sqlInsert</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">INSERT</span> <span class="nx">INTO</span> <span class="nx">address</span> <span class="p">(</span><span class="sb">`personId`</span><span class="p">,</span> <span class="sb">`street`</span><span class="p">,</span> <span class="sb">`city`</span><span class="p">)</span> <span class="nx">VALUES</span> <span class="p">({{</span><span class="nx">id</span><span class="p">}},</span> <span class="s1">&#39;{{myStreet:FE:alnumx:s}}&#39;</span><span class="p">,</span> <span class="s1">&#39;{{myCity:FE:alnumx:s}}&#39;</span><span class="p">)</span> <span class="p">}}</span>
-<span class="nx">sqlUpdate</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">address</span> <span class="nx">SET</span> <span class="sb">`street`</span> <span class="o">=</span> <span class="s1">&#39;{{myStreet:FE:alnumx:s}}&#39;</span><span class="p">,</span> <span class="sb">`city`</span> <span class="o">=</span> <span class="s1">&#39;{{myCity:FE:alnumx:s}}&#39;</span>  <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-<span class="nx">sqlDelete</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">DELETE</span> <span class="nx">FROM</span> <span class="nx">address</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="k">AND</span> <span class="s1">&#39;{{myStreet:FE:alnumx:s}}&#39;</span><span class="o">=</span><span class="s1">&#39;&#39;</span> <span class="k">AND</span> <span class="s1">&#39;{{myCity:FE:alnumx:s}}&#39;</span><span class="o">=</span><span class="s1">&#39;&#39;</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first">With <em>sqlHonorFormElements</em>. Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">slaveId</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span> <span class="nx">FROM</span> <span class="nx">address</span> <span class="nx">WHERE</span> <span class="nx">personId</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="p">}}</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">id</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-<span class="nx">sqlHonorFormElements</span> <span class="o">=</span> <span class="nx">myStreet</span><span class="p">,</span> <span class="nx">myCity</span>       <span class="c1"># Non Templategroup</span>
-<span class="nx">sqlInsert</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">INSERT</span> <span class="nx">INTO</span> <span class="nx">address</span> <span class="p">(</span><span class="sb">`personId`</span><span class="p">,</span> <span class="sb">`street`</span><span class="p">,</span> <span class="sb">`city`</span><span class="p">)</span> <span class="nx">VALUES</span> <span class="p">({{</span><span class="nx">id</span><span class="p">}},</span> <span class="s1">&#39;{{myStreet:FE:alnumx:s}}&#39;</span><span class="p">,</span> <span class="s1">&#39;{{myCity:FE:alnumx:s}}&#39;</span><span class="p">)</span> <span class="p">}}</span>
-<span class="nx">sqlUpdate</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">address</span> <span class="nx">SET</span> <span class="sb">`street`</span> <span class="o">=</span> <span class="s1">&#39;{{myStreet:FE:alnumx:s}}&#39;</span><span class="p">,</span> <span class="sb">`city`</span> <span class="o">=</span> <span class="s1">&#39;{{myCity:FE:alnumx:s}}&#39;</span>  <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-<span class="nx">sqlDelete</span> <span class="o">=</span> <span class="p">{{</span><span class="nx">DELETE</span> <span class="nx">FROM</span> <span class="nx">address</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-
-<span class="c1"># For Templategroups: sqlHonorFormElements = myStreet%d, myCity%d</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</div></blockquote>
-</li>
-</ul>
-</div></blockquote>
-</div>
-</div>
-<div class="section" id="type-sendmail">
-<h3>Type: sendmail<a class="headerlink" href="#type-sendmail" title="Permalink to this headline">¶</a></h3>
-<ul>
-<li><p class="first">Send mail(s) will be processed after:</p>
-<blockquote>
-<div><ul class="simple">
-<li>saving the record ,</li>
-<li>processing all uploads,</li>
-<li>processing <cite>afterSave</cite> action <cite>FormElements</cite>.</li>
-</ul>
-</div></blockquote>
-</li>
-<li><p class="first"><em>FormElement.value</em>: Body of the email.</p>
-</li>
-<li><p class="first"><em>FormElement.parameter</em>:</p>
-<ul class="simple">
-<li><em>sendMailTo</em> - Comma-separated list of receiver email addresses. Optional: &#8216;realname &lt;<a class="reference external" href="mailto:john&#37;&#52;&#48;doe&#46;com">john<span>&#64;</span>doe<span>&#46;</span>com</a>&gt;. If there
-is no recipient email address, <em>no</em> mail will be sent.</li>
-<li><em>sendMailCc</em> - Comma-separated list of receiver email addresses. Optional: &#8216;realname &lt;<a class="reference external" href="mailto:john&#37;&#52;&#48;doe&#46;com">john<span>&#64;</span>doe<span>&#46;</span>com</a>&gt;.</li>
-<li><em>sendMailBcc</em> - Comma-separated list of receiver email addresses. Optional: &#8216;realname &lt;<a class="reference external" href="mailto:john&#37;&#52;&#48;doe&#46;com">john<span>&#64;</span>doe<span>&#46;</span>com</a>&gt;.</li>
-<li><em>sendMailFrom</em> - Sender of the email. Optional: &#8216;realname &lt;<a class="reference external" href="mailto:john&#37;&#52;&#48;doe&#46;com">john<span>&#64;</span>doe<span>&#46;</span>com</a>&gt;&#8217;. <strong>Mandatory</strong>.</li>
-<li><em>sendMailSubject</em> - Subject of the email.</li>
-<li><em>sendMailReplyTo</em> - Reply this email address. Optional: &#8216;realname &lt;<a class="reference external" href="mailto:john&#37;&#52;&#48;doe&#46;com">john<span>&#64;</span>doe<span>&#46;</span>com</a>&gt;&#8217;.</li>
-<li><em>sendMailFlagAutoSubmit</em> - <strong>on|off</strong> - If &#8216;on&#8217; (default), the mail contains the header
-&#8216;Auto-Submitted: auto-send&#8217; - this suppress a) OoO replies, b) forwarding of emails.</li>
-<li><em>sendMailGrId</em> - Will be copied to the mailLog record. Helps to setup specific logfile queries.</li>
-<li><em>sendMailXId</em> - Will be copied to the mailLog record. Helps to setup specific logfile queries.</li>
-</ul>
-</li>
-<li><p class="first">To use values of the submitted form, use the STORE_FORM. E.g. <cite>{{name:F:allbut}}</cite></p>
-</li>
-<li><p class="first">To use the <cite>id</cite> of a new created or already existing one, use the STORE_RECORD. E.g. <cite>{{id:R}}</cite></p>
-</li>
-<li><p class="first">For debugging, please check <a class="reference internal" href="#redirect-all-mail-to">REDIRECT_ALL_MAIL_TO</a>.</p>
-</li>
-</ul>
-<div class="section" id="type-paste">
-<h4>Type: paste<a class="headerlink" href="#type-paste" title="Permalink to this headline">¶</a></h4>
-<p>See also <a class="reference internal" href="#copy-form">copy-form</a>.</p>
-<ul class="simple">
-<li><em>sql1</em>: e.g. <cite>{{!SELECT {{id:P}} AS id, &#8216;{{myNewName:FE:allbut}}&#8217; AS name}}</cite> (only one record) or <cite>{{!SELECT i.id AS id, {{basketId:P}} AS basketId FROM Item AS i WHERE i.basketId={{id:P}} }}</cite> (multiple records)<ul>
-<li>Pay attention to &#8216;!&#8217;.</li>
-<li>For every row, a new record is created in <cite>recordDestinationTable</cite>.</li>
-<li>Column &#8216;id&#8217; is not copied.</li>
-<li>The <cite>recordSourceTable</cite> together with columne <cite>id</cite> will identify the source record.</li>
-<li>Columns not specified, will be copied 1:1 from source to destination.</li>
-<li>Columns specified, will overwrite the source value.</li>
-</ul>
-</li>
-<li><em>FormElement.parameter</em>:<ul>
-<li><em>recordSourceTable</em> - Optional: table from where the records will be copied. Default: &lt;recordDestinationTable&gt;</li>
-<li><em>recordDestinationTable</em> - table where the new records will be copied to.</li>
-<li><em>translateIdColumn</em> - columnname to update references of newly created id&#8217;s.</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-</div>
-<div class="section" id="multi-language-form">
-<span id="id32"></span><h2>Multi Language Form<a class="headerlink" href="#multi-language-form" title="Permalink to this headline">¶</a></h2>
-<p>QFQ Forms might be configured for up to 5 different languages. Per language there is one extra field in the <em>Form editor</em>.
-Which field represents which language is configured in <a class="reference internal" href="#id5">config.qfq.ini</a>.</p>
-<ul class="simple">
-<li>The Typo3 installation needs to be configured to handle different languages - this is independet of QFQ and not covered
-here. QFQ will use the Typo3 internal variable &#8216;pageLanguage&#8217;, which typically correlates to the URL parameter &#8216;L&#8217; in the URL.</li>
-<li>In <a class="reference internal" href="#id5">config.qfq.ini</a> the Typo3 language index (value of &#8216;L&#8217;) and a language label have to be configured for each language.
-Only than, the additional language fields in the <em>Form editor</em> will be shown.</li>
-</ul>
-<div class="section" id="id33">
-<h3>Example<a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h3>
-<p>Assuming the Typo3 page has the</p>
-<ul class="simple">
-<li>default language, L=0</li>
-<li>english, L=1</li>
-<li>spain, L=2</li>
-</ul>
-<p>Configuration in <cite>config.qfq.ini</cite>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">FORM_LANGUAGE_A_ID</span> <span class="o">=</span> <span class="mi">1</span>
-<span class="nx">FORM_LANGUAGE_A_LABEL</span> <span class="o">=</span> <span class="nx">english</span>
-
-<span class="nx">FORM_LANGUAGE_B_ID</span> <span class="o">=</span> <span class="mi">2</span>
-<span class="nx">FORM_LANGUAGE_B_LABEL</span> <span class="o">=</span> <span class="nx">spain</span>
-</pre></div>
-</div>
-<p>The default language is not covered in config.qfq.ini.</p>
-<p>The <em>Form editor</em> now shows on the pill &#8216;Basic&#8217; (Form und FormEditor) for both languages each an additional parameter
-input field. Any input field in the <em>Form editor</em> can be redeclared in the correspondig language parameter field. Any
-missing definition means &#8216;take the default&#8217;. E.g.:</p>
-<ul>
-<li><dl class="first docutils">
-<dt>Form: &#8216;person&#8217;</dt>
-<dd><table border="1" class="first last docutils">
-<colgroup>
-<col width="43%" />
-<col width="57%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Column</th>
-<th class="head">Value</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>title</td>
-<td>Eingabe Person</td>
-</tr>
-<tr class="row-odd"><td>languageParameterA</td>
-<td>title=Input Person</td>
-</tr>
-<tr class="row-even"><td>languageParameterB</td>
-<td>title=Persona de entrada</td>
-</tr>
-</tbody>
-</table>
-</dd>
-</dl>
-</li>
-<li><dl class="first docutils">
-<dt>FormElement &#8216;firstname&#8217; in Form &#8216;person&#8217;:</dt>
-<dd><table border="1" class="first last docutils">
-<colgroup>
-<col width="29%" />
-<col width="71%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Column</th>
-<th class="head">Value</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>title</td>
-<td>Vorname</td>
-</tr>
-<tr class="row-odd"><td>note</td>
-<td>Bitte alle Vornamen erfassen</td>
-</tr>
-<tr class="row-even"><td>languageParameterA</td>
-<td><div class="first last line-block">
-<div class="line">title=Firstname</div>
-<div class="line">note=Please give all firstnames</div>
-</div>
-</td>
-</tr>
-<tr class="row-odd"><td>languageParameterB</td>
-<td><div class="first last line-block">
-<div class="line">title=Persona de entrada</div>
-<div class="line">note=Por favor, introduzca todos los nombres</div>
-</div>
-</td>
-</tr>
-</tbody>
-</table>
-</dd>
-</dl>
-</li>
-</ul>
-<p>The following fields are possible:</p>
-<ul class="simple">
-<li>Form: <em>title, showButton, forwardMode, forwardPage, bsLabelColumns, bsInputColumns, bsNoteColumns, recordLockTimeoutSeconds</em></li>
-<li>FormElement: <em>label, mode, modeSql, class, type, subrecordOption, encode, checkType, ord, tabindex, size, maxLength,</em>
-<em>bsLabelColumns, bsInputColumns, bsNoteColumns,rowLabelInputNote, note, tooltip, placeholder, value, sql1, feGroup</em></li>
-</ul>
-</div>
-</div>
-<div class="section" id="dynamic-update">
-<span id="id34"></span><h2>Dynamic Update<a class="headerlink" href="#dynamic-update" title="Permalink to this headline">¶</a></h2>
-<p>The &#8216;Dynamic Update&#8217; feature makes a form more interactive. If a user changes a <em>FormElement</em> who is tagged with
-&#8216;dynamicUpdate&#8217;, <em>all</em> elements who are tagged with &#8216;dynamicUpdate&#8217;, will be recalculated and rerendered.</p>
-<p>The following fields will be recalculated during &#8216;Dynamic Update&#8217;</p>
-<ul class="simple">
-<li>&#8216;modeSql&#8217; - Possible values: &#8216;show&#8217;, &#8216;required&#8217;, &#8216;readonly&#8217;, &#8216;hidden&#8217;</li>
-<li>&#8216;label&#8217;</li>
-<li>&#8216;value&#8217;</li>
-<li>&#8216;note&#8217;</li>
-<li>&#8216;parameter.*&#8217; - especially &#8216;itemList&#8217;</li>
-</ul>
-<p>To make a form dynamic:</p>
-<ul class="simple">
-<li>Mark all <em>FormElements</em> with <cite>dynamic update`=`enabled</cite>, which should <strong>initiate</strong> or <strong>receive</strong> updates.</li>
-</ul>
-<p>See #3426 / Dynamic Update: Inputs loose the new content and shows the old value:</p>
-<ul>
-<li><p class="first">On <strong>all</strong> <cite>dynamic update</cite> <em>FormElements</em> an explicit definition of <cite>value</cite>, including a sanitize class, is necessary
-(except the field is numeric). <strong>A missing definition let&#8217;s the content overwrite all the time with the old value</strong>.
-A typical definition for <cite>value</cite> looks like (default store priority is: FSRVD):</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="o">&lt;</span><span class="nx">FormElement</span> <span class="nx">name</span><span class="o">&gt;::</span><span class="nx">alnumx</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first">Define the receiving <em>FormElements</em> in a way, that they will interpret the recent user change! The form variable of the
-specific sender <em>FormElement</em> <cite>{{&lt;sender element&gt;:F:&lt;sanitize&gt;}}</cite> should be part of one of the above fields to get an
-impact. E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">[</span><span class="nx">receiving</span> <span class="o">*</span><span class="nx">FormElement</span><span class="o">*</span><span class="p">]</span><span class="o">.</span><span class="nx">parameter</span><span class="o">:</span> <span class="nx">itemList</span><span class="o">=</span><span class="p">{{</span> <span class="nx">SELECT</span> <span class="k">IF</span><span class="p">({{</span><span class="nx">carPriceRange</span><span class="o">:</span><span class="nx">FE</span><span class="o">:</span><span class="nx">alnumx</span><span class="p">}}</span><span class="o">=</span><span class="s1">&#39;expensive&#39;</span><span class="p">,</span><span class="s1">&#39;Ferrari,Tesla,Jaguar&#39;</span><span class="p">,</span><span class="s1">&#39;General Motors,Honda,Seat,Fiat&#39;</span><span class="p">)</span> <span class="p">}}</span>
-</pre></div>
-</div>
-<p>Remember to specify a &#8216;sanitize&#8217; class - a missing sanitize class means &#8216;digit&#8217;, every content, which is not numeric,
-violates the sanitize class and becomes therefore an empty string!</p>
-</li>
-<li><p class="first">If the dynamic update should work on existing and <em>new</em> records, it&#8217;s important to guarantee that the query result is not empty!
-even if the primary record does not exist! E.g. use a <cite>LEFT JOIN</cite>. The following query is ok for <cite>new</cite> and <cite>edit</cite>.</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="nx">SELECT</span> <span class="k">IF</span><span class="p">(</span> <span class="nx">IFNULL</span><span class="p">(</span><span class="nx">adr</span><span class="o">.</span><span class="nx">type</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="nx">LIKE</span> <span class="s1">&#39;%token%&#39;</span><span class="p">,</span><span class="s1">&#39;show&#39;</span><span class="p">,</span><span class="s1">&#39;hidden&#39;</span><span class="p">)</span> <span class="nx">FROM</span> <span class="p">(</span><span class="nx">SELECT</span> <span class="mi">1</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">fake</span> <span class="nx">LEFT</span> <span class="nx">JOIN</span> <span class="nx">Address</span> <span class="k">AS</span> <span class="nx">adr</span> <span class="nx">ON</span> <span class="nx">adr</span><span class="o">.</span><span class="nx">type</span><span class="o">=</span><span class="s1">&#39;{{type:FR0}}&#39;</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-<div class="section" id="examples">
-<h3>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Master FormElement &#8216;music&#8217; is a radio/enum of &#8216;classic&#8217;, &#8216;jazz&#8217;, &#8216;pop&#8217;.</li>
-</ul>
-<div class="section" id="content-of-a-select-list">
-<h4>Content of a select list<a class="headerlink" href="#content-of-a-select-list" title="Permalink to this headline">¶</a></h4>
-<ul class="simple">
-<li>Slave FormElement &#8216;interpret&#8217; is &#8216;select&#8217;-list, depending of &#8216;music&#8217;</li>
-</ul>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">sql</span><span class="o">=</span><span class="p">{{</span><span class="o">!</span><span class="nx">SELECT</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">interpret</span> <span class="nx">WHERE</span> <span class="nx">music</span><span class="o">=</span><span class="p">{{</span><span class="nx">music</span><span class="o">:</span><span class="nx">FE</span><span class="o">:</span><span class="nx">alnumx</span><span class="p">}}</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">name</span><span class="p">}}</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="show-hide-a-formelement">
-<h4>Show / Hide a <em>FormElement</em><a class="headerlink" href="#show-hide-a-formelement" title="Permalink to this headline">¶</a></h4>
-<ul class="simple">
-<li>Slave &#8216;interpret&#8217; is displayed only for &#8216;pop&#8217;. Field &#8216;modeSql&#8217;:</li>
-</ul>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">{{</span><span class="nx">SELECT</span> <span class="k">IF</span><span class="p">(</span> <span class="s1">&#39;{{music:FR:alnumx}}&#39;</span><span class="o">=</span><span class="s1">&#39;pop&#39;</span> <span class="p">,</span><span class="s1">&#39;show&#39;</span><span class="p">,</span> <span class="s1">&#39;hidden&#39;</span> <span class="p">)</span> <span class="p">}}</span>
-</pre></div>
-</div>
-</div>
-</div>
-</div>
-<div class="section" id="form-layout">
-<span id="id35"></span><h2>Form Layout<a class="headerlink" href="#form-layout" title="Permalink to this headline">¶</a></h2>
-<p>The forms will be rendered with Bootstrap CSS classes, based on the 12 column grid model (Bootstrap 3.x).
-Generally a 3 column layout for <em>label</em> columns on the left side, an <em>input</em> field column in the middle and a <em>note</em>
-column on the right side will be rendered.</p>
-<p>The used default column (=bootstrap grid) width is <em>3,6,3</em> for <em>label, input, note</em>.</p>
-<ul class="simple">
-<li>The system wide default can be changed via <a class="reference internal" href="#config-qfq-ini">config-qfq-ini</a> - the new settings are the default
-settings for all forms.</li>
-<li>Per <em>Form</em> settings can be done in the <em>Form</em> parameter field. They overwrite the system wide default.</li>
-<li>Per <em>FormElement</em> settings can be done in the <em>FormElement</em> parameter field. They overwrite the <em>Form</em> setting.</li>
-</ul>
-<p>A column will be switched off (no wrapping via <cite>&lt;div class=&#8217;col-md-?&gt;</cite>) by setting a <cite>0</cite> on the respective column.</p>
-<div class="section" id="custom-field-width">
-<h3>Custom field width<a class="headerlink" href="#custom-field-width" title="Permalink to this headline">¶</a></h3>
-<p>Per <em>FormElement</em> set <cite>BS Label Columns</cite>, <cite>BS Input Columns</cite> or <cite>BS Note Columns</cite> to customize an individual width.
-The sum of these three columns should always be 12.</p>
-</div>
-<div class="section" id="multiple-elements-per-row">
-<h3>Multiple Elements per row<a class="headerlink" href="#multiple-elements-per-row" title="Permalink to this headline">¶</a></h3>
-<p>Every row is by default wrapped in a <cite>&lt;div class=&#8217;form-group&#8217;&gt;</cite> and every column is wrapped in a <cite>&lt;div class=&#8217;col-md-?&#8217;&gt;</cite>.
-To display multiple input elements in one row, the wrapping of the <em>FormElement</em> row and of the three columns can be
-customized via the checkboxes of <cite>Label / Input / Note</cite>. Every open and every close tag can be individually switched on
-or off.</p>
-<p>E.g. to display 2 <em>FormElements</em> in a row with one label (first <em>FormElement</em>) and one note (last <em>FormElement</em>) we need
-the following (switch off all non named):</p>
-<ul class="simple">
-<li>First <em>FormElement</em><ul>
-<li>open row tag: <cite>row</cite> ,</li>
-<li>open and close label tag: <cite>label</cite>, <cite>/label</cite>,</li>
-<li>open and close field tag: <cite>input</cite>, <cite>/input</cite>,</li>
-</ul>
-</li>
-<li>Second <em>FormElement</em><ul>
-<li>open and close field tag: <cite>input</cite>, <cite>/input</cite>,</li>
-<li>open and close note tag: <cite>note</cite>, <cite>/note</cite>,</li>
-<li>close row tag: <cite>/row</cite> ,</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div class="section" id="copy-form">
-<span id="id36"></span><h2>Copy Form<a class="headerlink" href="#copy-form" title="Permalink to this headline">¶</a></h2>
-<p>Records (=master) and child records can be duplicated (=copied) by a regular <cite>Form</cite>, extended by <cite>FormElemens</cite> of type &#8216;paste&#8217;.
-A &#8216;copy form&#8217; works either in:</p>
-<ul class="simple">
-<li>&#8216;copy and paste now&#8217; mode: the &#8216;select&#8217; and &#8216;paste&#8217; <cite>Form</cite> is merged in one form, only one master record is possible,</li>
-<li>&#8216;copy now, paste later&#8217; mode: the &#8216;select&#8217; <cite>Form</cite> selects master record(s), the &#8216;paste&#8217; Form paste&#8217;s them later.</li>
-</ul>
-<div class="section" id="id37">
-<h3>Concept<a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h3>
-<p>A &#8216;select action&#8217; (e.g. a <cite>Form</cite> or a button click) creates record(s) in the table <cite>Clipboard</cite>. Each clipboard record contains:</p>
-<ul class="simple">
-<li>the &#8216;id(s)&#8217; of the record(s) to duplicate,</li>
-<li>the &#8216;paste&#8217; form id (that <cite>Form</cite> defines, to which table the master records belongs to, as well as rules of how to
-duplicate any slave records) and where to copy the new records</li>
-<li>user identifier (QFQ cookie) to separate clipboard records of different users inside the Clipboard table.</li>
-</ul>
-<p>The &#8216;select action&#8217; is also responsible to delete old clipboard records of the current user, before new clipboard records are
-created.</p>
-<p>The &#8216;paste form&#8217; iterates over all master record id(s) in the <cite>Clipboard</cite> table. For each master record id, all FormElements
-of type <cite>paste</cite> are fired (incl. the creating of slave records).</p>
-<p>E.g. if there is a basket with different items and you want to duplicate the whole basket including new items, create a
-form with the following parameter</p>
-<blockquote>
-<div><ul class="simple">
-<li>Form<ul>
-<li>Name: <cite>copyBasket</cite></li>
-<li>Table: <cite>Clipboard</cite></li>
-<li>Show Button: only <cite>close</cite> and <cite>save</cite></li>
-</ul>
-</li>
-<li>FormElement 1: Record id of the source record.<ul>
-<li>Name: <cite>idSrc</cite></li>
-<li>Lable: <cite>Source Form</cite></li>
-<li>Class: <cite>native</cite></li>
-<li>Type: <cite>select</cite></li>
-<li>sql1: <cite>{{! SELECT id, title FROM Basket }}</cite></li>
-</ul>
-</li>
-<li>FormElement 2: New name of the copied record.<ul>
-<li>Name: <cite>myNewName</cite></li>
-<li>Class: <cite>native</cite></li>
-<li>Type: <cite>text</cite></li>
-</ul>
-</li>
-<li>FormElement 3: a) Check that there is no name conflict. b)Purge any old clipboard content of the current user.<ul>
-<li>Name: <cite>clearClipboard</cite></li>
-<li>Class: <cite>action</cite></li>
-<li>Type: <cite>beforeSave</cite></li>
-<li>Parameter:<ul>
-<li><cite>sqlValidate={{!SELECT f.id FROM Form AS f WHERE f.name LIKE &#8216;{{myName:FE:alnumx}}&#8217; LIMIT 1}}</cite></li>
-<li><cite>expectRecords = 0</cite></li>
-<li><cite>messageFail = There is already a form with this name</cite></li>
-<li><cite>sqlAfter={{DELETE FROM Clipboard WHERE cookie=&#8217;{{cookieQfq:C0:alnumx}}&#8217; }}</cite></li>
-</ul>
-</li>
-</ul>
-</li>
-<li>FormElement 4: Update the clipboard source reference, with current {{cookieQfq:C}} identifier.<ul>
-<li>Name: <cite>updateClipboardRecord</cite></li>
-<li>Class: <cite>action</cite></li>
-<li>Type: <cite>afterSave</cite></li>
-<li>Parameter: <cite>sqlAfter={{UPDATE Clipboard SET cookie=&#8217;{{cookieQfq:C0:alnumx}}&#8217;, formIdPaste={{formId:S0}} /* PasteForm */  WHERE id={{id:R}} LIMIT 1 }}</cite></li>
-</ul>
-</li>
-<li>FormElement 5: Copy basket identifier.<ul>
-<li>Name: <cite>basketId</cite></li>
-<li>Class: <cite>action</cite></li>
-<li>Type: <cite>paste</cite></li>
-<li>sql1: <cite>{{!SELECT {{id:P}} AS id,  &#8216;{{myNewName:FE:allbut}}&#8217; AS name}}</cite></li>
-<li>Parameter: <cite>recordDestinationTable=Basket</cite></li>
-</ul>
-</li>
-<li>FormElement 6: Copy items of basket.<ul>
-<li>Name: <cite>itemId</cite></li>
-<li>Class: <cite>action</cite></li>
-<li>Type: <cite>paste</cite></li>
-<li>sql1: <cite>{{!SELECT i.id AS id, {{basketId:P}} AS basketId FROM Item AS i WHERE i.basketId={{id:P}} }}</cite></li>
-<li>Parameter: <cite>recordDestinationTable=Item</cite></li>
-</ul>
-</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="table-self-referencing-records">
-<h3>Table self referencing records<a class="headerlink" href="#table-self-referencing-records" title="Permalink to this headline">¶</a></h3>
-<p>Records might contain references to other recrods in the same table. E.g. native FormElements might assigned to a fieldSet,
-templateGroup or pill, a fieldSet might assigned to other fieldsets or pills and so on. When duplicating a <cite>Form</cite> and the
-corresponding <cite>FormElements</cite> all internal references needs to be updated as well.</p>
-<p>On each FormElement.type=`paste` record, the column to be updated is defined via:</p>
-<blockquote>
-<div><ul class="simple">
-<li>parameter: translateIdColumn = &lt;columnname&gt;</li>
-</ul>
-</div></blockquote>
-<p>For the &#8216;copyForm&#8217; this would be &#8216;feIdContainer&#8217;.</p>
-<p>The update of the records is started after all records have been copied (of the specific FormElement.type=`paste` record).</p>
-</div>
-</div>
-<div class="section" id="delete-record">
-<span id="id38"></span><h2>Delete Record<a class="headerlink" href="#delete-record" title="Permalink to this headline">¶</a></h2>
-<p>Deleting record(s) via QFQ might be solved by either:</p>
-<ul class="simple">
-<li>using the <cite>delete</cite> button on a form on the top right corner.</li>
-<li>by letting <a class="reference internal" href="#report">report</a> creating a special link (see below). The link contains the record id and:<ul>
-<li>a form name, or</li>
-<li>a table name.</li>
-</ul>
-</li>
-</ul>
-<p>Deleting a record just by specifying a table name, will only delete the defined record (no slave records).</p>
-<ul class="simple">
-<li>By using a delete button via <cite>report</cite> or in a <cite>subrecord</cite> row, a ajax request is send.</li>
-<li>By using a delete button on the top right corner of the form, the form will be closed after deleting the record.</li>
-</ul>
-<p>Example for report:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;form=person&amp;r=&#39;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_Paged</span> <span class="nx">FROM</span> <span class="nx">Person</span> <span class="k">AS</span> <span class="nx">p</span>
-<span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;table=Person&amp;r=&#39;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_Paged</span> <span class="nx">FROM</span> <span class="nx">Person</span> <span class="k">AS</span> <span class="nx">p</span>
-</pre></div>
-</div>
-<p>To automatically delete slave records, use a form and create <cite>beforeDelete</cite> FormElement(s) on the form:</p>
-<blockquote>
-<div><ul class="simple">
-<li>class: action</li>
-<li>type: beforeDelete</li>
-<li>parameter: sqlAfter={{DELETE FROM &lt;slaveTable&gt; WHERE &lt;slaveTable&gt;.&lt;masteId&gt;={{id:R}} }}</li>
-</ul>
-</div></blockquote>
-<p>You might also check the form &#8216;form&#8217; how the slave records &#8216;FormElement&#8217; will be deleted.</p>
-</div>
-<div class="section" id="locking-record-form">
-<span id="locking-record"></span><h2>Locking Record / Form<a class="headerlink" href="#locking-record-form" title="Permalink to this headline">¶</a></h2>
-<p>Support for record locking is given with mode:</p>
-<ul class="simple">
-<li><em>exclusive</em>: user can&#8217;t force a write.<ul>
-<li>Including a timeout (default 15 mins: DIRTY_RECORD_TIMEOUT_SECONDS in <a class="reference internal" href="#id5">config.qfq.ini</a>) for maximum lock time.</li>
-</ul>
-</li>
-<li><em>advisory</em>: user is only warned, but allowed to overwrite.</li>
-<li><em>none</em>: no bookeeping about locks.</li>
-</ul>
-<p>For &#8216;new&#8217; records (r=0) there is no locking at all.</p>
-<p>The record locking protection is based on the <cite>tablename</cite> and the <cite>record id</cite>. Different <cite>Forms</cite>, with the same primary table,
-will be protected by record locking. On the other side, action-<cite>FormElements</cite> updating non primary table records are not
-protected by &#8216;record locking&#8217;: the QFQ record locking is <em>NOT 100%</em>.</p>
-<p>The &#8216;record locking&#8217; mode will be specified per <cite>Form</cite>. If there are multiple Forms with different modes, and there is
-already a lock for a <cite>tablename</cite> / <cite>record id</cite> pair, the most restrictive will be applied.</p>
-</div>
-<div class="section" id="best-practice">
-<h2>Best practice<a class="headerlink" href="#best-practice" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="custom-default-value-only-for-new-records">
-<h3>Custom default value only for &#8216;new records&#8217;<a class="headerlink" href="#custom-default-value-only-for-new-records" title="Permalink to this headline">¶</a></h3>
-<p>In the specific <cite>FormElement</cite> set <cite>value={{columnName:RSE}}</cite>. The link to the form should be rendered with
-&#8216;&#8221;...&amp;columnName=&lt;data&gt;&amp;...&#8221; AS _page&#8217;. The trick is that the STORE_RECORD is empty for new records, and therefore the
-corresponding value from STORE_SIP will be returned. Existing records will use the already saved value.</p>
-</div>
-<div class="section" id="central-configured-values">
-<h3>Central configured values<a class="headerlink" href="#central-configured-values" title="Permalink to this headline">¶</a></h3>
-<p>Any variable in <em>config.qfq.ini</em> can be used by <em>{{&lt;varname&gt;:Y}}</em> in form or report statements.</p>
-<p>E.g.</p>
-<blockquote>
-<div>TECHNICAL_CONTACT = <a class="reference external" href="mailto:jane&#46;doe&#37;&#52;&#48;example&#46;net">jane<span>&#46;</span>doe<span>&#64;</span>example<span>&#46;</span>net</a></div></blockquote>
-<p>Could be used in an <em>FormElement.type</em> = sendmail with <em>parameter</em>  setting <em>sendMailFrom={{TECHNICAL_CONTACT:Y}}</em>.</p>
-</div>
-<div class="section" id="debug-report">
-<h3>Debug Report<a class="headerlink" href="#debug-report" title="Permalink to this headline">¶</a></h3>
-<p>Writing &#8220;report&#8217;s&#8221; in the nested notation or long queries broken over several lines, might not interpreted as wished.
-Best for debugging is to specify in the tt-content record:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">debugShowBodyText</span> <span class="o">=</span> <span class="mi">1</span>
-</pre></div>
-</div>
-<p>Note: Debug information is only display if it&#8217;s enabled in  <em>config.qfq.ini</em> by</p>
-<blockquote>
-<div><ul class="simple">
-<li><em>SHOW_DEBUG_INFO=yes</em> or</li>
-<li><em>SHOW_DEBUG_INFO=auto</em> and logged in in the same Browser as a Typo3 backend user.</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="more-detailed-error-messages">
-<h3>More detailed error messages<a class="headerlink" href="#more-detailed-error-messages" title="Permalink to this headline">¶</a></h3>
-<p>If <em>SHOW_DEBUG_INFO</em> is enabled, a full stacktrace and variable contents are displayed in case of an error.</p>
-</div>
-<div class="section" id="person-search-form">
-<h3>Person search form<a class="headerlink" href="#person-search-form" title="Permalink to this headline">¶</a></h3>
-<p>QFQ content record:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># Creates a small form that redirects back to this page</span>
-<span class="mi">10</span> <span class="p">{</span>
-  <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s1">&#39;_&#39;</span>
-  <span class="nx">head</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">form</span> <span class="nx">action</span><span class="o">=</span><span class="s1">&#39;#&#39;</span> <span class="nx">method</span><span class="o">=</span><span class="s1">&#39;get&#39;</span><span class="o">&gt;&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s1">&#39;hidden&#39;</span> <span class="nx">name</span><span class="o">=</span><span class="s1">&#39;id&#39;</span> <span class="nx">value</span><span class="o">=</span><span class="s1">&#39;{{pageId:T}}&#39;</span><span class="o">&gt;</span><span class="nx">Search</span><span class="o">:</span> <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s1">&#39;text&#39;</span> <span class="nx">name</span><span class="o">=</span><span class="s1">&#39;search&#39;</span> <span class="nx">value</span><span class="o">=</span><span class="s1">&#39;{{search:CE:all}}&#39;</span><span class="o">&gt;&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s1">&#39;submit&#39;</span> <span class="nx">value</span><span class="o">=</span><span class="s1">&#39;Submit&#39;</span><span class="o">&gt;&lt;/</span><span class="nx">form</span><span class="o">&gt;</span>
-<span class="p">}</span>
-
-<span class="c1"># SQL statement will find and list all the relevant forms</span>
-<span class="mi">20</span> <span class="p">{</span>
-  <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;?detail&amp;form=form&amp;r=&#39;</span><span class="p">,</span> <span class="nx">f</span><span class="o">.</span><span class="nx">id</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_Pagee</span><span class="p">,</span> <span class="nx">f</span><span class="o">.</span><span class="nx">id</span><span class="p">,</span> <span class="nx">f</span><span class="o">.</span><span class="nx">name</span><span class="p">,</span> <span class="nx">f</span><span class="o">.</span><span class="nx">title</span>
-            <span class="nx">FROM</span> <span class="nx">Form</span> <span class="k">AS</span> <span class="nx">f</span>
-            <span class="nx">WHERE</span> <span class="nx">f</span><span class="o">.</span><span class="nx">name</span> <span class="nx">LIKE</span>  <span class="s1">&#39;%{{search:CE:all}}%&#39;</span>
-  <span class="nx">head</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">table</span> <span class="nx">class</span><span class="o">=</span><span class="s1">&#39;table&#39;</span><span class="o">&gt;</span>
-  <span class="nx">tail</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">table</span><span class="o">&gt;</span>
-  <span class="nx">rbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">tr</span><span class="o">&gt;</span>
-  <span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">tr</span><span class="o">&gt;</span>
-  <span class="nx">fbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">td</span><span class="o">&gt;</span>
-  <span class="nx">fend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">td</span><span class="o">&gt;</span>
-<span class="p">}</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="form-compute-next-free-ord-automatically">
-<h3>Form: compute next free &#8216;ord&#8217; automatically<a class="headerlink" href="#form-compute-next-free-ord-automatically" title="Permalink to this headline">¶</a></h3>
-<p>Requirement: new records should automatically get the highest number plus 10 for their &#8216;ord&#8217; value. Existing records
-should not be altered.</p>
-<div class="section" id="version-1">
-<h4>Version 1<a class="headerlink" href="#version-1" title="Permalink to this headline">¶</a></h4>
-<p>Compute the next &#8216;ord&#8217; in advance in the subrecord field of the primary form. Submit that value to the new record
-via SIP parameter to the secondary form.</p>
-<p>On the secondary form: for &#8216;new&#8217; records choose the computed value, for existing records leave the value
-unchanged.</p>
-<ul>
-<li><p class="first">Master form, <cite>subrecord</cite> <em>FormElement</em>, field <cite>parameter</cite>: set</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">detail</span><span class="o">=</span><span class="nx">id</span><span class="o">:</span><span class="nx">formId</span><span class="p">,{{</span><span class="nx">SELECT</span> <span class="s1">&#39;&amp;&#39;</span><span class="p">,</span> <span class="nx">IFNULL</span><span class="p">(</span><span class="nx">fe</span><span class="o">.</span><span class="nb">ord</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="mi">10</span> <span class="nx">FROM</span> <span class="nx">Form</span> <span class="k">AS</span> <span class="nx">f</span> <span class="nx">LEFT</span> <span class="nx">JOIN</span> <span class="o">*</span><span class="nx">FormElement</span><span class="o">*</span> <span class="k">AS</span> <span class="nx">fe</span> <span class="nx">ON</span> <span class="nx">fe</span><span class="o">.</span><span class="nx">formId</span><span class="o">=</span><span class="nx">f</span><span class="o">.</span><span class="nx">id</span> <span class="nx">WHERE</span>
-<span class="nx">f</span><span class="o">.</span><span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">r</span><span class="o">:</span><span class="nx">S0</span><span class="p">}}</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">fe</span><span class="o">.</span><span class="nb">ord</span> <span class="nx">DESC</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span><span class="o">:</span><span class="nb">ord</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first">Slave form, <cite>ord</cite> <em>FormElement</em>, field <cite>value</cite>: set</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="sb">`{{ord:RS0}}`</span><span class="o">.</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</div>
-<div class="section" id="version-2">
-<h4>Version 2<a class="headerlink" href="#version-2" title="Permalink to this headline">¶</a></h4>
-<p>Compute the next &#8216;ord&#8217; as default value direct inside the secondary form. No change is needed for the primary form.</p>
-<ul class="simple">
-<li>Secondary form, <cite>ord</cite> <em>FormElement</em>, field <cite>value</cite>: set <cite>{{SELECT IF({{ord:R0}}=0,  MAX(IFNULL(fe.ord,0))+10,{{ord:R0}})  FROM (SELECT 1) AS a LEFT JOIN FormElement AS fe ON fe.formId={{formId:S0}} GROUP BY fe.formId}}</cite>.</li>
-</ul>
-</div>
-</div>
-<div class="section" id="form-person-wizard-firstname-city">
-<h3>Form: Person Wizard - firstname, city<a class="headerlink" href="#form-person-wizard-firstname-city" title="Permalink to this headline">¶</a></h3>
-<p>Requirement: A form that displays the column &#8216;firstname&#8217; from table &#8216;Person&#8217; and &#8216;city&#8217; from table &#8216;Address&#8217;. If the
-records not exist, the form should create it.</p>
-<p>Form primary table: Person</p>
-<p>Form slave table: Address</p>
-<p>Relation: <cite>Person.id = Address.personId</cite></p>
-<ul class="simple">
-<li>Form: wizard<ul>
-<li>Name: wizard</li>
-<li>Title: Person Wizard</li>
-<li>Table: Person</li>
-<li>Render: bootstrap</li>
-</ul>
-</li>
-<li><em>FormElement</em>: firstname<ul>
-<li>Class: <strong>native</strong></li>
-<li>Type: <strong>text</strong></li>
-<li>Name: firstname</li>
-<li>Label: Firstname</li>
-</ul>
-</li>
-<li><em>FormElement</em>: email, text, 20<ul>
-<li>Class: <strong>native</strong></li>
-<li>Type: <strong>text</strong></li>
-<li>Name: city</li>
-<li>Label: City</li>
-<li>Value: <cite>{{SELECT city FROM Address WHERE personId={{r}} ORDER BY id LIMIT 1}}</cite></li>
-</ul>
-</li>
-<li><em>FormElement</em>: insert/update address record<ul>
-<li>Class: <strong>action</strong></li>
-<li>Type: <strong>afterSave</strong></li>
-<li>Label: Manage Address</li>
-<li>Parameter:<ul>
-<li><cite>slaveId={{SELECT id FROM Address WHERE personId={{r}} ORDER BY id LIMIT 1}}</cite></li>
-<li><cite>sqlInsert={{INSERT INTO Address (personId, city) VALUES ({{r}}, &#8216;{{city:F:allbut:s}}&#8217;) }}</cite></li>
-<li><cite>sqlUpdate={{UPDATE Address SET city=&#8217;{{city:F:allbut:s}}&#8217; WHERE id={{slaveId:V}} }}</cite></li>
-<li><cite>sqlDelete={{DELETE FROM Address WHERE id={{slaveId:V}} AND &#8216;&#8217;=&#8217;{{city:F:allbut:s}}&#8217; LIMIT 1}}</cite></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="form-person-wizard-firstname-single-note">
-<h3>Form: Person Wizard - firstname, single note<a class="headerlink" href="#form-person-wizard-firstname-single-note" title="Permalink to this headline">¶</a></h3>
-<p>Requirement: A form that displays the column &#8216;firstname&#8217; from table &#8216;Person&#8217; and &#8216;note&#8217; from table &#8216;Note&#8217;.
-If the records don&#8217;t exist, the form should create it.
-Column Person.noteId points to Note.id</p>
-<p>Form primary table: Person</p>
-<p>Form slave table: Address</p>
-<p>Relation: <cite>Person.id = Address.personId</cite></p>
-<ul class="simple">
-<li>Form: wizard<ul>
-<li>Name: wizard</li>
-<li>Title: Person Wizard</li>
-<li>Table: Person</li>
-<li>Render: bootstrap</li>
-</ul>
-</li>
-<li><em>FormElement</em>: firstname<ul>
-<li>Class: <strong>native</strong></li>
-<li>Type: <strong>text</strong></li>
-<li>Name: firstname</li>
-<li>Label: Firstname</li>
-</ul>
-</li>
-<li><em>FormElement</em>: email, text, 20<ul>
-<li>Class: <strong>native</strong></li>
-<li>Type: <strong>text</strong></li>
-<li>Name: note</li>
-<li>Label: Note</li>
-<li>Value: <cite>{{SELECT Note FROM Note AS n, Person AS p WHERE p.id={{r}} AND p.noteId=n.id ORDER BY id }}</cite></li>
-</ul>
-</li>
-<li><em>FormElement</em>: insert/update address record<ul>
-<li>Class: <strong>action</strong></li>
-<li>Type: <strong>afterSave</strong></li>
-<li>Name: noteId</li>
-<li>Label: Manage Note</li>
-<li>Parameter:<ul>
-<li><cite>sqlInsert={{INSERT INTO Note (note) VALUES (&#8216;{{note:F:allbut:s}}&#8217;) }}</cite></li>
-<li><cite>sqlUpdate={{UPDATE Note SET note=&#8217;{{note:F:allbut:s}}&#8217; WHERE id={{slaveId:V}} }}</cite></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="icons-template-group">
-<span id="example-class-template-group"></span><h3>Icons Template Group<a class="headerlink" href="#icons-template-group" title="Permalink to this headline">¶</a></h3>
-<p>This example will display grafics instead of text &#8216;add&#8217; and &#8216;remove&#8217;. Also there is a distance between the templateGroups.</p>
-<blockquote>
-<div><ul>
-<li><p class="first">FormElement.parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">tgClass</span> <span class="o">=</span> <span class="nx">qfq</span><span class="o">-</span><span class="nx">child</span><span class="o">-</span><span class="nx">margin</span><span class="o">-</span><span class="nx">top</span>
-<span class="nx">tgAddClass</span> <span class="o">=</span> <span class="nx">btn</span> <span class="nx">alert</span><span class="o">-</span><span class="nx">success</span>
-<span class="nx">tgAddText</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">span</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;glyphicon glyphicon-plus&quot;</span> <span class="nx">aria</span><span class="o">-</span><span class="nx">hidden</span><span class="o">=</span><span class="s2">&quot;true&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">span</span><span class="o">&gt;</span>
-<span class="nx">tgRemoveClass</span> <span class="o">=</span> <span class="nx">btn</span> <span class="nx">btn</span><span class="o">-</span><span class="nx">danger</span> <span class="nx">alert</span><span class="o">-</span><span class="nx">danger</span>
-<span class="nx">tgRemoveText</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">span</span> <span class="nx">class</span><span class="o">=</span><span class="s2">&quot;glyphicon glyphicon-remove&quot;</span> <span class="nx">aria</span><span class="o">-</span><span class="nx">hidden</span><span class="o">=</span><span class="s2">&quot;true&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">span</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="chart">
-<h3>Chart<a class="headerlink" href="#chart" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>QFQ delivers a chart JavaScript lib: <a class="reference external" href="https://github.com/nnnick/Chart.js.git">https://github.com/nnnick/Chart.js.git</a>. Docs: <a class="reference external" href="http://www.chartjs.org/docs/">http://www.chartjs.org/docs/</a></li>
-<li>The library is not sourced in the HTML page automatically. To do it, either include the lib
-<cite>typo3conf/ext/qfq/Resources/Public/JavaScript/Chart.min.js</cite>:<ul>
-<li>in the specific tt_content record (shown below in the example) or</li>
-<li>system wide via Typo3 Template record.</li>
-</ul>
-</li>
-<li>By splitting HTML and JavaScript code over several lines, take care not accidently to create a &#8216;nesting&#8217;-end token.
-Check the line after <cite>10.tail =</cite>. It&#8217;s &#8216;}&#8217; alone on one line. This is a valid &#8216;nesting&#8217;-end token!. There are two options
-to circumvent this:<ul>
-<li>Don&#8217;t nest the HTML &amp; JavaScript code - bad workaround, this is not human readable.</li>
-<li>Select different nesting token, e.g. &#8216;&lt;&#8217; / &#8216;&gt;&#8217; (check the first line on the following example).</li>
-</ul>
-</li>
-</ul>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># &lt;</span>
-
-<span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s1">&#39;_&#39;</span>
-<span class="mf">10.</span><span class="nx">head</span> <span class="o">=</span>
-  <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">style</span><span class="o">=</span><span class="s2">&quot;height: 1024px; width: 640px;&quot;</span><span class="o">&gt;</span>
-    <span class="o">&lt;</span><span class="nx">h3</span><span class="o">&gt;</span><span class="nx">Distribution</span> <span class="nx">of</span> <span class="nx">FormElement</span> <span class="nx">types</span> <span class="nx">over</span> <span class="nx">all</span> <span class="nx">forms</span><span class="o">&lt;/</span><span class="nx">h3</span><span class="o">&gt;</span>
-    <span class="o">&lt;</span><span class="nx">canvas</span> <span class="nx">id</span><span class="o">=</span><span class="s2">&quot;barchart&quot;</span> <span class="nx">width</span><span class="o">=</span><span class="s2">&quot;1240&quot;</span> <span class="nx">height</span><span class="o">=</span><span class="s2">&quot;640&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">canvas</span><span class="o">&gt;</span>
-  <span class="o">&lt;/</span><span class="nx">div</span><span class="o">&gt;</span>
-  <span class="o">&lt;</span><span class="nx">script</span> <span class="nx">src</span><span class="o">=</span><span class="s2">&quot;typo3conf/ext/qfq/Resources/Public/JavaScript/Chart.min.js&quot;</span><span class="o">&gt;&lt;/</span><span class="nx">script</span><span class="o">&gt;</span>
-  <span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span>
-    <span class="err">$</span><span class="p">(</span><span class="k">function</span> <span class="p">()</span> <span class="p">{</span>
-      <span class="k">var</span> <span class="nx">ctx</span> <span class="o">=</span> <span class="nx">document</span><span class="o">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;barchart&quot;</span><span class="p">);</span>
-      <span class="k">var</span> <span class="nx">barChart</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Chart</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="p">{</span>
-        <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span>
-          <span class="nx">data</span><span class="o">:</span> <span class="p">{</span>
-
-<span class="mf">10.</span><span class="nx">tail</span> <span class="o">=</span>
-          <span class="p">}</span>
-      <span class="p">});</span>
-    <span class="p">});</span>
-  <span class="o">&lt;/</span><span class="nx">script</span><span class="o">&gt;</span>
-
-<span class="c1"># Labels</span>
-<span class="mf">10.10</span> <span class="o">&lt;</span>
-  <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">,</span> <span class="nx">fe</span><span class="o">.</span><span class="nx">type</span><span class="p">,</span> <span class="s2">&quot;&#39;&quot;</span> <span class="nx">FROM</span> <span class="nx">FormElement</span> <span class="k">AS</span> <span class="nx">fe</span> <span class="nx">GROUP</span> <span class="nx">BY</span> <span class="nx">fe</span><span class="o">.</span><span class="nx">type</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">fe</span><span class="o">.</span><span class="nx">type</span>
-  <span class="nx">head</span> <span class="o">=</span> <span class="nx">labels</span><span class="o">:</span> <span class="p">[</span>
-  <span class="nx">tail</span> <span class="o">=</span> <span class="p">],</span>
-  <span class="nx">rsep</span> <span class="o">=</span> <span class="p">,</span>
-<span class="o">&gt;</span>
-
-<span class="c1"># Data</span>
-<span class="mf">10.20</span> <span class="o">&lt;</span>
-  <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">COUNT</span><span class="p">(</span><span class="nx">fe</span><span class="o">.</span><span class="nx">id</span><span class="p">)</span> <span class="nx">FROM</span> <span class="nx">FormElement</span> <span class="k">AS</span> <span class="nx">fe</span> <span class="nx">GROUP</span> <span class="nx">BY</span> <span class="nx">fe</span><span class="o">.</span><span class="nx">type</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">fe</span><span class="o">.</span><span class="nx">type</span>
-  <span class="nx">head</span> <span class="o">=</span> <span class="nx">datasets</span><span class="o">:</span> <span class="p">[</span> <span class="p">{</span>   <span class="nx">data</span><span class="o">:</span> <span class="p">[</span>
-  <span class="nx">tail</span> <span class="o">=</span> <span class="p">],</span>  <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;steelblue&quot;</span><span class="p">,</span> <span class="nx">label</span><span class="o">:</span> <span class="s2">&quot;FormElements&quot;</span> <span class="p">}</span> <span class="p">]</span>
-  <span class="nx">rsep</span> <span class="o">=</span> <span class="p">,</span>
-<span class="o">&gt;</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="upload-form-simple">
-<h3>Upload Form Simple<a class="headerlink" href="#upload-form-simple" title="Permalink to this headline">¶</a></h3>
-<p>Table Person</p>
-<table border="1" class="docutils">
-<colgroup>
-<col width="60%" />
-<col width="40%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Type</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>id</td>
-<td>int</td>
-</tr>
-<tr class="row-odd"><td>name</td>
-<td>varchar(255)</td>
-</tr>
-<tr class="row-even"><td>pathFileNamePicture</td>
-<td>varchar(255)</td>
-</tr>
-<tr class="row-odd"><td>pathFileNameAvatar</td>
-<td>varchar(255)</td>
-</tr>
-</tbody>
-</table>
-<ul>
-<li><p class="first">Form:</p>
-<ul class="simple">
-<li>Name: UploadSimple</li>
-<li>Table: Person</li>
-</ul>
-</li>
-<li><p class="first">FormElements:</p>
-<ul>
-<li><p class="first">Name: name</p>
-<ul class="simple">
-<li>Type: text</li>
-<li>Label: Name</li>
-</ul>
-</li>
-<li><p class="first">Name: pathFileNamePicture</p>
-<ul>
-<li><p class="first">Type: upload</p>
-</li>
-<li><p class="first">Label: Picture</p>
-</li>
-<li><p class="first">Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">fileDestination</span><span class="o">=</span><span class="nx">fileadmin</span><span class="o">/</span><span class="nx">user</span><span class="o">/</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span><span class="o">-</span><span class="nx">picture</span><span class="o">-</span><span class="p">{{</span><span class="nx">filename</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-<li><p class="first">Name: pathFileNameAvatar</p>
-<ul>
-<li><p class="first">Type: upload</p>
-</li>
-<li><p class="first">Label: Avatar</p>
-</li>
-<li><p class="first">Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">fileDestination</span><span class="o">=</span><span class="nx">fileadmin</span><span class="o">/</span><span class="nx">user</span><span class="o">/</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span><span class="o">-</span><span class="nx">avatar</span><span class="o">-</span><span class="p">{{</span><span class="nx">filename</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="upload-form-advanced-1">
-<h3>Upload Form Advanced 1<a class="headerlink" href="#upload-form-advanced-1" title="Permalink to this headline">¶</a></h3>
-<p>Table: Person</p>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="60%" />
-<col width="40%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Type</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>id</td>
-<td>int</td>
-</tr>
-<tr class="row-odd"><td>name</td>
-<td>varchar(255)</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-<p>Table: Note</p>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="60%" />
-<col width="40%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Type</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>id</td>
-<td>int</td>
-</tr>
-<tr class="row-odd"><td>pId</td>
-<td>int</td>
-</tr>
-<tr class="row-even"><td>type</td>
-<td>varchar(255)</td>
-</tr>
-<tr class="row-odd"><td>pathFileName</td>
-<td>varchar(255)</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-<ul>
-<li><p class="first">Form:</p>
-<ul class="simple">
-<li>Name: UploadAdvanced1</li>
-<li>Table: Person</li>
-</ul>
-</li>
-<li><p class="first">FormElements</p>
-<ul>
-<li><p class="first">Name: name</p>
-<ul class="simple">
-<li>Type: text</li>
-<li>Label: Name</li>
-</ul>
-</li>
-<li><p class="first">Name: mypathFileNamePicture</p>
-<ul>
-<li><p class="first">Type: upload</p>
-</li>
-<li><p class="first">Label: Picture</p>
-</li>
-<li><p class="first">Value: {{SELECT pathFileName FROM Note WHERE id={{slaveId}} }}</p>
-</li>
-<li><p class="first">Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">fileDestination</span><span class="o">=</span><span class="nx">fileadmin</span><span class="o">/</span><span class="nx">user</span><span class="o">/</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span><span class="o">-</span><span class="nx">picture</span><span class="o">-</span><span class="p">{{</span><span class="nx">filename</span><span class="p">}}</span>
-<span class="nx">slaveId</span><span class="o">=</span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">pId</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span> <span class="k">AND</span> <span class="nx">type</span><span class="o">=</span><span class="s1">&#39;picture&#39;</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlInsert</span><span class="o">=</span><span class="p">{{</span><span class="nx">INSERT</span> <span class="nx">INTO</span> <span class="nx">Note</span> <span class="p">(</span><span class="nx">pathFileName</span><span class="p">,</span> <span class="nx">type</span><span class="p">,</span> <span class="nx">pId</span><span class="p">)</span> <span class="nx">VALUE</span> <span class="p">(</span><span class="s1">&#39;{{fileDestination}}&#39;</span><span class="p">,</span> <span class="s1">&#39;picture&#39;</span><span class="p">,</span> <span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}})</span> <span class="p">}}</span>
-<span class="nx">sqlUpdate</span><span class="o">=</span><span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">Note</span> <span class="nx">SET</span> <span class="nx">pathFileName</span> <span class="o">=</span> <span class="s1">&#39;{{fileDestination}}&#39;</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlDelete</span><span class="o">=</span><span class="p">{{</span><span class="nx">DELETE</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span>  <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-<li><p class="first">Name: mypathFileNameAvatar</p>
-<ul>
-<li><p class="first">Type: upload</p>
-</li>
-<li><p class="first">Label: Avatar</p>
-</li>
-<li><p class="first">Value: {{SELECT pathFileName FROM Note WHERE id={{slaveId}} }}</p>
-</li>
-<li><p class="first">Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">fileDestination</span><span class="o">=</span><span class="nx">fileadmin</span><span class="o">/</span><span class="nx">user</span><span class="o">/</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span><span class="o">-</span><span class="nx">avatar</span><span class="o">-</span><span class="p">{{</span><span class="nx">filename</span><span class="p">}}</span>
-<span class="nx">slaveId</span><span class="o">=</span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">pId</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span> <span class="k">AND</span> <span class="nx">type</span><span class="o">=</span><span class="s1">&#39;avatar&#39;</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlInsert</span><span class="o">=</span><span class="p">{{</span><span class="nx">INSERT</span> <span class="nx">INTO</span> <span class="nx">Note</span> <span class="p">(</span><span class="nx">pathFileName</span><span class="p">,</span> <span class="nx">type</span><span class="p">,</span> <span class="nx">pId</span><span class="p">)</span> <span class="nx">VALUE</span> <span class="p">(</span><span class="s1">&#39;{{fileDestination}}&#39;</span><span class="p">,</span> <span class="s1">&#39;avatar&#39;</span><span class="p">,</span> <span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}})</span> <span class="p">}}</span>
-<span class="nx">sqlUpdate</span><span class="o">=</span><span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">Note</span> <span class="nx">SET</span> <span class="nx">pathFileName</span> <span class="o">=</span> <span class="s1">&#39;{{fileDestination}}&#39;</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlDelete</span><span class="o">=</span><span class="p">{{</span><span class="nx">DELETE</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span>  <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="upload-form-advanced-2">
-<h3>Upload Form Advanced 2<a class="headerlink" href="#upload-form-advanced-2" title="Permalink to this headline">¶</a></h3>
-<p>Table: Person</p>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="60%" />
-<col width="40%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Type</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>id</td>
-<td>int</td>
-</tr>
-<tr class="row-odd"><td>name</td>
-<td>varchar(255)</td>
-</tr>
-<tr class="row-even"><td>noteIdPicture</td>
-<td>int</td>
-</tr>
-<tr class="row-odd"><td>noteIdAvatar</td>
-<td>int</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-<p>Table: Note</p>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="60%" />
-<col width="40%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Type</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>id</td>
-<td>int</td>
-</tr>
-<tr class="row-odd"><td>pathFileName</td>
-<td>varchar(255)</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-<ul>
-<li><p class="first">Form:</p>
-<ul class="simple">
-<li>Name: UploadAdvanced2</li>
-<li>Table: Person</li>
-</ul>
-</li>
-<li><p class="first">FormElements</p>
-<ul>
-<li><p class="first">Name: name</p>
-<ul class="simple">
-<li>Type: text</li>
-<li>Label: Name</li>
-</ul>
-</li>
-<li><p class="first">Name: mypathFileNamePicture</p>
-<ul>
-<li><p class="first">Type: upload</p>
-</li>
-<li><p class="first">Label: Picture</p>
-</li>
-<li><p class="first">Value: {{SELECT pathFileName FROM Note WHERE id={{slaveId}} }}</p>
-</li>
-<li><p class="first">Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">fileDestination</span><span class="o">=</span><span class="nx">fileadmin</span><span class="o">/</span><span class="nx">user</span><span class="o">/</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span><span class="o">-</span><span class="nx">picture</span><span class="o">-</span><span class="p">{{</span><span class="nx">filename</span><span class="p">}}</span>
-<span class="nx">slaveId</span><span class="o">=</span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">noteIdPicture</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlInsert</span><span class="o">=</span><span class="p">{{</span><span class="nx">INSERT</span> <span class="nx">INTO</span> <span class="nx">Note</span> <span class="p">(</span><span class="nx">pathFileName</span><span class="p">)</span> <span class="nx">VALUE</span> <span class="p">(</span><span class="s1">&#39;{{fileDestination}}&#39;</span><span class="p">)</span> <span class="p">}}</span>
-<span class="nx">sqlUpdate</span><span class="o">=</span><span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">Note</span> <span class="nx">SET</span> <span class="nx">pathFileName</span> <span class="o">=</span> <span class="s1">&#39;{{fileDestination}}&#39;</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlDelete</span><span class="o">=</span><span class="p">{{</span><span class="nx">DELETE</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span>  <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlAfter</span><span class="o">=</span><span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">Person</span> <span class="nx">SET</span> <span class="nx">noteIdPicture</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-<li><p class="first">Name: mypathFileNameAvatar</p>
-<ul>
-<li><p class="first">Type: upload</p>
-</li>
-<li><p class="first">Label: Avatar</p>
-</li>
-<li><p class="first">Value: {{SELECT pathFileName FROM Note WHERE id={{slaveId}} }}</p>
-</li>
-<li><p class="first">Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">fileDestination</span><span class="o">=</span><span class="nx">fileadmin</span><span class="o">/</span><span class="nx">user</span><span class="o">/</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span><span class="o">-</span><span class="nx">avatar</span><span class="o">-</span><span class="p">{{</span><span class="nx">filename</span><span class="p">}}</span>
-<span class="nx">slaveId</span><span class="o">=</span><span class="p">{{</span><span class="nx">SELECT</span> <span class="nx">id</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">noteIdAvatar</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlInsert</span><span class="o">=</span><span class="p">{{</span><span class="nx">INSERT</span> <span class="nx">INTO</span> <span class="nx">Note</span> <span class="p">(</span><span class="nx">pathFileName</span><span class="p">)</span> <span class="nx">VALUE</span> <span class="p">(</span><span class="s1">&#39;{{fileDestination}}&#39;</span><span class="p">)</span> <span class="p">}}</span>
-<span class="nx">sqlUpdate</span><span class="o">=</span><span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">Note</span> <span class="nx">SET</span> <span class="nx">pathFileName</span> <span class="o">=</span> <span class="s1">&#39;{{fileDestination}}&#39;</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlDelete</span><span class="o">=</span><span class="p">{{</span><span class="nx">DELETE</span> <span class="nx">FROM</span> <span class="nx">Note</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span>  <span class="nx">LIMIT</span> <span class="mi">1</span><span class="p">}}</span>
-<span class="nx">sqlAfter</span><span class="o">=</span><span class="p">{{</span><span class="nx">UPDATE</span> <span class="nx">Person</span> <span class="nx">SET</span> <span class="nx">noteIdAvatar</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="typeahead-sql">
-<h3>Typeahead: SQL<a class="headerlink" href="#typeahead-sql" title="Permalink to this headline">¶</a></h3>
-<p>Table: Person</p>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="60%" />
-<col width="40%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Type</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>id</td>
-<td>int</td>
-</tr>
-<tr class="row-odd"><td>name</td>
-<td>varchar(255)</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-<ul>
-<li><p class="first">Form:</p>
-<ul class="simple">
-<li>Name: PersonNameTypeahead</li>
-<li>Table: Person</li>
-</ul>
-</li>
-<li><p class="first">FormElements</p>
-<ul>
-<li><p class="first">Name: name</p>
-<ul>
-<li><p class="first">Type: text</p>
-</li>
-<li><p class="first">Label: Name</p>
-</li>
-<li><p class="first">Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">typeAheadSql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">Person</span> <span class="nx">WHERE</span> <span class="nx">name</span> <span class="nx">LIKE</span> <span class="o">?</span> <span class="k">OR</span> <span class="nx">firstName</span> <span class="nx">LIKE</span> <span class="o">?</span> <span class="nx">LIMIT</span> <span class="mi">100</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="typeahead-ldap-with-additional-values">
-<h3>Typeahead: LDAP with additional values<a class="headerlink" href="#typeahead-ldap-with-additional-values" title="Permalink to this headline">¶</a></h3>
-<p>Table: Person</p>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="60%" />
-<col width="40%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Name</th>
-<th class="head">Type</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>id</td>
-<td>int</td>
-</tr>
-<tr class="row-odd"><td>name</td>
-<td>varchar(255)</td>
-</tr>
-<tr class="row-even"><td>firstname</td>
-<td>varchar(255)</td>
-</tr>
-<tr class="row-odd"><td>email</td>
-<td>varchar(255)</td>
-</tr>
-</tbody>
-</table>
-</div></blockquote>
-<ul>
-<li><p class="first">Form:</p>
-<ul>
-<li><p class="first">Name: PersonNameTypeaheadSetNames</p>
-</li>
-<li><p class="first">Table: Person</p>
-</li>
-<li><p class="first">Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">ldapServer</span> <span class="o">=</span> <span class="nx">directory</span><span class="o">.</span><span class="nx">example</span><span class="o">.</span><span class="nx">com</span>
-<span class="nx">ldapBaseDn</span> <span class="o">=</span> <span class="nx">ou</span><span class="o">=</span><span class="nx">Addressbook</span><span class="p">,</span><span class="nx">dc</span><span class="o">=</span><span class="nx">example</span><span class="p">,</span><span class="nx">dc</span><span class="o">=</span><span class="nx">com</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-<li><p class="first">FormElements</p>
-<ul>
-<li><p class="first">Name: email</p>
-<ul>
-<li><p class="first">Class: native</p>
-</li>
-<li><p class="first">Type: text</p>
-</li>
-<li><p class="first">Label: Email</p>
-</li>
-<li><p class="first">Note: Name: {{cn:LE}}&lt;br&gt;Email: {{mail:LE}}</p>
-</li>
-<li><p class="first">dynamicUpdate: checked</p>
-</li>
-<li><p class="first">Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># Typeahead</span>
-<span class="nx">typeAheadLdapSearch</span> <span class="o">=</span> <span class="p">(</span><span class="o">|</span><span class="p">(</span><span class="nx">cn</span><span class="o">=*?*</span><span class="p">)(</span><span class="nb">mail</span><span class="o">=*?*</span><span class="p">))</span>
-<span class="nx">typeAheadLdapValuePrintf</span> <span class="nx">‘</span><span class="o">%</span><span class="nx">s</span> <span class="o">/</span> <span class="o">%</span><span class="nx">s’</span><span class="p">,</span> <span class="nx">cn</span><span class="p">,</span> <span class="nx">email</span>
-<span class="nx">typeAheadLdapIdPrintf</span>    <span class="nx">‘</span><span class="o">%</span><span class="nx">s’</span><span class="p">,</span> <span class="nx">email</span>
-
-<span class="c1"># dynamicUpdate: show note</span>
-<span class="nx">fillStoreLdap</span>
-<span class="nx">ldapSearch</span> <span class="o">=</span> <span class="p">(</span><span class="nb">mail</span><span class="o">=</span><span class="p">{{</span><span class="nx">email</span><span class="o">::</span><span class="na">alnumx</span><span class="p">}})</span>
-<span class="nx">ldapAttributes</span> <span class="o">=</span> <span class="nx">cn</span><span class="p">,</span> <span class="nx">email</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-<li><p class="first">Name: fillLdapValues</p>
-<ul>
-<li><p class="first">Class: action</p>
-</li>
-<li><p class="first">Type: afterSave</p>
-</li>
-<li><p class="first">Parameter:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">fillStoreLdap</span>
-<span class="nx">ldapSearch</span> <span class="o">=</span> <span class="p">(</span><span class="nb">mail</span><span class="o">=</span><span class="p">{{</span><span class="nx">email</span><span class="o">::</span><span class="na">alnumx</span><span class="p">}})</span>
-<span class="nx">ldapAttributes</span> <span class="o">=</span> <span class="nx">cn</span><span class="p">,</span> <span class="nx">email</span>
-
-<span class="nx">slaveId</span><span class="o">=</span><span class="p">{{</span><span class="nx">id</span><span class="o">:</span><span class="nx">R0</span><span class="p">}}</span>
-<span class="nx">sqlUpdate</span><span class="o">=</span><span class="p">{{</span> <span class="nx">UPDATE</span> <span class="nx">Person</span> <span class="k">AS</span> <span class="nx">p</span> <span class="nx">SET</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span><span class="o">=</span><span class="s1">&#39;{{cn:L:alnumx:s}}&#39;</span> <span class="nx">WHERE</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span><span class="o">=</span><span class="p">{{</span><span class="nx">slaveId</span><span class="p">}}</span> <span class="nx">LIMIT</span> <span class="mi">1</span> <span class="p">}}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div class="section" id="faq">
-<h2>FAQ<a class="headerlink" href="#faq" title="Permalink to this headline">¶</a></h2>
-<blockquote>
-<div><ul class="simple">
-<li>Q: A variable {{&lt;var&gt;}} is shown as empty string, but there should be a value.<ul>
-<li>A: The sanitize rule is violeted and therefore the value has been removed. Set {{&lt;var&gt;:&lt;store&gt;:all}} as a test.
-Only STORE_CLIENT and STORE_FORM will be sanitized.</li>
-</ul>
-</li>
-</ul>
-</div></blockquote>
-</div>
-</div>
-<div class="section" id="report">
-<span id="id39"></span><h1>Report<a class="headerlink" href="#report" title="Permalink to this headline">¶</a></h1>
-<p>The QFQ extension is activated through tt-content records. One or more tt-content records per page are necessary to render
-<em>forms</em> and <em>reports</em>.</p>
-<div class="section" id="qfq-content-element">
-<h2>QFQ content element<a class="headerlink" href="#qfq-content-element" title="Permalink to this headline">¶</a></h2>
-<p>QFQ is used by configuring Typo3 content elements. Insert one or more QFQ content elements on a Typo3 page.
-Specify column and language per content record as wished.</p>
-<p>The title of the QFQ content element will not be rendered. It&#8217;s only visible in the backend for orientation.</p>
-</div>
-<div class="section" id="id40">
-<h2>General<a class="headerlink" href="#id40" title="Permalink to this headline">¶</a></h2>
-<p>To display a report on any given TYPO3 page, create a content element of type &#8216;QFQ Element&#8217; (plugin) on that page.</p>
-<div class="section" id="a-simple-example">
-<h3>A simple example<a class="headerlink" href="#a-simple-example" title="Permalink to this headline">¶</a></h3>
-<p>Assume that the database has a table person with columns firstName and lastName. To create a simple list of all persons, we can do the following:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">id</span> <span class="k">AS</span> <span class="nx">pId</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="nx">firstName</span><span class="p">,</span> <span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="nx">lastName</span><span class="p">,</span> <span class="s2">&quot; &quot;</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">person</span>
-</pre></div>
-</div>
-<p>10 Stands for a <em>root level</em> of the report (see section <a class="reference internal" href="#structure">Structure</a>). 10.sql defines a SQL query for this specific level. When the query is executed it will return a result having one single column name containing first and last name
-separated by a space character.</p>
-<p>The HTML output displayed on the page resulting from only this definition could look as follows:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">John</span> <span class="nx">DoeJane</span> <span class="nx">MillerFrank</span> <span class="nx">Star</span>
-</pre></div>
-</div>
-<p>I.e., QFQ will simply output the content of the SQL result row after row for each single level.</p>
-<p>However, we can modify (wrap) the output by setting the values of various keys for each level: 10.rsep=&lt;br/&gt; for example tells QFQ to seperate the rows of the result by a HTML-line break. The final result in this case is:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">id</span> <span class="k">AS</span> <span class="nx">personId</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="nx">firstName</span><span class="p">,</span> <span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="nx">lastName</span><span class="p">,</span> <span class="s2">&quot; &quot;</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">person</span>
-<span class="mf">10.</span><span class="nx">sep</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-<p>HTML output:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">John</span> <span class="nx">Doe</span><span class="o">&lt;</span><span class="nx">br</span><span class="o">&gt;</span><span class="nx">Jane</span> <span class="nx">Miller</span><span class="o">&lt;</span><span class="nx">br</span><span class="o">&gt;</span><span class="nx">Frank</span> <span class="nx">Star</span>
-</pre></div>
-</div>
-</div>
-</div>
-<div class="section" id="syntax-of-report">
-<span id="id41"></span><h2>Syntax of <cite>report</cite><a class="headerlink" href="#syntax-of-report" title="Permalink to this headline">¶</a></h2>
-<blockquote>
-<div><p>All <strong>root level queries</strong> will be fired in the order specified by &#8216;level&#8217; (Integer value).</p>
-<p>For <strong>each</strong> row of a query (this means <em>all</em> queries), all subqueries will be fired once.</p>
-<ul class="simple">
-<li>E.g. if the outer query selects 5 rows, and a nested query always select 3 rows, than the total number of rows are 5 x 3 = 15 rows.</li>
-</ul>
-<p>There is a set of <strong>variables</strong> that will get replaced before the SQL-Query gets executed:</p>
-<blockquote>
-<div><p>Column values of the recent rows: {{&lt;level&gt;.&lt;columnname&gt;}}</p>
-<p>Global variables: {{global.&lt;name&gt;}}</p>
-<p>Variables from specific stores: {{&lt;name&gt;[:&lt;store/s&gt;[:&lt;sanitize class&gt;]]}}</p>
-<p>Current row index: {{&lt;level&gt;.line.count}}</p>
-<p>Total rows (num_rows for SELECT and SHOW, affected_rows for UPDATE and INSERT): {{&lt;level&gt;.line.total}}</p>
-<p>Last insert id for INSERT: {{&lt;level&gt;.line.insertId}}</p>
-<p>See <a class="reference internal" href="#variables"><span class="std std-ref">Databases</span></a> for a full list of all available variables.</p>
-</div></blockquote>
-<p>Be aware that line.count / line.total have to be known before the query is fired. E.g. <cite>10.sql = SELECT {{10.line.count}}, ... WHERE {{10.line.count}} = ...</cite>
-won&#8217;t work as expected. <cite>{{10.line.count}}</cite> can&#8217;t be replaced before the query is fired, but will be replaced during processing the result!</p>
-<p>Different types of SQL queries are possible: SELECT, INSERT, UPDATE, DELETE, SHOW</p>
-<p>Only SELECT and SHOW queries will fire subqueries.</p>
-<ul>
-<li><p class="first">Processing of the resulting rows and columns:</p>
-</li>
-<li><p class="first">In general, all columns of all rows will be printed out sequentially.</p>
-<p>On a per column base, printing of columns can be suppressed. This might be useful to select values which will be
-accessed later on in another query via the {{level.columnname}} variable. To suppress printing of a column, use a
-underscore as column name prefix.</p>
-<p>Reserved column names have a special meaning and will be processed in a special way. See <a class="reference internal" href="#processing-of-columns-in-the-sql-result">Processing of columns in the SQL result</a> for details.</p>
-<p>There are extensive ways to wrap columns and rows automatically. See <a class="reference internal" href="#wrapping-rows-and-columns"><span class="std std-ref">Wrapping rows and columns: Level keys</span></a></p>
-</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="debug-the-bodytext">
-<h2>Debug the bodytext<a class="headerlink" href="#debug-the-bodytext" title="Permalink to this headline">¶</a></h2>
-<p>The parsed bodytext could be displayed by activating &#8216;SHOW_DEBUG_INFO &#8216; (<a class="reference internal" href="#debug"><span class="std std-ref">Debug</span></a>) and specifying</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">debugShowBodyText</span> <span class="o">=</span> <span class="mi">1</span>
-</pre></div>
-</div>
-<p>A small symbol with a tooltip will be shown, where the content record will be displayed on the webpage.
-Note: <a class="reference internal" href="#debug"><span class="std std-ref">Debug</span></a> information will only be shown with <em>SHOW_DEBUG_INFO = yes</em> in config.qfq.ini .</p>
-</div>
-<div class="section" id="structure">
-<h2>Structure<a class="headerlink" href="#structure" title="Permalink to this headline">¶</a></h2>
-<p>A report can be divided into several levels. This can make report definitions more readable because it allows for
-splitting of otherwise excessively long SQL queries. For example, if your SQL query on the root level selects a number
-of person records from your person table, you can use the SQL query on the second level to look up the city where each person lives.</p>
-<p>See the example below:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">id</span> <span class="k">AS</span> <span class="nx">_pId</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="nx">firstName</span><span class="p">,</span> <span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="nx">lastName</span><span class="p">,</span> <span class="s2">&quot; &quot;</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">person</span>
-<span class="mf">10.</span><span class="nx">rsep</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-
-<span class="mf">10.10</span><span class="o">.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="nx">postal_code</span><span class="p">,</span> <span class="s2">&quot; &quot;</span><span class="p">,</span> <span class="nx">city</span><span class="p">)</span> <span class="nx">FROM</span> <span class="nx">address</span> <span class="nx">WHERE</span> <span class="nx">pId</span> <span class="o">=</span> <span class="p">{{</span><span class="mf">10.</span><span class="nx">pId</span><span class="p">}}</span>
-<span class="mf">10.10</span><span class="o">.</span><span class="nx">rbeg</span> <span class="o">=</span> <span class="p">(</span>
-<span class="mf">10.10</span><span class="o">.</span><span class="nx">rend</span> <span class="o">=</span> <span class="p">)</span>
-</pre></div>
-</div>
-<p>This would result in</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">John</span> <span class="nx">Doe</span> <span class="p">(</span><span class="mi">3004</span> <span class="nx">Bern</span><span class="p">)</span>
-<span class="nx">Jane</span> <span class="nx">Miller</span> <span class="p">(</span><span class="mi">8008</span> <span class="nx">Zürich</span><span class="p">)</span>
-<span class="nx">Frank</span> <span class="nx">Star</span> <span class="p">(</span><span class="mi">3012</span> <span class="nx">Bern</span><span class="p">)</span>
-</pre></div>
-</div>
-<div class="section" id="text-across-several-lines">
-<h3>Text across several lines<a class="headerlink" href="#text-across-several-lines" title="Permalink to this headline">¶</a></h3>
-<p>To make SQL queries, or QFQ records in general, more readable, it&#8217;s possible to split a line across several lines. Lines
-with keywords are on their own (<a class="reference internal" href="#qfq-keywords-bodytext">QFQ Keywords (Bodytext)</a> start a new line). If a line is not a &#8216;keyword&#8217; line, it will
-be appended to the last keyword line. &#8216;Keyword&#8217; lines are detected on:</p>
-<blockquote>
-<div><ul class="simple">
-<li>&lt;level&gt;.&lt;keyword&gt; =</li>
-<li>{</li>
-<li>&lt;level&gt;[.&lt;level] {</li>
-</ul>
-</div></blockquote>
-<p>Example:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s1">&#39;hello world&#39;</span>
-         <span class="nx">FROM</span> <span class="nx">mastertable</span>
-<span class="mf">10.</span><span class="nx">tail</span> <span class="o">=</span> <span class="nx">End</span>
-
-<span class="mf">20.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s1">&#39;a warm welcome&#39;</span>
-           <span class="s1">&#39;some additional&#39;</span><span class="p">,</span> <span class="s1">&#39;columns&#39;</span>
-           <span class="nx">FROM</span> <span class="nx">smartTable</span>
-           <span class="nx">WHERE</span> <span class="nx">id</span><span class="o">&gt;</span><span class="mi">100</span>
-
-<span class="mf">20.</span><span class="nx">head</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">h3</span><span class="o">&gt;</span>
-<span class="mf">20.</span><span class="nx">tail</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">h3</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="nesting-of-levels">
-<h3>Nesting of levels<a class="headerlink" href="#nesting-of-levels" title="Permalink to this headline">¶</a></h3>
-<p>Levels can be nested. E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mi">10</span> <span class="p">{</span>
-  <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="o">...</span>
-  <span class="mi">5</span> <span class="p">{</span>
-      <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="o">...</span>
-      <span class="nx">head</span> <span class="o">=</span> <span class="o">...</span>
-  <span class="p">}</span>
-<span class="p">}</span>
-</pre></div>
-</div>
-<p>This is equal to:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="o">...</span>
-<span class="mf">10.5</span><span class="o">.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="o">...</span>
-<span class="mf">10.5</span><span class="o">.</span><span class="nx">head</span> <span class="o">=</span> <span class="o">...</span>
-</pre></div>
-</div>
-<p>By default, curly braces &#8216;{}&#8217; are used for nesting. Alternatively angle braces &#8216;&lt;&gt;&#8217;, round braces &#8216;()&#8217; or square
-braces &#8216;[]&#8217; are also possible. To define the braces to use, the <strong>first line</strong> of the bodytext has to be a comment line and the
-last character of that line must be one of &#8216;{}[]()&lt;&gt;&#8217;. The corresponding braces are used for that QFQ record. E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># Specific code. &gt;</span>
-<span class="mi">10</span> <span class="o">&lt;</span>
-  <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span>
-  <span class="nx">head</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span>
-         <span class="nx">data</span> <span class="o">=</span> <span class="p">[</span>
-           <span class="p">{</span>
-             <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span>
-           <span class="p">}</span>
-         <span class="p">]</span>
-         <span class="o">&lt;/</span><span class="nx">script</span><span class="o">&gt;</span>
-<span class="o">&gt;</span>
-</pre></div>
-</div>
-<p>Per QFQ tt-content record, only one type of nesting braces can be used.</p>
-<p>Be careful to:</p>
-<ul>
-<li><p class="first">write nothing else than whitespaces/newline behind an <strong>open brace</strong></p>
-</li>
-<li><p class="first">the <strong>closing brace</strong> has to be alone on a line.</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s1">&#39;Yearly Report&#39;</span>
-
-<span class="mi">20</span> <span class="p">{</span>
-      <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">companyName</span> <span class="nx">FORM</span> <span class="nx">Company</span> <span class="nx">LIMIT</span> <span class="mi">1</span>
-      <span class="nx">head</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">h1</span><span class="o">&gt;</span>
-      <span class="nx">tail</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">h1</span><span class="o">&gt;</span>
-<span class="p">}</span>
-
-<span class="mi">30</span> <span class="p">{</span>
-      <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">depName</span> <span class="nx">FROM</span> <span class="nx">Department</span>
-      <span class="nx">head</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;</span>
-      <span class="nx">tail</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">p</span><span class="o">&gt;</span>
-      <span class="mi">5</span> <span class="p">{</span>
-            <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s1">&#39;detailed information for department&#39;</span>
-            <span class="mf">1.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">Person</span> <span class="nx">LIMIT</span> <span class="mi">7</span>
-            <span class="mf">1.</span><span class="nx">head</span> <span class="o">=</span> <span class="nx">Employees</span><span class="o">:</span>
-      <span class="p">}</span>
-<span class="p">}</span>
-
-<span class="mf">30.5</span><span class="o">.</span><span class="nx">tail</span> <span class="o">=</span> <span class="nx">More</span> <span class="nx">will</span> <span class="nx">follow</span>
-
-<span class="mi">50</span>
-
-<span class="p">{</span>
-       <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s1">&#39;A query with braces on their own&#39;</span>
-<span class="p">}</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</div>
-<div class="section" id="access-column-values">
-<span id="id42"></span><h3>Access column values<a class="headerlink" href="#access-column-values" title="Permalink to this headline">¶</a></h3>
-<p>Columns of the upper / outer level result can be accessed via variables, eg. {{10.pId}} will be replaced by the value in the pId column.</p>
-<table border="1" class="docutils">
-<colgroup>
-<col width="10%" />
-<col width="90%" />
-</colgroup>
-<tbody valign="top">
-<tr class="row-odd"><td>Levels</td>
-<td>A report is divided into levels. The Example has levels <em>10</em>, <em>20</em>, <em>30</em>, <em>30.5</em>, <em>30.5.1</em>, <em>50</em></td>
-</tr>
-<tr class="row-even"><td>Qualifier</td>
-<td>A level is divided into qualifiers <em>30.5.1</em> has 3 qualifiers <em>30</em>, <em>5</em>, <em>1</em></td>
-</tr>
-<tr class="row-odd"><td>Root levels</td>
-<td>Is a level with one qualifier. E.g.: 10</td>
-</tr>
-<tr class="row-even"><td>Sub levels</td>
-<td>Is a level with more than one qualifier. E.g. levels <em>30.5</em> or <em>30.5.1</em></td>
-</tr>
-<tr class="row-odd"><td>Child</td>
-<td>The level <em>30</em> has one child and child child: <em>30.5</em> and <em>30.5.1</em></td>
-</tr>
-<tr class="row-even"><td>Example</td>
-<td><em>10</em>, <em>20</em>, <em>30</em>, <em>50*</em> are root level and will be completely processed one after each other.
-<em>30.5</em> will be executed as many times as <em>30</em> has row numbers.
-<em>30.5.1</em>  will be executed as many times as <em>30.5</em> has row numbers.</td>
-</tr>
-</tbody>
-</table>
-<p>Report Example 1:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># Displays current date</span>
-<span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">CURDATE</span><span class="p">()</span>
-
-<span class="c1"># Show all students from the person table</span>
-<span class="mf">20.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span> <span class="k">AS</span> <span class="nx">pId</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">firstName</span><span class="p">,</span> <span class="s2">&quot; - &quot;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">lastName</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="k">AS</span> <span class="nx">p</span> <span class="nx">WHERE</span> <span class="nx">p</span><span class="o">.</span><span class="nx">typ</span> <span class="nx">LIKE</span> <span class="s2">&quot;student&quot;</span>
-
-<span class="c1"># Show all the marks from the current student ordered chronological</span>
-<span class="mf">20.25</span><span class="o">.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">e</span><span class="o">.</span><span class="nx">mark</span> <span class="nx">FROM</span> <span class="nx">exam</span> <span class="k">AS</span> <span class="nx">e</span> <span class="nx">WHERE</span> <span class="nx">e</span><span class="o">.</span><span class="nx">pId</span><span class="o">=</span><span class="p">{{</span><span class="mf">20.</span><span class="nx">pId</span><span class="p">}}</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nx">e</span><span class="o">.</span><span class="nb">date</span>
-
-<span class="c1"># This query will never be fired, cause there is no direct parent called 20.30.</span>
-<span class="mf">20.30</span><span class="o">.</span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s1">&#39;never fired&#39;</span>
-</pre></div>
-</div>
-</div>
-</div>
-<div class="section" id="wrapping-rows-and-columns-level-keys">
-<span id="wrapping-rows-and-columns"></span><h2>Wrapping rows and columns: Level keys<a class="headerlink" href="#wrapping-rows-and-columns-level-keys" title="Permalink to this headline">¶</a></h2>
-<p>Order and nesting of queries, will be defined with a typoscript-like syntax: level.sublevel1.subsublevel2. ...
-Each &#8216;level&#8217; directive needs a final key, e.g: 20.30.10. <strong>sql</strong>. A key <strong>sql</strong> is necessary in order to process a level.
-All <a class="reference internal" href="#qfq-keywords-bodytext">QFQ Keywords (Bodytext)</a>.</p>
-</div>
-<div class="section" id="processing-of-columns-in-the-sql-result">
-<h2>Processing of columns in the SQL result<a class="headerlink" href="#processing-of-columns-in-the-sql-result" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>The content of all columns of all rows will be printed sequentially, without separator.</li>
-<li>Rows with <a class="reference internal" href="#special-column-names">Special column names</a>  will be processed in a special way.</li>
-</ul>
-</div>
-<div class="section" id="special-column-names">
-<h2>Special column names<a class="headerlink" href="#special-column-names" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>Special column names always start with &#8216;_&#8217;.</li>
-<li>Column names, which start with a &#8216;_&#8217; and which are not reserved (=special column name), will not be printed. Nevertheless,
-access to it via the {{&lt;level&gt;.&lt;column&gt;}} variable (without &#8216;_&#8217;) are possible.</li>
-<li>The input parameters for the processing function are stored as column values.</li>
-<li>Single parameters are delimited by the &#8216;|&#8217; character.</li>
-<li>Parameters are identified by the function either<ul>
-<li>by their <strong>order</strong></li>
-<li>or by a <strong>one character qualifier</strong> followed by the &#8216;:&#8217; character, placed in front of the actual parameter value.</li>
-</ul>
-</li>
-</ul>
-<table border="1" class="docutils">
-<colgroup>
-<col width="11%" />
-<col width="89%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Reserved column name</th>
-<th class="head">Purpose</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>_link</td>
-<td>Easily create links with different features.</td>
-</tr>
-<tr class="row-odd"><td>_mailto</td>
-<td>Quickly create email links. A click on the link will open the default mailer. The address is encrypted via JS against email bots.</td>
-</tr>
-<tr class="row-even"><td>_pageX or _PageX</td>
-<td>Shortcut version of the link interface for fast creation of internal links. The column name is composed of the string <em>page</em>/<em>Page</em> and a optional character to specify the type of the link.</td>
-</tr>
-<tr class="row-odd"><td>_pdf, _file, _zip
-_Pdf, _File, _Zip</td>
-<td>Shortcut version of the link interface for fast creation of <a class="reference internal" href="#download">download</a> links. Used to offer single file download or to concatenate several PDFs and printout of websites to one PDF file.</td>
-</tr>
-<tr class="row-even"><td>_sendmail</td>
-<td>Send emails.</td>
-</tr>
-<tr class="row-odd"><td>_exec</td>
-<td>Run batch files or executables on the webserver.</td>
-</tr>
-<tr class="row-even"><td>_vertical</td>
-<td>Render Text vertically. This is useful for tables with limited column width.</td>
-</tr>
-<tr class="row-odd"><td>_img</td>
-<td>Display images.</td>
-</tr>
-<tr class="row-even"><td>_bullet</td>
-<td>Display a blue/gray/green/pink/red/yellow bullet. If none color specified, show nothing.</td>
-</tr>
-<tr class="row-odd"><td>_check</td>
-<td>Display a blue/gray/green/pink/red/yellow checked sign. If none color specified, show nothing.</td>
-</tr>
-<tr class="row-even"><td>_nl2br</td>
-<td>All newline characters will be converted to <cite>&lt;br&gt;</cite>.</td>
-</tr>
-<tr class="row-odd"><td>_striptags</td>
-<td>HTML Tags will be stripped.</td>
-</tr>
-<tr class="row-even"><td>_htmlentities</td>
-<td>Characters will be encoded to their HTML entity representation.</td>
-</tr>
-<tr class="row-odd"><td>_+???</td>
-<td>The content will be wrapped in the tag &#8216;???&#8217;. Example: SELECT &#8216;example&#8217; AS &#8216;_+a href=&#8221;<a class="reference external" href="http://example.com">http://example.com</a>&#8220;&#8217; creates &#8216;&lt;a href=&#8221;<a class="reference external" href="http://example.com">http://example.com</a>&#8220;&gt;example&lt;/a&gt;&#8217;</td>
-</tr>
-<tr class="row-even"><td>_&lt;nonReservedName&gt;</td>
-<td>Suppress output. Column names with leading underscore are used to select data from the database and make it available in other parts of the report without generating any output.</td>
-</tr>
-</tbody>
-</table>
-<div class="section" id="column-link">
-<span id="id43"></span><h3>Column: _link<a class="headerlink" href="#column-link" title="Permalink to this headline">¶</a></h3>
-<p>{{url | display | <strong>i (internal)</strong>, e(external) | <strong>- (same)</strong>,n (new), p (parent), t(top) | <strong>-</strong>, (e(edit), c(copy), n(new), d(delete), i(insert) , f(file)) }}</p>
-<ul class="simple">
-<li>Most URLs will be rendered via class link.</li>
-<li>Column names like <cite>_pagee</cite>, <cite>_mailto</cite>, ... are wrapper to class link.</li>
-<li>The parameters for link contains a prefix to make them position-independet.</li>
-</ul>
-<table border="1" class="docutils">
-<colgroup>
-<col width="1%" />
-<col width="1%" />
-<col width="6%" />
-<col width="16%" />
-<col width="12%" />
-<col width="62%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">URL</th>
-<th class="head">IMG</th>
-<th class="head">Meaning</th>
-<th class="head">Qualifier</th>
-<th class="head">Example</th>
-<th class="head">Description</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>x</td>
-<td>&#160;</td>
-<td>URL</td>
-<td>u:&lt;url&gt;</td>
-<td>u:http://www.example.com</td>
-<td>If an image is specified, it will be rendered inside the link, default link class: external</td>
-</tr>
-<tr class="row-odd"><td>x</td>
-<td>&#160;</td>
-<td>Mail</td>
-<td>m:&lt;email&gt;</td>
-<td>m:info&#64;example.com</td>
-<td>Default link class: email</td>
-</tr>
-<tr class="row-even"><td>x</td>
-<td>&#160;</td>
-<td>Page</td>
-<td>p:&lt;pageId&gt;</td>
-<td>p:impressum</td>
-<td>Prepend &#8216;?&#8217; or &#8216;?id=&#8217;, no hostname qualifier (automatically set by browser), default link class: internal, default value: {{pageId}}</td>
-</tr>
-<tr class="row-odd"><td>x</td>
-<td>&#160;</td>
-<td>Download</td>
-<td>d:[&lt;exportFilename&gt;]</td>
-<td>d:complete.pdf</td>
-<td>Link points to <cite>api/download.php</cite>. Additonal parameter are encoded into a SIP. &#8216;Download&#8217; needs an enabled SIP.  See <a class="reference internal" href="#download">download</a>.</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>&#160;</td>
-<td>Text</td>
-<td>t:&lt;text&gt;</td>
-<td>t:Firstname Lastname</td>
-<td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>&#160;</td>
-<td>Render</td>
-<td>r:&lt;mode&gt;</td>
-<td>r:[0-5]</td>
-<td>See: <a class="reference internal" href="#render-mode">render-mode</a>, Default: 0</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>&#160;</td>
-<td>Button</td>
-<td>b[:0|1|&lt;btn class&gt;]</td>
-<td>b:0, b:1, b:success</td>
-<td>&#8216;b&#8217;, &#8216;b:1&#8217;: a bootstrap button is created. &#8216;b:0&#8217; disable the button. &lt;btn class&gt;: default, primary, success, info, warning,danger</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>x</td>
-<td>Picture</td>
-<td>P:&lt;filename&gt;</td>
-<td>P:bullet-red.gif</td>
-<td>Picture &#8216;&lt;img src=&#8221;bullet-red.gif&#8221;alt=&#8221;....&#8221;&gt;&#8217;, default link class: internal.</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>x</td>
-<td>Edit</td>
-<td>E</td>
-<td>E</td>
-<td>Show &#8216;edit&#8217; icon as image</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>x</td>
-<td>New</td>
-<td>N</td>
-<td>N</td>
-<td>Show &#8216;new&#8217; icon as image</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>x</td>
-<td>Delete</td>
-<td>D</td>
-<td>D</td>
-<td>Show &#8216;delete&#8217; icon as image (only the icon, no database record &#8216;delete&#8217; functionality)</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>x</td>
-<td>Help</td>
-<td>H</td>
-<td>H</td>
-<td>Show &#8216;help&#8217; icon as image</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>x</td>
-<td>Info</td>
-<td>I</td>
-<td>I</td>
-<td>Show &#8216;information&#8217; icon as image</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>x</td>
-<td>Show</td>
-<td>S</td>
-<td>S</td>
-<td>Show &#8216;show&#8217; icon as image</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>x</td>
-<td>Glyph</td>
-<td>G:&lt;glyphname&gt;</td>
-<td>G:glyphicon-envelope</td>
-<td>Show &lt;glyphname&gt;. Check: <a class="reference external" href="http://getbootstrap.com/components/">http://getbootstrap.com/components/</a></td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>x</td>
-<td>Bullet</td>
-<td>B:[&lt;color&gt;]</td>
-<td>B:green</td>
-<td>Show bullet with &#8216;&lt;color&gt;&#8217;. Colors: blue, gray, green, pink, red, yellow. Default Color: green.</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>x</td>
-<td>Check</td>
-<td>C:[&lt;color&gt;]</td>
-<td>C:green</td>
-<td>Show checked with &#8216;&lt;color&gt;&#8217;. Colors: blue, gray, green, pink, red, yellow. Default Color: green.</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>&#160;</td>
-<td>URL Params</td>
-<td>U:&lt;key1&gt;=&lt;value1&gt;[&amp;&lt;keyN&gt;=&lt;valueN&gt;]</td>
-<td>U:a=value1&amp;b=value2&amp;c=...</td>
-<td>Any number of additional Params. Links to forms: U:form=Person&amp;r=1234</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>&#160;</td>
-<td>Tooltip</td>
-<td>o:&lt;text&gt;</td>
-<td>o:More information here</td>
-<td>Tooltip text</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>&#160;</td>
-<td>Alttext</td>
-<td>a:&lt;text&gt;</td>
-<td>a:Name of person</td>
-<td><ol class="first last loweralpha simple">
-<li>Alttext for images, b) Message text for <a class="reference internal" href="#download">download</a> popup window.</li>
-</ol>
-</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>&#160;</td>
-<td>Class</td>
-<td>c:[n|i|e|&lt;text&gt;]</td>
-<td>c:i</td>
-<td>CSS class for link. n:no class attribut, i:internal (ext_localconf.php)(default), e:external (ext_localconf.php), &lt;text&gt;: explicit named</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>&#160;</td>
-<td>Target</td>
-<td>g:&lt;text&gt;</td>
-<td>g:_blank</td>
-<td>target=_blank,_self,_parent,&lt;custom&gt;. Default: no target</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>&#160;</td>
-<td>Question</td>
-<td>q:&lt;text&gt;</td>
-<td>q:please confirm</td>
-<td>See: <a class="reference internal" href="#question">question</a>. Link will be executed only if user clicks ok/cancel, default: &#8216;Please confirm&#8217;</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>&#160;</td>
-<td>Encryption</td>
-<td>e:0|1|...</td>
-<td>e:1</td>
-<td>Encryption of the e-mail: 0: no encryption, 1:via Javascript (default)</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>&#160;</td>
-<td>Right</td>
-<td>R</td>
-<td>R</td>
-<td>Defines picture position: Default is &#8216;left&#8217; (no definition) of the &#8216;text&#8217;. &#8216;R&#8217; means &#8216;right&#8217; of the &#8216;text&#8217;</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>&#160;</td>
-<td>SIP</td>
-<td>s[:0|1]</td>
-<td>s, s:0, s:1</td>
-<td>If &#8216;s&#8217; or &#8216;s:1&#8217; a SIP entry is generated with all non Typo 3 Parameters. The URL contains only parameter &#8216;s&#8217; and Typo 3 parameter</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>&#160;</td>
-<td>Mode</td>
-<td>M:file|pdf|zip</td>
-<td>M:file, M:pdf, M:zip</td>
-<td>Mode. Used to specify type of download. One or more element sources needs to be configured. See <a class="reference internal" href="#download">download</a>.</td>
-</tr>
-<tr class="row-odd"><td>&#160;</td>
-<td>&#160;</td>
-<td>File</td>
-<td>f:&lt;filename&gt;</td>
-<td>f:fileadmin/file.pdf</td>
-<td>Element source for download mode file|pdf|zip. See <a class="reference internal" href="#download">download</a>.</td>
-</tr>
-<tr class="row-even"><td>&#160;</td>
-<td>&#160;</td>
-<td>Delete record</td>
-<td>x[:a|r|c]</td>
-<td>x, x:r, x:c</td>
-<td>a: ajax (only QFQ internal used), r: report (default), c: close (current page, open last page)</td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="section" id="render-mode">
-<span id="id44"></span><h3>Render mode<a class="headerlink" href="#render-mode" title="Permalink to this headline">¶</a></h3>
-<table border="1" class="docutils">
-<colgroup>
-<col width="9%" />
-<col width="16%" />
-<col width="15%" />
-<col width="8%" />
-<col width="53%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Mode</th>
-<th class="head">Both: url &amp; text</th>
-<th class="head">Only: url</th>
-<th class="head">Only: text</th>
-<th class="head">Description</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>0 (default)</td>
-<td>&lt;a href=url&gt;text&lt;/a&gt;</td>
-<td>&lt;a href=url&gt;url&lt;/a&gt;</td>
-<td>&#160;</td>
-<td>text or image will be shown, only if there is a url, page or mailto</td>
-</tr>
-<tr class="row-odd"><td>1</td>
-<td>&lt;a href=url&gt;text&lt;/a&gt;</td>
-<td>&lt;a href=url&gt;url&lt;/a&gt;</td>
-<td>text</td>
-<td>Text or image will be shown, independet of there is a url</td>
-</tr>
-<tr class="row-even"><td>2</td>
-<td>&lt;a href=url&gt;text&lt;/a&gt;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>no link if text is empty</td>
-</tr>
-<tr class="row-odd"><td>3</td>
-<td>text</td>
-<td>url</td>
-<td>text</td>
-<td>no link, only text or image</td>
-</tr>
-<tr class="row-even"><td>4</td>
-<td>url</td>
-<td>url</td>
-<td>text</td>
-<td>no link, show text, if text is empty, show url</td>
-</tr>
-<tr class="row-odd"><td>5</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>&#160;</td>
-<td>nothing at all</td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="section" id="link-examples">
-<h3>Link Examples<a class="headerlink" href="#link-examples" title="Permalink to this headline">¶</a></h3>
-<table border="1" class="docutils">
-<colgroup>
-<col width="34%" />
-<col width="66%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">SQL-Query</th>
-<th class="head">Result</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>SELECT &#8220;m:info&#64;example.com&#8221; AS _link</td>
-<td><a class="reference external" href="mailto:info&#37;&#52;&#48;example&#46;com">info<span>&#64;</span>example<span>&#46;</span>com</a> as linked text, encrypted with javascript, class=external</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;m:info&#64;example.com|c:0&#8221; AS _link</td>
-<td><a class="reference external" href="mailto:info&#37;&#52;&#48;example&#46;com">info<span>&#64;</span>example<span>&#46;</span>com</a> as linked text, not encrypted, class=external</td>
-</tr>
-<tr class="row-even"><td>SELECT &#8220;m:info&#64;example.com|P:mail.gif&#8221; AS _link</td>
-<td><a class="reference external" href="mailto:info&#37;&#52;&#48;example&#46;com">info<span>&#64;</span>example<span>&#46;</span>com</a> as linked image mail.gif, encrypted with javascript, class=external</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;m:info&#64;example.com|P:mail.gif|o:Email&#8221; AS _link</td>
-<td><em>info&#64;example.com</em> as linked image mail.gif, encrypted with javascript, class=external, tooltip: &#8220;sendmail&#8221;</td>
-</tr>
-<tr class="row-even"><td>SELECT &#8220;m:info&#64;example.com|t:mailto:info&#64;example.com|o:Email&#8221; AS link</td>
-<td>&#8216;mail to <em>info&#64;example.com</em>&#8216; as linked text, encrypted with javascript, class=external</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;u:www.example.com&#8221; AS _link</td>
-<td>www.example as link, class=external</td>
-</tr>
-<tr class="row-even"><td>SELECT &#8220;u:http://www.example.com&#8221; AS _link</td>
-<td><em>http://www.example</em> as link, class=external</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;u:www.example.com|q:Please confirm&#8221; AS _link</td>
-<td>www.example as link, class=external, See: <a class="reference internal" href="#question">question</a></td>
-</tr>
-<tr class="row-even"><td>SELECT &#8220;u:www.example.com|c:i&#8221; AS _link</td>
-<td><em>http://www.example</em> as link, class=internal</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;u:www.example.com|c:nicelink&#8221; AS _link</td>
-<td><em>http://www.example</em> as link, class=nicelink</td>
-</tr>
-<tr class="row-even"><td>SELECT &#8220;p:form_person|c:e&#8221; AS _link</td>
-<td>&lt;a class=&#8221;external&#8221; href=&#8221;?form_person&#8221;&gt;Text&lt;/a&gt;</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;p:form_person&amp;note=Text|t:Person&#8221; AS _link</td>
-<td>&lt;a class=&#8221;internal&#8221; href=&#8221;?form_person&amp;note=Text&#8221;&gt;Person&lt;/a&gt;</td>
-</tr>
-<tr class="row-even"><td>SELECT &#8220;p:form_person|E&#8221; AS _link</td>
-<td>&lt;a class=&#8221;internal&#8221; href=&#8221;?form_person&#8221;&gt;&lt;img alttext=&#8221;Edit&#8221; src=&#8221;typo3conf/ext/qfq/Resources/Public/icons/edit.gif&#8221;&gt;&lt;/a&gt;</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;p:form_person|E|g:_blank&#8221; AS _link</td>
-<td>&lt;a target=&#8221;_blank&#8221; class=&#8221;internal&#8221; href=&#8221;?form_person&#8221;&gt;&lt;img alttext=&#8221;Edit&#8221; src=&#8221;typo3conf/ext/qfq/Resources/Public/icons/edit.gif&#8221;&gt;&lt;/a&gt;</td>
-</tr>
-<tr class="row-even"><td>SELECT &#8220;p:form_person|C&#8221; AS _link</td>
-<td>&lt;a class=&#8221;internal&#8221; href=&#8221;?form_person&#8221;&gt;&lt;img alttext=&#8221;Check&#8221; src=&#8221;typo3conf/ext/qfq/Resources/Public/icons/checked-green.gif&#8221;&gt;&lt;/a&gt;</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;p:form_person|C:green&#8221; AS _link</td>
-<td>&lt;a class=&#8221;internal&#8221; href=&#8221;?form_person&#8221;&gt;&lt;img alttext=&#8221;Check&#8221; src=&#8221;typo3conf/ext/qfq/Resources/Public/icons/checked-green.gif&#8221;&gt;&lt;/a&gt;</td>
-</tr>
-<tr class="row-even"><td>SELECT &#8220;U:form=Person&amp;r=123|x|D&#8221; as _link</td>
-<td>&lt;a href=&#8221;typo3conf/ext/qfq/qfq/api/delete.php?s=badcaffee1234&#8221;&gt;&lt;span class=&#8221;glyphicon glyphicon-trash&#8221; &gt;&lt;/span&gt;&#8221;&gt;&lt;/a&gt;</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;U:form=Person&amp;r=123|x|t:Delete&#8221; as _link</td>
-<td>&lt;a href=&#8221;typo3conf/ext/qfq/qfq/api/delete.php?s=badcaffee1234&#8221;&gt;Delete&lt;/a&gt;</td>
-</tr>
-<tr class="row-even"><td><dl class="first last docutils">
-<dt>SELECT &#8220;s:1|d:full.pdf|M:pdf|U:id=det1&amp;r=12|U:id=det2|f:cv.pdf|</dt>
-<dd>t:Download|a:Create complete PDF - please wait&#8221; as _link</dd>
-</dl>
-</td>
-<td>&lt;a href=&#8221;typo3conf/ext/qfq/qfq/api/download.php?s=badcaffee1234&#8221;&gt;Download&lt;/a&gt;</td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="section" id="question">
-<span id="id45"></span><h3>Question<a class="headerlink" href="#question" title="Permalink to this headline">¶</a></h3>
-<p><strong>Syntax</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">q</span><span class="p">[</span><span class="o">:&lt;</span><span class="nx">alert</span> <span class="nx">text</span><span class="o">&gt;</span><span class="p">[</span><span class="o">:&lt;</span><span class="nx">level</span><span class="o">&gt;</span><span class="p">[</span><span class="o">:&lt;</span><span class="nx">positive</span> <span class="nx">button</span> <span class="nx">text</span><span class="o">&gt;</span><span class="p">[</span><span class="o">:&lt;</span><span class="nx">negative</span> <span class="nx">button</span> <span class="nx">text</span><span class="o">&gt;</span><span class="p">[</span><span class="o">:&lt;</span><span class="nx">timeout</span><span class="o">&gt;</span><span class="p">[</span><span class="o">:&lt;</span><span class="nx">flag</span> <span class="nx">modal</span><span class="o">&gt;</span><span class="p">]]]]]]</span>
-</pre></div>
-</div>
-<ul class="simple">
-<li>If a user clicks on a link, an alert is shown. If the user answers the alert by clicking on the &#8216;positive button&#8217;, the browser opens the specified link.
-If the user click on the negative answer (or waits for timout), the alert is closed and the browser does nothing.</li>
-<li>All parameter are optional.</li>
-<li>Parameter are seperated by &#8216;:&#8217;</li>
-<li>To use &#8216;:&#8217; inside the text, the colon has to be escaped by &#8216;\&#8217;. E.g. &#8216;ok\: I understand&#8217;.</li>
-</ul>
-<table border="1" class="docutils">
-<colgroup>
-<col width="15%" />
-<col width="85%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Parameter</th>
-<th class="head">Description</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>Text</td>
-<td>The text shown by the alert. HTML is allowed to format the text. Any &#8216;:&#8217; needs to be escaped. Default: &#8216;Please confirm&#8217;.</td>
-</tr>
-<tr class="row-odd"><td>Level</td>
-<td>success, info, warning, danger</td>
-</tr>
-<tr class="row-even"><td>Positive button text</td>
-<td>Default: &#8216;Ok&#8217;</td>
-</tr>
-<tr class="row-odd"><td>Negative button text</td>
-<td>Default: &#8216;Cancel&#8217;</td>
-</tr>
-<tr class="row-even"><td>Timeout in seconds</td>
-<td>0: no timeout, &gt;0: after the specified time in seconds, the alert will dissapear and behaves like &#8216;negative answer&#8217;</td>
-</tr>
-<tr class="row-odd"><td>Flag modal</td>
-<td>0: Alert behaves not modal. 1: (default) Alert behaves modal.</td>
-</tr>
-</tbody>
-</table>
-<p>Examples:</p>
-<table border="1" class="docutils">
-<colgroup>
-<col width="44%" />
-<col width="56%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">SQL-Query</th>
-<th class="head">Result</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>SELECT &#8220;p:form_person|q:Edit Person:warn&#8221; AS _link</td>
-<td>Shows alert with level &#8216;warn&#8217;</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;p:form_person|q:Edit Person::I do:No way&#8221; AS _link</td>
-<td>Instead of &#8216;Ok&#8217; and &#8216;Cancel&#8217;, the button text will be &#8216;I do&#8217; and &#8216;No way&#8217;</td>
-</tr>
-<tr class="row-even"><td>SELECT &#8220;p:form_person|q:Edit Person:::10&#8221; AS _link</td>
-<td>The Alert will be shown 10 seconds</td>
-</tr>
-<tr class="row-odd"><td>SELECT &#8220;p:form_person|q:Edit Person:::10:0&#8221; AS _link</td>
-<td>The Alert will be shown 10 seconds and is not modal.</td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="section" id="download">
-<span id="id46"></span><h3>Download<a class="headerlink" href="#download" title="Permalink to this headline">¶</a></h3>
-<p>Download offers:</p>
-<ul class="simple">
-<li>download a single file (any type),</li>
-<li>concatenate several files (uploaded) and/or web pages (=HTML to PDF) into one PDF output file,</li>
-<li>create a ZIP archive, filled with several files (&#8216;uploaded&#8217; or &#8216;HTML to PDF&#8217;-converted).</li>
-</ul>
-<p>The downloads are SIP protected. Only the current user can use the link to download files.</p>
-<p>By using the <cite>_link</cite> columnname:</p>
-<ul class="simple">
-<li>the option <cite>d:...</cite> initiate creating the download link and optional specifies an export filename,</li>
-<li>the optional <cite>M:...</cite> (Mode) specifies the export type (file, pdf, zip),</li>
-<li>setting <cite>s:1</cite> is mandatory for the download function,</li>
-<li>the alttext <cite>a:...</cite> specifies a message in the download popup.</li>
-</ul>
-<p>By using <cite>_pdf</cite>,  <cite>_Pdf</cite>, <cite>_file</cite>, <cite>_File</cite>, <cite>_zip</cite>, <cite>_Zip</cite> as columnname, the options <cite>d</cite>, <cite>m</cite> and <cite>s</cite>
-will be set by automatically.</p>
-<p>All files will be read by PHP - therefore the directory might be protected against direct web access. This way is the
-preferred way to offer secure downloads via QFQ.</p>
-<p>In case the download needs a persistant URL (no SIP, no user session), a regular
-link, pointing directly to a file, have to be used - the download functionality described here is not appropriate for
-such a scenario.</p>
-<div class="section" id="parameter-and-element-sources">
-<span id="download-parameter-files"></span><h4>Parameter and (element) sources<a class="headerlink" href="#parameter-and-element-sources" title="Permalink to this headline">¶</a></h4>
-<ul>
-<li><p class="first"><em>download</em>: <cite>d[:&lt;exportFilename&gt;]</cite></p>
-<ul>
-<li><p class="first"><em>exportFilename</em> = &lt;filename for save as&gt; - Name, offered in the &#8216;File save as&#8217; browser dialog. Default: &#8216;output.&lt;ext&gt;&#8217;.</p>
-<p>If there is no <cite>exportFilename</cite> defined and <cite>mode=file</cite>, than the original filename is taken.</p>
-<p>If the mime type is different from the <cite>exportFilename</cite> extension, then the mime type extension will be added to
-<cite>exportFilename</cite>. This guarantees that a filemanager will open the file with the correct application.</p>
-<p>The user typically expect meaningful and distinct filenames for different download links.</p>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>popupMessage</em>: <cite>a:&lt;text&gt;</cite> - will be displayed in the popup window during download. If the creating/download is fast, the window might disappear quickly.</p>
-</li>
-<li><p class="first"><em>mode</em>: <cite>m:&lt;mode&gt;</cite></p>
-<ul>
-<li><p class="first"><em>mode</em> = &lt;file | pdf | zip&gt; - This parameter is optional and can be skipped in most situations. Mandatory
-for &#8216;zip&#8217;.</p>
-<blockquote>
-<div><ul class="simple">
-<li>If <cite>m:file</cite>, the mime type is derived dynamically from the specified file. In this mode, only one element source
-is allowed per download link (no concatenation).</li>
-<li>In case of multiple element sources, only <cite>pdf</cite> or <cite>zip</cite> is supported.</li>
-<li>If <cite>m:zip</cite> is used together with <cite>U:...</cite> oder <cite>u:..</cite>, those HTML pages will be converted to PDF. Those files
-get generic filenames inside the archive.</li>
-<li>If not specified, the <strong>default</strong> &#8216;Mode&#8217; depends on the number of specified element sources (=file or web page):<ul>
-<li>If only one <cite>file</cite> is specifed, the default is <cite>file</cite>.</li>
-<li>If there is a) a page defined or b) multiple elements, the default is <cite>pdf</cite>.</li>
-</ul>
-</li>
-</ul>
-</div></blockquote>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>element sources</em> - for <cite>m:pdf</cite> or <cite>m:zip</cite>, all of the following three element sources might be specified multiple times. Any combination and order of the three options are allowed.</p>
-<ul>
-<li><p class="first"><em>file</em>: <cite>f:&lt;pathFilename&gt;</cite> - relative or absolute pathFilename offered for a) download (single), or to be concatenated
-in a PDF or ZIP.</p>
-</li>
-<li><p class="first"><em>urlParam</em>: <cite>U:id=&lt;t3 page&gt;&amp;&lt;key 1&gt;=&lt;value 1&gt;&amp;&lt;key 2&gt;=&lt;value 2&gt;&amp;...&amp;&lt;key n&gt;=&lt;value n&gt;</cite>.</p>
-<ul>
-<li><p class="first">By default, the options given to wkhtml will <em>not</em> be encoded by a SIP!</p>
-</li>
-<li><p class="first">To encode the parameter via SIP: Add &#8216;_sip=1&#8217; to the URL GET parameter.</p>
-<p>E.g. <cite>U:id=form&amp;_sip=1&amp;form=Person&amp;r=1</cite>.</p>
-<p>In that way, specific sources for the <cite>download</cite> might be SIP encrypted.</p>
-</li>
-<li><p class="first">Any current HTML cookies will be forwarded to/via <cite>wkhtml</cite>. This includes the current FE Login as well as any
-QFQ session. Also the current User-Agent are faked via the <cite>wkhtml</cite> page request.</p>
-</li>
-<li><p class="first">If there are trouble with accessing FE_GROUP protected content, please check <a class="reference external" href="http://wkhtmltopdf.org/">wkhtmltopdf</a>.</p>
-</li>
-</ul>
-</li>
-<li><p class="first"><em>url</em>: <cite>u:&lt;url&gt;</cite> - any URL, pointing to an internal or external destination.</p>
-</li>
-<li><p class="first"><em>WKHTML Options</em> for <cite>urlParam</cite> or <cite>url</cite>:</p>
-<ul>
-<li><p class="first">The &#8216;HTML to PDF&#8217; will be done via <cite>wkhtmltopdf</cite>.</p>
-</li>
-<li><p class="first">All possible options, suitable for <cite>wkhtmltopdf</cite>, can be submitted in the <cite>u:...</cite> or <cite>U:...</cite> element source.
-Check <a class="reference external" href="https://wkhtmltopdf.org/usage/wkhtmltopdf.txt">wkhtmltopdf.txt</a> for possible options. Be aware that
-key/value tuple in the  documentation is separated by a space, but to respect the QFQ key/value notation of URLs,
-the key/value tuple in <cite>u:...</cite> or <cite>U:...</cite> has to be separated by &#8216;=&#8217;. Please see last example below.</p>
-<blockquote>
-<div><p>Most of the other Link-Class attributes can be used to customize the link as well.</p>
-</div></blockquote>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-<p>Example <cite>_link</cite>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># single `file`. Specifying a popup message window text is not necessary, cause a file directly accessed is fast.</span>
-<span class="nx">SELECT</span> <span class="s2">&quot;d:file.pdf|s|t:Download|f:fileadmin/pdf/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_link</span>
-
-<span class="c1"># single `file`, with mode</span>
-<span class="nx">SELECT</span> <span class="s2">&quot;d:file.pdf|m:pdf|s|t:Download|f:fileadmin/pdf/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_link</span>
-
-<span class="c1"># three sources: two pages and one file</span>
-<span class="nx">SELECT</span> <span class="s2">&quot;d:complete.pdf|s|t:Complete PDF|U:id=detail&amp;r=1|U:id=detail2&amp;r=1|f:fileadmin/pdf/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_link</span>
-
-<span class="c1"># three sources: two pages and one file</span>
-<span class="nx">SELECT</span> <span class="s2">&quot;d:complete.pdf|s|t:Complete PDF|U:id=detail&amp;r=1|U:id=detail2&amp;r=1|f:fileadmin/pdf/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_link</span>
-
-<span class="c1"># three sources: two pages and one file, parameter to wkhtml will be SIP encoded</span>
-<span class="nx">SELECT</span> <span class="s2">&quot;d:complete.pdf|s|t:Complete PDF|U:id=detail&amp;r=1&amp;_sip=1|U:id=detail2&amp;r=1&amp;_sip=1|f:fileadmin/pdf/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_link</span>
-
-<span class="c1"># three sources: two pages and one file, the second page will be in landscape and pagesize A3</span>
-<span class="nx">SELECT</span> <span class="s2">&quot;d:complete.pdf|s|t:Complete PDF|U:id=detail&amp;r=1|U:id=detail2&amp;r=1&amp;--orientation=Landscape&amp;--page-size=A3|f:fileadmin/pdf/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_link</span>
-</pre></div>
-</div>
-<p>Example <cite>_pdf</cite>, <cite>_zip</cite>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># File 1: U:id=1&amp;--orientation=Landscape&amp;--page-size=A3</span>
-<span class="c1"># File 2: U:id=form</span>
-<span class="c1"># File 3: f:fileadmin/file.pdf</span>
-<span class="nx">SELECT</span> <span class="s1">&#39;t:PDF|a:Creating a new PDF|U:id=1&amp;--orientation=Landscape&amp;--page-size=A3|U:id=form|f:fileadmin/file.pdf&#39;</span> <span class="k">AS</span> <span class="nx">_pdf</span>
-
-<span class="c1"># File 1: U:id=1</span>
-<span class="c1"># File 2: u:http://www.example.com</span>
-<span class="c1"># File 3: f:fileadmin/file.pdf</span>
-<span class="nx">SELECT</span> <span class="s1">&#39;t:PDF - 3 Files|a:Please be patient|U:id=1|u:http://www.example.com|f:fileadmin/file.pdf&#39;</span> <span class="k">AS</span> <span class="nx">_pdf</span>
-
-<span class="c1"># File 1: U:id=1</span>
-<span class="c1"># File 2: U:id=form</span>
-<span class="c1"># File 3: f:fileadmin/file.pdf</span>
-<span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s1">&#39;t:ZIP - 3 Pages|a:Please be patient|U:id=1|U:id=form|f:&#39;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">pathFilename</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_zip</span>
-</pre></div>
-</div>
-<p>Use the <cite>&#8211;print-media-type</cite> as wkthml option to access the page with media type &#8216;printer&#8217;. Depending on the website
-configuration this switches off navigation and background images.</p>
-</div>
-<div class="section" id="export-area">
-<h4>Export area<a class="headerlink" href="#export-area" title="Permalink to this headline">¶</a></h4>
-<p>To offer protected pages, e.g. referenced in download links, the regular FE_GROUPs can&#8217;t be used, cause the download does
-not have the current user privileges (it&#8217;s a separate process, started as the webserver user).</p>
-<p>Create a separated export tree in Typo3 Backend, which is IP access restricted. Only localhost or the FE_GROUP &#8216;admin&#8217;
-is allowed to access:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="p">[</span><span class="nx">IP</span> <span class="o">=</span> <span class="p">{</span><span class="nv">$tmp</span><span class="o">.</span><span class="nx">restrictedIPRange</span><span class="p">}</span> <span class="p">][</span><span class="nx">usergroup</span> <span class="o">=</span> <span class="nx">admin</span><span class="p">]</span>
-   <span class="nx">page</span><span class="o">.</span><span class="mi">10</span> <span class="o">&lt;</span> <span class="nx">styles</span><span class="o">.</span><span class="nx">content</span><span class="o">.</span><span class="nx">get</span>
-<span class="p">[</span><span class="k">else</span><span class="p">]</span>
-   <span class="nx">page</span><span class="o">.</span><span class="mi">10</span> <span class="o">=</span> <span class="nx">TEXT</span>
-   <span class="nx">page</span><span class="o">.</span><span class="mf">10.</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">Please</span> <span class="nx">access</span> <span class="nx">from</span> <span class="nx">localhost</span> <span class="k">or</span> <span class="nb">log</span> <span class="nx">in</span> <span class="k">as</span> <span class="s1">&#39;admin&#39;</span> <span class="nx">user</span><span class="o">.</span>
-<span class="p">[</span><span class="k">global</span><span class="p">]</span>
-</pre></div>
-</div>
-</div>
-</div>
-<div class="section" id="columns-page-x">
-<h3>Columns: _page[X]<a class="headerlink" href="#columns-page-x" title="Permalink to this headline">¶</a></h3>
-<p>The colum name is composed of the string <em>page</em> and a trailing character to specify the type of the link.</p>
-<p><strong>Syntax</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s2">&quot;[options]&quot;</span> <span class="k">AS</span> <span class="nx">_page</span><span class="p">[</span><span class="o">&lt;</span><span class="nb">link</span> <span class="nx">type</span><span class="o">&gt;</span><span class="p">]</span>
-
-<span class="nx">with</span><span class="o">:</span> <span class="p">[</span><span class="nx">options</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">p</span><span class="o">:&lt;</span><span class="nx">page</span> <span class="o">&amp;</span> <span class="nx">param</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">t</span><span class="o">:&lt;</span><span class="nx">text</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">o</span><span class="o">:&lt;</span><span class="nx">tooltip</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">q</span><span class="o">:&lt;</span><span class="nx">question</span> <span class="nx">parameter</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">c</span><span class="o">:&lt;</span><span class="nx">class</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">g</span><span class="o">:&lt;</span><span class="nx">target</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">r</span><span class="o">:&lt;</span><span class="nx">render</span> <span class="nx">mode</span><span class="o">&gt;</span><span class="p">]</span>
-
-<span class="o">&lt;</span><span class="nb">link</span> <span class="nx">type</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nx">c</span><span class="p">,</span><span class="nx">d</span><span class="p">,</span><span class="nx">e</span><span class="p">,</span><span class="nx">h</span><span class="p">,</span><span class="nx">i</span><span class="p">,</span><span class="nx">n</span><span class="p">,</span><span class="nx">s</span>
-</pre></div>
-</div>
-<table border="1" class="docutils">
-<colgroup>
-<col width="10%" />
-<col width="32%" />
-<col width="26%" />
-<col width="32%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">column name</th>
-<th class="head">Purpose</th>
-<th class="head">default value of question parameter</th>
-<th class="head">Mandatory parameters</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>_page</td>
-<td>Internal link without a grafic</td>
-<td>empty</td>
-<td>p:&lt;pageId&gt;[&amp;param]</td>
-</tr>
-<tr class="row-odd"><td>_pagec</td>
-<td>Internal link without a grafic, with question</td>
-<td><em>Please confirm!</em></td>
-<td>p:&lt;pageId&gt;[&amp;param]</td>
-</tr>
-<tr class="row-even"><td>_paged</td>
-<td>Internal link with delete icon (trash)</td>
-<td><em>Delete record ?</em></td>
-<td>U:form=&lt;formname&gt;&amp;r=&lt;record id&gt; <em>or</em>
-U:table=&lt;tablename&gt;&amp;r=&lt;record id&gt;</td>
-</tr>
-<tr class="row-odd"><td>_pagee</td>
-<td>Internal link with edit icon (pencil)</td>
-<td>empty</td>
-<td>p:&lt;pageId&gt;[&amp;param]</td>
-</tr>
-<tr class="row-even"><td>_pageh</td>
-<td>Internal link with help icon (question mark)</td>
-<td>empty</td>
-<td>p:&lt;pageId&gt;[&amp;param]</td>
-</tr>
-<tr class="row-odd"><td>_pagei</td>
-<td>Internal link with information icon (i)</td>
-<td>empty</td>
-<td>p:&lt;pageId&gt;[&amp;param]</td>
-</tr>
-<tr class="row-even"><td>_pagen</td>
-<td>Internal link with new icon (sheet)</td>
-<td>empty</td>
-<td>p:&lt;pageId&gt;[&amp;param]</td>
-</tr>
-<tr class="row-odd"><td>_pages</td>
-<td>Internal link with show icon (magnifier)</td>
-<td>empty</td>
-<td>p:&lt;pageId&gt;[&amp;param]</td>
-</tr>
-</tbody>
-</table>
-<ul class="simple">
-<li>All parameter are optional.</li>
-<li>Optional set of predefined icons.</li>
-<li>Optional set of dialog boxes.</li>
-</ul>
-<table border="1" class="docutils">
-<colgroup>
-<col width="6%" />
-<col width="42%" />
-<col width="25%" />
-<col width="27%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Parameter</th>
-<th class="head">Description</th>
-<th class="head">Default value</th>
-<th class="head">Example</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>&lt;page&gt;</td>
-<td>TYPO3 page id or page alias.</td>
-<td>The current page: <em>{{pageId}}</em></td>
-<td>45 application application&amp;N_param1=1045</td>
-</tr>
-<tr class="row-odd"><td>&lt;text&gt;</td>
-<td>Text, wrapped by the link. If there is an icon, text will be displayed to the right of it.</td>
-<td>empty string</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>&lt;tooltip&gt;</td>
-<td>Text to appear as a ToolTip</td>
-<td>empty string</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>&lt;question&gt;</td>
-<td>If there is a question text given, an alert will be opened. Only if the user clicks on &#8216;ok&#8217;,
-the link will be called</td>
-<td><strong>Expected &#8220;=&#8221; to follow &#8220;see&#8221;</strong></td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>&lt;class&gt;</td>
-<td>CSS Class for the &lt;a&gt; tag</td>
-<td>The default class defined for internal links in
-ext_localconf.php (see ...)</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>&lt;target&gt;</td>
-<td>Parameter for HTML &#8216;target=&#8217;. F.e.: Opens a new window</td>
-<td>empty</td>
-<td>P</td>
-</tr>
-<tr class="row-even"><td>&lt;rendermode&gt;</td>
-<td>Show/render a link at all or not. See <a class="reference internal" href="#render-mode">render-mode</a> 0-5</td>
-<td>&#160;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>&lt;create sip&gt;</td>
-<td>s</td>
-<td>&#160;</td>
-<td>&#8216;s&#8217;: create a SIP</td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="section" id="column-paged">
-<h3>Column: _paged<a class="headerlink" href="#column-paged" title="Permalink to this headline">¶</a></h3>
-<p>These column offers a link, with a confirmation question, to delete one record (mode &#8216;table&#8217;) or a bunch of records
-(mode &#8216;form&#8217;). After deleting the record(s), the current page will be reloaded in the browser.</p>
-<p><strong>Syntax</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s2">&quot;U:table=&lt;tablename&gt;&amp;r=&lt;record id&gt;|q:&lt;question&gt;|...&quot;</span> <span class="k">AS</span> <span class="nx">_paged</span>
-<span class="nx">SELECT</span> <span class="s2">&quot;U:form=&lt;formname&gt;&amp;r=&lt;record id&gt;|q:&lt;question&gt;|...&quot;</span> <span class="k">AS</span> <span class="nx">_paged</span>
-</pre></div>
-</div>
-<p>If the record to delete contains column(s), whose columnname match on <cite>%pathFileName%</cite> and such a
-column points to a real existing file, such a file will be deleted too. If the table contains records where the specific
-file is multiple times referenced, than the file is not deleted (it would break the still existing references). Multiple
-references are not found, if they use different colummnnames or tablenames.</p>
-<div class="section" id="mode-table">
-<h4>Mode: table<a class="headerlink" href="#mode-table" title="Permalink to this headline">¶</a></h4>
-<ul class="simple">
-<li><cite>table=&lt;table name&gt;</cite></li>
-<li><cite>r=&lt;record id&gt;</cite></li>
-</ul>
-<p>Deletes the record with id &#8216;&lt;record id&gt;&#8217; from table &#8216;&lt;table name&gt;&#8217;.</p>
-</div>
-<div class="section" id="mode-form">
-<h4>Mode: form<a class="headerlink" href="#mode-form" title="Permalink to this headline">¶</a></h4>
-<ul class="simple">
-<li><cite>form=&lt;form name&gt;</cite></li>
-<li><cite>r=&lt;record id&gt;</cite></li>
-</ul>
-<p>Deletes the record with id &#8216;&lt;record id&gt;&#8217; from the table specified in form &#8216;&lt;form name&gt;&#8217; as primary table.
-Additional action <em>FormElement</em> of type <em>beforeDelete</em> or <em>afterDelete</em> will be fired too.</p>
-</div>
-<div class="section" id="id47">
-<h4>Examples:<a class="headerlink" href="#id47" title="Permalink to this headline">¶</a></h4>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s1">&#39;U:table=Person&amp;r=123|q:Do you want delete John Doe?&#39;</span> <span class="k">AS</span> <span class="nx">_paged</span>
-<span class="nx">SELECT</span> <span class="s1">&#39;U:form=person-main&amp;r=123|q:Do you want delete John Doe?&#39;</span> <span class="k">AS</span> <span class="nx">_paged</span>
-</pre></div>
-</div>
-</div>
-</div>
-<div class="section" id="id48">
-<h3>Columns: _Page[X]<a class="headerlink" href="#id48" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Similar to <cite>_page[X]</cite></li>
-<li>Parameter are position dependent and therefore without a qualifier!</li>
-</ul>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="s2">&quot;[&lt;page id|alias&gt;[&amp;param=value&amp;...]] | [text] | [tooltip] | [question parameter] | [class] | [target] | [render mode]&quot;</span> <span class="k">as</span> <span class="nx">_Pagee</span><span class="o">.</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="id49">
-<h3>Column: _Paged<a class="headerlink" href="#id49" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Similar to <cite>_paged</cite></li>
-<li>Parameter are position dependent and therefore without a qualifier!</li>
-</ul>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="s2">&quot;[table=&lt;table name&gt;&amp;r-&lt;record id&gt;[&amp;param=value&amp;...] | [text] | [tooltip] | [question parameter] | [class] | [render mode]&quot;</span> <span class="k">as</span> <span class="nx">_Paged</span><span class="o">.</span>
-<span class="s2">&quot;[form=&lt;form name&gt;&amp;r-&lt;record id&gt;[&amp;param=value&amp;...] | [text] | [tooltip] | [question parameter] | [class] | [render mode]&quot;</span> <span class="k">as</span> <span class="nx">_Paged</span><span class="o">.</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="column-vertical">
-<h3>Column: _vertical<a class="headerlink" href="#column-vertical" title="Permalink to this headline">¶</a></h3>
-<p>Render text vertically. This is useful for tables with limited column width. The vertical rendering is achieved via CSS tranformations (rotation) defined in the style attribute of the wrapping tag. You can optionally specify the rotation
-angle.</p>
-<p><strong>Syntax</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s2">&quot;&lt;text&gt;|[&lt;angle&gt;]|[&lt;width&gt;]|[&lt;height&gt;]|[&lt;wrap tag&gt;]&quot;</span> <span class="k">AS</span> <span class="nx">_vertical</span>
-</pre></div>
-</div>
-<table border="1" class="docutils">
-<colgroup>
-<col width="10%" />
-<col width="77%" />
-<col width="13%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head"><strong>Parameter</strong></th>
-<th class="head"><strong>Description</strong></th>
-<th class="head"><strong>Default value</strong></th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>&lt;text&gt;</td>
-<td>The string that should be rendered vertically.</td>
-<td>none</td>
-</tr>
-<tr class="row-odd"><td>&lt;angle&gt;</td>
-<td>How many degrees should the text be rotated? The angle is measured clockwise from baseline of the text.</td>
-<td><em>270</em></td>
-</tr>
-<tr class="row-even"><td>&lt;width&gt;</td>
-<td>Width (of what?). Needs to have a CSS_unit (e.g. px, em) specified. (Implemented?)</td>
-<td><em>1em</em></td>
-</tr>
-<tr class="row-odd"><td>&lt;height&gt;</td>
-<td>Height (of what?). Needs to have a CSS-unit (e.g. px, em) specified. (Implemented?)</td>
-<td>none</td>
-</tr>
-<tr class="row-even"><td>&lt;wraptag&gt;</td>
-<td>What tag should be used to wrap the vertical text? Possible options are <em>div</em>, <em>span</em>, etc.</td>
-<td><em>div</em></td>
-</tr>
-</tbody>
-</table>
-<p><strong>Minimal Example</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;Hallo&quot;</span> <span class="k">AS</span> <span class="nx">_vertical</span>
-</pre></div>
-</div>
-<p><strong>Advanced Examples</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;Hallo|90&quot;</span> <span class="k">AS</span> <span class="nx">_vertical</span>
-<span class="mf">20.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;Hallo|90|3em|7em|span&quot;</span> <span class="k">AS</span> <span class="nx">_vertical</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="column-mailto">
-<h3>Column: _mailto<a class="headerlink" href="#column-mailto" title="Permalink to this headline">¶</a></h3>
-<p>Easily create Email links.</p>
-<p><strong>Syntax</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s2">&quot;&lt;email address&gt;|[&lt;link text&gt;]&quot;</span> <span class="k">AS</span> <span class="nx">_mailto</span>
-</pre></div>
-</div>
-<table border="1" class="docutils">
-<colgroup>
-<col width="6%" />
-<col width="88%" />
-<col width="6%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head"><strong>Parameter</strong></th>
-<th class="head"><strong>Description</strong></th>
-<th class="head"><strong>Default
-value</strong></th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>&lt;emailaddress&gt;</td>
-<td>The email address where the link should point to.</td>
-<td>none</td>
-</tr>
-<tr class="row-odd"><td>&lt;linktext&gt;</td>
-<td>The text that should be displayed on the website and be linked to the email address. This will typically be the name of the recipient. If this parameter is omitted, the email address will be displayed as
-link text.</td>
-<td>none</td>
-</tr>
-</tbody>
-</table>
-<p><strong>Minimal Example</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;john.doe@example.com&quot;</span> <span class="k">AS</span> <span class="nx">_mailto</span>
-</pre></div>
-</div>
-<p><strong>Advanced Example</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;john.doe@example.com|John Doe&quot;</span> <span class="k">AS</span> <span class="nx">_mailto</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="column-sendmail">
-<h3>Column: _sendmail<a class="headerlink" href="#column-sendmail" title="Permalink to this headline">¶</a></h3>
-<p>&lt;TO:email[,email]&gt;|&lt;FROM:email&gt;|&lt;subject&gt;|&lt;body&gt;|[&lt;REPLY-TO:email&gt;]|[&lt;flag autosubmit: on /off&gt;]|[&lt;grid&gt;]|[xId]|&lt;CC:email[,email]&gt;|&lt;BCC:email[,email]&gt;</p>
-<p>Send text emails. Every mail will be logged in the table <cite>mailLog</cite>.</p>
-<p><strong>Syntax</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s2">&quot;john@doe.com|jane@doe.com|Reminder tomorrow|Please dont miss the meeting tomorrow&quot;</span> <span class="k">AS</span> <span class="nx">_sendmail</span>
-</pre></div>
-</div>
-<table border="1" class="docutils">
-<colgroup>
-<col width="37%" />
-<col width="56%" />
-<col width="7%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head"><strong>Parameter</strong></th>
-<th class="head"><strong>Description</strong></th>
-<th class="head"><strong>Required</strong></th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>TO:email[,email]</td>
-<td>Comma-separated list of receiver email addresses. Optional: <cite>realname &lt;john&#64;doe.com&gt;</cite></td>
-<td>yes</td>
-</tr>
-<tr class="row-odd"><td>FROM:email</td>
-<td>Sender of the email. Optional: &#8216;realname &lt;<a class="reference external" href="mailto:john&#37;&#52;&#48;doe&#46;com">john<span>&#64;</span>doe<span>&#46;</span>com</a>&gt;&#8217;</td>
-<td>yes</td>
-</tr>
-<tr class="row-even"><td>subject</td>
-<td>Subject of the email</td>
-<td>yes</td>
-</tr>
-<tr class="row-odd"><td>body</td>
-<td>Message</td>
-<td>yes</td>
-</tr>
-<tr class="row-even"><td>REPLY-TO:email</td>
-<td>Email address to reply to (if different from sender)</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>flagAutoSubmit  &#8216;on&#8217; / &#8216;off&#8217;</td>
-<td>If &#8216;on&#8217; (default), add mail header &#8216;Auto-Submitted: auto-send&#8217; - suppress OoO replies</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>grId</td>
-<td>Will be copied to the mailLog record. Helps to setup specific logfile queries</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>xId</td>
-<td>Will be copied to the mailLog record. Helps to setup specific logfile queries</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>CC:email[,email]</td>
-<td>Comma-separated list of receiver email addresses. Optional: &#8216;realname &lt;<a class="reference external" href="mailto:john&#37;&#52;&#48;doe&#46;com">john<span>&#64;</span>doe<span>&#46;</span>com</a>&gt;&#8217;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>BCC:email[,email]</td>
-<td>Comma-separated list of receiver email addresses. Optional: &#8216;realname &lt;<a class="reference external" href="mailto:john&#37;&#52;&#48;doe&#46;com">john<span>&#64;</span>doe<span>&#46;</span>com</a>&gt;&#8217;</td>
-<td>&#160;</td>
-</tr>
-</tbody>
-</table>
-<p><strong>Minimal Example</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;john.doe@example.com|company@example.com|Latest News|The new version is now available.&quot;</span> <span class="k">AS</span> <span class="nx">_sendmail</span>
-</pre></div>
-</div>
-<p>This will send an email with subject <em>Latest News</em> from <a class="reference external" href="mailto:company&#37;&#52;&#48;example&#46;com">company<span>&#64;</span>example<span>&#46;</span>com</a> to <a class="reference external" href="mailto:john&#46;doe&#37;&#52;&#48;example&#46;com">john<span>&#46;</span>doe<span>&#64;</span>example<span>&#46;</span>com</a>.</p>
-<p><strong>Advanced Examples</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;customer1@example.com,Firstname Lastname &lt;customer2@example.com&gt;, Firstname Lastname &lt;customer3@example.com&gt;|company@example.com|Latest News|The new version is now available.|sales@example.com|on|101|222|ceo@example.com|backup@example.com&quot;</span> <span class="k">AS</span> <span class="nx">_sendmail</span>
-</pre></div>
-</div>
-<p>This will send an email with subject <em>Latest News</em> from <a class="reference external" href="mailto:company&#37;&#52;&#48;example&#46;com">company<span>&#64;</span>example<span>&#46;</span>com</a> to customer1, customer2 and customer3 by
-using a realname for customer2 and customer3 and suppress generating of OoO answer if any receiver is on vacation.
-Additional the CEO as well as backup will receive the mail via CC and BCC.</p>
-<p>For debugging, please check <a class="reference internal" href="#redirect-all-mail-to">REDIRECT_ALL_MAIL_TO</a>.</p>
-</div>
-<div class="section" id="column-img">
-<h3>Column: _img<a class="headerlink" href="#column-img" title="Permalink to this headline">¶</a></h3>
-<p>Renders images. Allows to define an alternative text and a title attribute for the image. Alternative text and title text are optional.</p>
-<ul class="simple">
-<li>If no alternative text is defined, an empty alt attribute is rendered in the img tag (since this attribute is mandatory in HTML).</li>
-<li>If no title text is defined, the title attribute will not be rendered at all.</li>
-</ul>
-<p><strong>Syntax</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s2">&quot;&lt;path to image&gt;|[&lt;alt text&gt;]|[&lt;title text&gt;]&quot;</span> <span class="k">AS</span> <span class="nx">_img</span>
-</pre></div>
-</div>
-<table border="1" class="docutils">
-<colgroup>
-<col width="10%" />
-<col width="69%" />
-<col width="21%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head"><strong>Parameter</strong></th>
-<th class="head"><strong>Description</strong></th>
-<th class="head"><strong>Default value/behaviour</strong></th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>&lt;pathtoimage&gt;</td>
-<td>The path to the image file.</td>
-<td>none</td>
-</tr>
-<tr class="row-odd"><td>&lt;alttext&gt;</td>
-<td>Alternative text. Will be displayed if image can&#8217;t be loaded (alt attribute of img tag).</td>
-<td>empty string</td>
-</tr>
-<tr class="row-even"><td>&lt;titletext&gt;</td>
-<td>Text that will be set as image title in the title attribute of the img tag.</td>
-<td>no title attribute rendered</td>
-</tr>
-</tbody>
-</table>
-<p><strong>Minimal Example</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;fileadmin/img/img.jpg&quot;</span> <span class="k">AS</span> <span class="nx">_img</span>
-</pre></div>
-</div>
-<p><strong>Advanced Examples</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;fileadmin/img/img.jpg|Aternative Text&quot;</span> <span class="k">AS</span> <span class="nx">_img</span>            <span class="c1"># alt=&quot;Alternative Text, no title</span>
-<span class="mf">20.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;fileadmin/img/img.jpg|Aternative Text|&quot;</span> <span class="k">AS</span> <span class="nx">_img</span>           <span class="c1"># alt=&quot;Alternative Text, no title</span>
-<span class="mf">30.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;fileadmin/img/img.jpg|Aternative Text|Title Text&quot;</span> <span class="k">AS</span> <span class="nx">_img</span> <span class="c1"># alt=&quot;Alternative Text, title=&quot;Title Text&quot;</span>
-<span class="mf">40.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;fileadmin/img/img.jpg|Alternative Text&quot;</span> <span class="k">AS</span> <span class="nx">_img</span>           <span class="c1"># alt=&quot;Alternative Text&quot;, no title</span>
-<span class="mf">50.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;fileadmin/img/img.jpg&quot;</span> <span class="k">AS</span> <span class="nx">_img</span>                            <span class="c1"># empty alt, no title</span>
-<span class="mf">60.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;fileadmin/img/img.jpg|&quot;</span> <span class="k">AS</span> <span class="nx">_img</span>                           <span class="c1"># empty alt, no title</span>
-<span class="mf">70.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;fileadmin/img/img.jpg||Title Text&quot;</span> <span class="k">AS</span> <span class="nx">_img</span>                <span class="c1"># empty alt, title=&quot;Title Text&quot;</span>
-<span class="mf">80.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;fileadmin/img/img.jpg||&quot;</span> <span class="k">AS</span> <span class="nx">_img</span>                          <span class="c1"># empty alt, no title</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="column-exec">
-<h3>Column: _exec<a class="headerlink" href="#column-exec" title="Permalink to this headline">¶</a></h3>
-<p>Runs batch files or executables on the webserver. In case of an error, returncode and errormessage will be returned.</p>
-<p><strong>Syntax</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">command</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-<table border="1" class="docutils">
-<colgroup>
-<col width="16%" />
-<col width="63%" />
-<col width="21%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head"><strong>Parameter</strong></th>
-<th class="head"><strong>Description</strong></th>
-<th class="head"><strong>Default value</strong></th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>&lt;command&gt;</td>
-<td>The command that should be executed on the server.</td>
-<td>none</td>
-</tr>
-</tbody>
-</table>
-<p><strong>Minimal Examples</strong></p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;ls -s&quot;</span> <span class="k">AS</span> <span class="nx">_exec</span>
-<span class="mf">20.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;./batchfile.sh&quot;</span> <span class="k">AS</span> <span class="nx">_exec</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="column-pdf-file-zip">
-<h3>Column: _pdf | _file | _zip<a class="headerlink" href="#column-pdf-file-zip" title="Permalink to this headline">¶</a></h3>
-<p>Most of the other Link-Class attributes can be used to customize the link.</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s2">&quot;[options]&quot;</span> <span class="k">AS</span> <span class="nx">_pdf</span><span class="p">,</span> <span class="s2">&quot;[options]&quot;</span> <span class="k">AS</span> <span class="nx">_file</span><span class="p">,</span> <span class="s2">&quot;[options]&quot;</span> <span class="k">AS</span> <span class="nx">_zip</span>
-
-<span class="nx">with</span><span class="o">:</span> <span class="p">[</span><span class="nx">options</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nx">d</span><span class="o">:&lt;</span><span class="nx">exportFilename</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">U</span><span class="o">:&lt;</span><span class="nx">params</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">u</span><span class="o">:&lt;</span><span class="nx">url</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">f</span><span class="o">:</span><span class="nb">file</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">t</span><span class="o">:&lt;</span><span class="nx">text</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">a</span><span class="o">:&lt;</span><span class="nx">message</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">o</span><span class="o">:&lt;</span><span class="nx">tooltip</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">c</span><span class="o">:&lt;</span><span class="nx">class</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="nx">r</span><span class="o">:&lt;</span><span class="nx">render</span> <span class="nx">mode</span><span class="o">&gt;</span><span class="p">]</span>
-</pre></div>
-</div>
-<ul>
-<li><p class="first">Parameter are position independent.</p>
-</li>
-<li><p class="first"><em>&lt;params&gt;</em>: see <a class="reference internal" href="#download-parameter-files">download-parameter-files</a></p>
-</li>
-<li><p class="first">For column <cite>_pdf</cite> and <cite>_zip</cite>, the element sources <cite>U:...</cite>, <cite>u:...</cite>, <cite>f:...</cite> might repeated multiple times.</p>
-</li>
-<li><p class="first">Example:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s2">&quot;f:fileadmin/test.pdf&quot;</span> <span class="k">as</span> <span class="nx">_pdf</span><span class="p">,</span>  <span class="s2">&quot;f:fileadmin/test.pdf&quot;</span> <span class="k">as</span> <span class="nx">_file</span><span class="p">,</span>  <span class="s2">&quot;f:fileadmin/test.pdf&quot;</span> <span class="k">as</span> <span class="nx">_zip</span>
-<span class="nx">SELECT</span> <span class="s2">&quot;U:id=export&amp;r=1&quot;</span> <span class="k">as</span> <span class="nx">_pdf</span><span class="p">,</span>  <span class="s2">&quot;U:id=export&amp;r=1&quot;</span> <span class="k">as</span> <span class="nx">_file</span><span class="p">,</span>  <span class="s2">&quot;U:id=export&amp;r=1&quot;</span> <span class="k">as</span> <span class="nx">_zip</span>
-
-<span class="nx">SELECT</span> <span class="s2">&quot;t:Download PDF|f:fileadmin/test.pdf&quot;</span> <span class="k">as</span> <span class="nx">_pdf</span><span class="p">,</span>  <span class="s2">&quot;t:Download PDF|f:fileadmin/test.pdf&quot;</span> <span class="k">as</span> <span class="nx">_file</span><span class="p">,</span>  <span class="s2">&quot;t:Download ZIP|f:fileadmin/test.pdf&quot;</span> <span class="k">as</span> <span class="nx">_zip</span>
-<span class="nx">SELECT</span> <span class="s2">&quot;t:Download PDF|U:id=export&amp;r=1&quot;</span> <span class="k">as</span> <span class="nx">_pdf</span><span class="p">,</span>  <span class="s2">&quot;t:Download PDF|U:id=export&amp;r=1&quot;</span> <span class="k">as</span> <span class="nx">_file</span><span class="p">,</span>  <span class="s2">&quot;t:Download ZIP|U:id=export&amp;r=1&quot;</span> <span class="k">as</span> <span class="nx">_zip</span>
-
-<span class="nx">SELECT</span> <span class="s2">&quot;d:complete.pdf|t:Download PDF|f:fileadmin/test1.pdf|f:fileadmin/test2.pdf&quot;</span> <span class="k">as</span> <span class="nx">_pdf</span><span class="p">,</span> <span class="s2">&quot;d:complete.zip|t:Download ZIP|f:fileadmin/test1.pdf|f:fileadmin/test2.pdf&quot;</span> <span class="k">as</span> <span class="nx">_zip</span>
-
-<span class="nx">SELECT</span> <span class="s2">&quot;d:complete.pdf|t:Download PDF|f:fileadmin/test.pdf|U:id=export&amp;r=1|u:www.w3c.org&quot;</span> <span class="k">AS</span> <span class="nx">_pdf</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</div>
-<div class="section" id="id50">
-<h3>Column: _Pdf | _File | _Zip<a class="headerlink" href="#id50" title="Permalink to this headline">¶</a></h3>
-<p>A limited set of attributes is supported:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s2">&quot;[options]&quot;</span> <span class="k">AS</span> <span class="nx">_Pdf</span><span class="p">,</span> <span class="s2">&quot;[options]&quot;</span> <span class="k">AS</span> <span class="nx">_File</span><span class="p">,</span> <span class="s2">&quot;[options]&quot;</span> <span class="k">AS</span> <span class="nx">_Zip</span>
-
-<span class="nx">with</span><span class="o">:</span> <span class="p">[</span><span class="nx">options</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="o">&lt;</span><span class="nx">exportFilename</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="o">&lt;</span><span class="nx">text</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="o">&lt;</span><span class="mi">1</span><span class="o">:</span> <span class="nx">urlparam</span><span class="o">|</span><span class="nb">file</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span><span class="p">[</span><span class="o">&lt;</span><span class="mi">2</span><span class="o">:</span> <span class="nx">urlparam</span><span class="o">|</span><span class="nb">file</span><span class="o">&gt;</span><span class="p">]</span><span class="o">|</span> <span class="o">...</span> <span class="o">|</span><span class="p">[</span><span class="o">&lt;</span><span class="nx">n</span><span class="o">:</span> <span class="nx">urlparam</span><span class="o">|</span><span class="nb">file</span><span class="o">&gt;</span><span class="p">]</span>
-</pre></div>
-</div>
-<ul>
-<li><p class="first">Parameter are position dependent and therefore without a qualifier!</p>
-</li>
-<li><p class="first"><cite>&lt;urlparam&gt;</cite> or <cite>&lt;file&gt;</cite> might be given.</p>
-</li>
-<li><p class="first">If there is more than one <cite>&lt;urlparam|file&gt;</cite>, only <cite>_Pdf</cite> or <cite>_Zip</cite> is possible.</p>
-</li>
-<li><p class="first">Example:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">SELECT</span> <span class="s2">&quot;||fileadmin/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_File</span><span class="p">,</span> <span class="s2">&quot;||fileadmin/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_Pdf</span><span class="p">,</span> <span class="s2">&quot;||fileadmin/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_Zip</span>
-<span class="nx">SELECT</span> <span class="s2">&quot;output.pdf|Download PDF|fileadmin/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_File</span><span class="p">,</span> <span class="s2">&quot;output.pdf|Download PDF|fileadmin/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_Pdf</span><span class="p">,</span> <span class="s2">&quot;output.zip|Download ZIP|fileadmin/test.pdf&quot;</span> <span class="k">AS</span> <span class="nx">_Zip</span>
-
-<span class="nx">SELECT</span> <span class="s2">&quot;complete.pdf|Download PDF|fileadmin/test1.pdf|fileadmin/test2.pdf|id=export&amp;r=1&quot;</span> <span class="k">AS</span> <span class="nx">_Pdf</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</div>
-<div class="section" id="column-f">
-<h3>Column: _F<a class="headerlink" href="#column-f" title="Permalink to this headline">¶</a></h3>
-<div class="section" id="challenge-1">
-<h4>Challenge 1<a class="headerlink" href="#challenge-1" title="Permalink to this headline">¶</a></h4>
-<p>Due to the limitations of MySQL, reserved column names can&#8217;t be further concatenated. Assume you want to display an image:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># This is valid:</span>
-<span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">concat</span><span class="p">(</span><span class="s2">&quot;/static/directory/&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">foto</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_img</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="k">AS</span> <span class="nx">p</span> <span class="nx">WHERE</span> <span class="o">...</span>
-
-<span class="c1"># Returns:</span>
-<span class="o">&lt;</span><span class="nx">img</span> <span class="nx">src</span><span class="o">=...&gt;</span>
-</pre></div>
-</div>
-<p>Now assume you want to wrap the image in a div tag:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># This is valid:</span>
-<span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;&lt;div&gt;&quot;</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s2">&quot;/static/directory/&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">foto</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_img</span><span class="p">,</span> <span class="s2">&quot;&lt;/div&gt;&quot;</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="k">AS</span> <span class="nx">p</span> <span class="nx">WHERE</span> <span class="o">...</span>
-
-<span class="c1"># Returns:</span>
-<span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;&lt;</span><span class="nx">img</span> <span class="nx">src</span><span class="o">=...&gt;&lt;/</span><span class="nx">div</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-<p>The example above works fine - however, as soon as you want to use <em>field wrappers</em>, things get messy:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># This is valid:</span>
-<span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;&lt;div&gt;&quot;</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s2">&quot;/static/directory/&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">foto</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_img</span><span class="p">,</span> <span class="s2">&quot;&lt;/div&gt;&quot;</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="k">AS</span> <span class="nx">p</span> <span class="nx">WHERE</span> <span class="o">...</span>
-<span class="mf">10.</span><span class="nx">fbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">td</span><span class="o">&gt;</span>
-<span class="mf">10.</span><span class="nx">fend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">td</span><span class="o">&gt;</span>
-
-<span class="c1"># Returns:</span>
-<span class="o">&lt;</span><span class="nx">td</span><span class="o">&gt;&lt;</span><span class="nx">div</span><span class="o">&gt;&lt;/</span><span class="nx">td</span><span class="o">&gt;&lt;</span><span class="nx">td</span><span class="o">&gt;&lt;</span><span class="nx">img</span> <span class="nx">src</span><span class="o">=...&gt;&lt;/</span><span class="nx">td</span><span class="o">&gt;&lt;</span><span class="nx">td</span><span class="o">&gt;&lt;/</span><span class="nx">div</span><span class="o">&gt;&lt;/</span><span class="nx">td</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-<p>To achieve the desired result, one might want to try something like this:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># This is NOT valid:</span>
-<span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s2">&quot;&lt;div&gt;&quot;</span><span class="p">,</span> <span class="nx">concat</span><span class="p">(</span><span class="s2">&quot;/static/directory/&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">foto</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_img</span><span class="p">,</span> <span class="s2">&quot;&lt;/div&gt;&quot;</span><span class="p">)</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="k">AS</span> <span class="nx">p</span> <span class="nx">WHERE</span> <span class="o">...</span>
-<span class="mf">10.</span><span class="nx">fbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">td</span><span class="o">&gt;</span>
-<span class="mf">10.</span><span class="nx">fend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">td</span><span class="o">&gt;</span>
-
-<span class="c1"># Returns a MySQL error because nesting concat() -functions is not allowed</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="challenge-2">
-<h4>Challenge 2<a class="headerlink" href="#challenge-2" title="Permalink to this headline">¶</a></h4>
-<p>Assume you have multiple columns with reserved names in the same query and want to use one of them in a later query:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s2">&quot;/static/directory/&quot;</span><span class="p">,</span> <span class="nx">g</span><span class="o">.</span><span class="nx">picture</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_img</span><span class="p">,</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s2">&quot;/static/preview/&quot;</span><span class="p">,</span> <span class="nx">g</span><span class="o">.</span><span class="nx">thumbnail</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">_img</span> <span class="nx">FROM</span> <span class="nx">gallery</span> <span class="k">AS</span> <span class="nx">g</span> <span class="nx">WHERE</span> <span class="o">...</span>
-
-<span class="mf">20.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;{{10.img}}&quot;</span><span class="p">,</span> <span class="nx">d</span><span class="o">.</span><span class="nx">text</span> <span class="nx">FROM</span> <span class="nx">description</span> <span class="k">AS</span> <span class="nx">d</span> <span class="o">...</span>
-</pre></div>
-</div>
-<p>The example above will fail because there are two img columns which can not be distinguished.</p>
-</div>
-<div class="section" id="solution">
-<h4>Solution<a class="headerlink" href="#solution" title="Permalink to this headline">¶</a></h4>
-<p>The reserved column &#8216;F&#8217;(=Format) can be used to</p>
-<ul class="simple">
-<li>further wrap columns with a reserved name</li>
-<li>assign an arbitrary name to a column built through a reserved name to make it accessible in later queries.</li>
-</ul>
-<p>Solution for <em>#Challenge_1</em>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s2">&quot;Q:img|T:div&quot;</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">wrappedImg</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="k">AS</span> <span class="nx">p</span> <span class="nx">WHERE</span> <span class="o">...</span>
-<span class="mf">10.</span><span class="nx">fbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">td</span><span class="o">&gt;</span>
-<span class="mf">10.</span><span class="nx">fend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">td</span><span class="o">&gt;</span>
-
-<span class="c1"># Returns:</span>
-<span class="o">&lt;</span><span class="nx">td</span><span class="o">&gt;&lt;</span><span class="nx">div</span><span class="o">&gt;&lt;</span><span class="nx">img</span> <span class="nx">src</span><span class="o">=...&gt;&lt;/</span><span class="nx">div</span><span class="o">&gt;&lt;/</span><span class="nx">td</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-<p>Solution for <em>#Challenge_2</em>:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">CONCAT</span><span class="p">(</span><span class="s2">&quot;Q:img|V:mypic&quot;</span><span class="p">)</span> <span class="k">AS</span> <span class="nx">wrappedImg</span> <span class="nx">FROM</span> <span class="nx">person</span> <span class="k">AS</span> <span class="nx">p</span> <span class="nx">WHERE</span> <span class="o">...</span>
-
-<span class="mf">20.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;{{10.mypic}}&quot;</span> <span class="o">...</span>
-</pre></div>
-</div>
-<table border="1" class="docutils">
-<colgroup>
-<col width="15%" />
-<col width="76%" />
-<col width="9%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head"><strong>Parameter</strong></th>
-<th class="head"><strong>Description</strong></th>
-<th class="head">Required</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td>Q</td>
-<td>Any of the <em>reserved column names</em></td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>Z</td>
-<td>Process the column but don&#8217;t display it</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>X</td>
-<td>Strip tags / Remove all tags</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td>T</td>
-<td>Wrap the column with the defined tag. F.e.: T:tdcolspan=&#8221;2&#8221;</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-even"><td>V</td>
-<td>Define an unambiguous variable name for this colum. F.e.: V:someName</td>
-<td>&#160;</td>
-</tr>
-<tr class="row-odd"><td><ul class="first last simple">
-<li></li>
-</ul>
-</td>
-<td>Add all the parameters required for the column defined with Q:</td>
-<td>&#160;</td>
-</tr>
-</tbody>
-</table>
-<p>The above example builds a link to pageB - refer to the <a class="reference internal" href="#column-link"><span class="std std-ref">Column: _link</span></a>-manual for details. The link tells page B to
-render the form with name formname and load the record with id id for editing.</p>
-</div>
-</div>
-</div>
-<div class="section" id="qfq-css-classes">
-<h2>QFQ CSS Classes<a class="headerlink" href="#qfq-css-classes" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li><cite>qfq-table-50</cite>, <cite>qfq-table-80</cite> - release the default width of 100% and specify minwidth=50% resp. 80%.</li>
-<li>Background Color: <cite>qfq-color-grey-1</cite>, <cite>qfq-color-grey-2</cite>  (table, row, cell)</li>
-<li>Table: <cite>table</cite></li>
-<li>Table &gt; hover: <cite>table-hover</cite></li>
-<li>Table &gt; condensed: <cite>table-condensed</cite></li>
-</ul>
-<p>E.g.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">id</span><span class="p">,</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">firstName</span><span class="p">,</span> <span class="o">...</span>
-<span class="mf">10.</span><span class="nx">head</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">table</span> <span class="nx">class</span><span class="o">=</span><span class="s1">&#39;table table-condensed qfq-table-50&#39;</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="id51">
-<h2>Examples<a class="headerlink" href="#id51" title="Permalink to this headline">¶</a></h2>
-<p>The following section gives some examples of typical reports</p>
-<div class="section" id="basic-queries">
-<h3>Basic Queries<a class="headerlink" href="#basic-queries" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>One simple query</li>
-</ul>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;Hello World&quot;</span>
-</pre></div>
-</div>
-<p>Result:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">Hello</span> <span class="nx">World</span>
-</pre></div>
-</div>
-<blockquote>
-<div>Two simple queries</div></blockquote>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;Hello World&quot;</span>
-<span class="mf">20.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;Say hello&quot;</span>
-</pre></div>
-</div>
-<blockquote>
-<div>Result:</div></blockquote>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">Hello</span> <span class="nx">WorldSay</span> <span class="nx">hello</span>
-</pre></div>
-</div>
-<blockquote>
-<div>Two simple queries, with break</div></blockquote>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;Hello World&lt;br /&gt;&quot;</span>
-<span class="mf">20.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="s2">&quot;Say hello&quot;</span>
-</pre></div>
-</div>
-<blockquote>
-<div>Result:</div></blockquote>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">Hello</span> <span class="nx">World</span>
-<span class="nx">Say</span> <span class="nx">hello</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="accessing-the-database">
-<h3>Accessing the database<a class="headerlink" href="#accessing-the-database" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div>Real data, one single column</div></blockquote>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">firstName</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-</pre></div>
-</div>
-<blockquote>
-<div>Result:</div></blockquote>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">BillieElvisLouisDiana</span>
-</pre></div>
-</div>
-<blockquote>
-<div>Real data, two columns</div></blockquote>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">firstName</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">lastName</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-</pre></div>
-</div>
-<blockquote>
-<div>Result:</div></blockquote>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">BillieHolidayElvisPresleyLouisArmstrongDianaRoss</span>
-</pre></div>
-</div>
-<p>The result of the SQL query is an output, row by row and column by column, without adding any formatting information.
-See <a class="reference internal" href="#formatting-examples">Formatting Examples</a> for examples of how the output can be formatted.</p>
-</div>
-<div class="section" id="formatting-examples">
-<h3>Formatting Examples<a class="headerlink" href="#formatting-examples" title="Permalink to this headline">¶</a></h3>
-<p>Formating (i.e. wrapping of data with HTML tags etc.) can be achieved in two different ways:</p>
-<p>One can add formatting output directly into the SQL by either putting it in a separate column of the output or by using
-concat to concatenate data and formatting output in a single column.</p>
-<p>One can use ?level keys to define formatting information that will be put before/after/between all rows/columns of the
-actual levels result.</p>
-<p>Two columns</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># Add the formating information as a coloum</span>
-<span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">firstName</span><span class="p">,</span> <span class="s2">&quot; &quot;</span> <span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">lastName</span><span class="p">,</span> <span class="s2">&quot;&#39;&lt;br /&#39;&gt;&quot;</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-</pre></div>
-</div>
-<p>Result:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">Billie</span> <span class="nx">Holiday</span>
-<span class="nx">Elvis</span> <span class="nx">Presley</span>
-<span class="nx">Louis</span> <span class="nx">Armstrong</span>
-<span class="nx">Diana</span> <span class="nx">Ross</span>
-</pre></div>
-</div>
-<p>One column &#8216;rend&#8217;</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-<span class="mf">10.</span><span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-</pre></div>
-</div>
-<p>Result:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">Billie</span> <span class="nx">Holiday</span>
-<span class="nx">Elvis</span> <span class="nx">Presley</span>
-<span class="nx">Louis</span> <span class="nx">Armstrong</span>
-<span class="nx">Diana</span> <span class="nx">Ross</span>
-</pre></div>
-</div>
-<p>More HTML</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-<span class="mf">10.</span><span class="nx">head</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">ul</span><span class="o">&gt;</span>
-<span class="mf">10.</span><span class="nx">tail</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">ul</span><span class="o">&gt;</span>
-<span class="mf">10.</span><span class="nx">rbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;</span>
-<span class="mf">10.</span><span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">li</span><span class="o">&gt;</span>
-</pre></div>
-</div>
-<p>Result:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">o</span> <span class="nx">Billie</span> <span class="nx">Holiday</span>
-<span class="nx">o</span> <span class="nx">Elvis</span> <span class="nx">Presley</span>
-<span class="nx">o</span> <span class="nx">Louis</span> <span class="nx">Armstrong</span>
-<span class="nx">o</span> <span class="nx">Diana</span> <span class="nx">Ross</span>
-</pre></div>
-</div>
-<p>The same as above, but with braces:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mi">10</span> <span class="p">{</span>
-  <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-  <span class="nx">head</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">ul</span><span class="o">&gt;</span>
-  <span class="nx">tail</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">ul</span><span class="o">&gt;</span>
-  <span class="nx">rbeg</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;</span>
-  <span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;/</span><span class="nx">li</span><span class="o">&gt;</span>
-<span class="p">}</span>
-</pre></div>
-</div>
-<p>Two queries:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-<span class="mf">10.</span><span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-<span class="mf">20.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">a</span><span class="o">.</span><span class="nx">street</span> <span class="nx">FROM</span> <span class="nx">exp_address</span> <span class="k">AS</span> <span class="nx">a</span>
-<span class="mf">20.</span><span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-</pre></div>
-</div>
-<p>Two queries: nested</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># outer query</span>
-<span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-<span class="mf">10.</span><span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-
-<span class="c1"># inner query</span>
-<span class="mf">10.10</span><span class="o">.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">a</span><span class="o">.</span><span class="nx">street</span> <span class="nx">FROM</span> <span class="nx">exp_address</span> <span class="k">AS</span> <span class="nx">a</span>
-<span class="mf">10.10</span><span class="o">.</span><span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-</pre></div>
-</div>
-<ul class="simple">
-<li>For every record of &#8216;10&#8217;, all records of 10.10 will be printed.</li>
-</ul>
-<p>Two queries: nested with variables</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="c1"># outer query</span>
-<span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-<span class="mf">10.</span><span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-
-<span class="c1"># inner query</span>
-<span class="mf">10.10</span><span class="o">.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">a</span><span class="o">.</span><span class="nx">street</span> <span class="nx">FROM</span> <span class="nx">exp_address</span> <span class="k">AS</span> <span class="nx">a</span> <span class="nx">WHERE</span> <span class="nx">a</span><span class="o">.</span><span class="nx">pId</span><span class="o">=</span><span class="s1">&#39;{{10.id}}&#39;</span>
-<span class="mf">10.10</span><span class="o">.</span><span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-</pre></div>
-</div>
-<ul class="simple">
-<li>For every record of &#8216;10&#8217;, all assigned records of 10.10 will be printed.</li>
-</ul>
-<p>Two queries: nested with hidden variables in a table</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mf">10.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span> <span class="k">AS</span> <span class="nx">_pId</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-<span class="mf">10.</span><span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-
-<span class="c1"># inner query</span>
-<span class="mf">10.10</span><span class="o">.</span><span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">a</span><span class="o">.</span><span class="nx">street</span> <span class="nx">FROM</span> <span class="nx">exp_address</span> <span class="k">AS</span> <span class="nx">a</span> <span class="nx">WHERE</span> <span class="nx">a</span><span class="o">.</span><span class="nx">pId</span><span class="o">=</span><span class="s1">&#39;{{10.pId}}&#39;</span>
-<span class="mf">10.10</span><span class="o">.</span><span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-</pre></div>
-</div>
-<p>Same as above, but written in the nested notation</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="mi">10</span> <span class="p">{</span>
-  <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">p</span><span class="o">.</span><span class="nx">id</span> <span class="k">AS</span> <span class="nx">_pId</span><span class="p">,</span> <span class="nx">p</span><span class="o">.</span><span class="nx">name</span> <span class="nx">FROM</span> <span class="nx">exp_person</span> <span class="k">AS</span> <span class="nx">p</span>
-  <span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-
-  <span class="mi">10</span> <span class="p">{</span>
-  <span class="c1"># inner query</span>
-    <span class="nx">sql</span> <span class="o">=</span> <span class="nx">SELECT</span> <span class="nx">a</span><span class="o">.</span><span class="nx">street</span> <span class="nx">FROM</span> <span class="nx">exp_address</span> <span class="k">AS</span> <span class="nx">a</span> <span class="nx">WHERE</span> <span class="nx">a</span><span class="o">.</span><span class="nx">pId</span><span class="o">=</span><span class="s1">&#39;{{10.pId}}&#39;</span>
-    <span class="nx">rend</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nx">br</span> <span class="o">/&gt;</span>
-  <span class="p">}</span>
-<span class="p">}</span>
-</pre></div>
-</div>
-<ul class="simple">
-<li>Columns starting with a &#8216;_&#8217; won&#8217;t be printed but can be accessed as regular columns.</li>
-</ul>
-</div>
-</div>
-</div>
-<div class="section" id="help">
-<h1>Help<a class="headerlink" href="#help" title="Permalink to this headline">¶</a></h1>
-<ul class="simple">
-<li>Does the error happens on every <em>page</em> or only on specific one?</li>
-<li>Does the error happens on every <em>form</em> or only on specific one?</li>
-</ul>
-<p>Tips:</p>
-<ul>
-<li><p class="first">On general errors:</p>
-<blockquote>
-<div><ul class="simple">
-<li>Always check the Javascript console of your browser, see <a class="reference internal" href="#javascriptproblem">javascriptProblem</a>.</li>
-<li>Always check the Webserver logfiles, see <a class="reference internal" href="#webservererrorlog">webserverErrorLog</a>.</li>
-</ul>
-</div></blockquote>
-</li>
-</ul>
-<div class="section" id="error-messages">
-<h2>Error Messages<a class="headerlink" href="#error-messages" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="internal-server-error">
-<h3>Internal Server Error<a class="headerlink" href="#internal-server-error" title="Permalink to this headline">¶</a></h3>
-<p>The browser shows a red popup with &#8216;Internal Server Error&#8217;. The message is generated in the browser. Happens e.g. an AJAX
-request response of QFQ (=Server) is broken. This might happen e.g. if PHP can&#8217;t start successfully or PHP fails to run
-due to  a missing php module or broken configuration.</p>
-</div>
-</div>
-<div class="section" id="javascript-problem">
-<span id="javascriptproblem"></span><h2>Javascript problem<a class="headerlink" href="#javascript-problem" title="Permalink to this headline">¶</a></h2>
-<p>Open the &#8216;Webdeveloper Tools&#8217; (FF: F12, Chrome/Opera: Right mouse click &gt; Inspect Element) in your browser, switch to
-&#8216;console&#8217; and reload the page. Inspect the messages.</p>
-</div>
-<div class="section" id="webserver-error-log">
-<span id="webservererrorlog"></span><h2>Webserver error log<a class="headerlink" href="#webserver-error-log" title="Permalink to this headline">¶</a></h2>
-<p>For apache: /var/log/apache2/error_log</p>
-<div class="section" id="call-to-undefined-function-qfq-mb-internal-encoding">
-<h3>Call to undefined function qfq\mb_internal_encoding()<a class="headerlink" href="#call-to-undefined-function-qfq-mb-internal-encoding" title="Permalink to this headline">¶</a></h3>
-<p>Check that all required php modules are installed. See <a class="reference internal" href="#preparation">preparation</a>.</p>
-</div>
-</div>
-<div class="section" id="qfq-specific">
-<h2>QFQ specific<a class="headerlink" href="#qfq-specific" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="variable-empty">
-<h3>Variable empty: {{...}}<a class="headerlink" href="#variable-empty" title="Permalink to this headline">¶</a></h3>
-<p>Specify the required sanitize class. Remember: for STORE_FORM and STORE_CLIENT the default is <cite>digit</cite>. This means if
-the variable content is a string, this violates the sanitize class and the replaced content will be an empty string!</p>
-</div>
-</div>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-  <h3><a href="Index.html">Table Of Contents</a></h3>
-  <ul>
-<li><a class="reference internal" href="#">General</a></li>
-<li><a class="reference internal" href="#installation">Installation</a><ul>
-<li><a class="reference internal" href="#preparation">Preparation</a><ul>
-<li><a class="reference internal" href="#report-form">Report &amp; Form</a></li>
-<li><a class="reference internal" href="#wkhtmltopdf">wkhtmltopdf</a><ul>
-<li><a class="reference internal" href="#html-to-pdf-conversion">HTML to PDF conversion</a></li>
-<li><a class="reference internal" href="#print">Print</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#setup">Setup</a></li>
-<li><a class="reference internal" href="#formeditor">FormEditor</a></li>
-<li><a class="reference internal" href="#config-qfq-ini">config.qfq.ini</a><ul>
-<li><a class="reference internal" href="#custom-variables">Custom variables</a></li>
-<li><a class="reference internal" href="#variables-add-by-sql">Variables add by SQL</a><ul>
-<li><a class="reference internal" href="#periodid">periodId</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#db-user-privileges">DB USER privileges</a></li>
-<li><a class="reference internal" href="#exception-for-security-get-max-length">Exception for SECURITY_GET_MAX_LENGTH</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#local-documentation">Local Documentation</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#concept">Concept</a><ul>
-<li><a class="reference internal" href="#sips">SIPs</a></li>
-<li><a class="reference internal" href="#access-privileges">Access privileges</a></li>
-<li><a class="reference internal" href="#typo3-qfq-content-element">Typo3 QFQ content element</a><ul>
-<li><a class="reference internal" href="#qfq-keywords-bodytext">QFQ Keywords (Bodytext)</a></li>
-<li><a class="reference internal" href="#debug">Debug</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#databases">Databases</a><ul>
-<li><a class="reference internal" href="#different-qfq-versions-shared-database">Different QFQ versions, shared database</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#variable">Variable</a><ul>
-<li><a class="reference internal" href="#types">Types</a><ul>
-<li><a class="reference internal" href="#store-variables">Store variables</a></li>
-<li><a class="reference internal" href="#sql-variables">SQL variables</a></li>
-<li><a class="reference internal" href="#column-variables">Column variables</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#sanitize-class">Sanitize class</a></li>
-<li><a class="reference internal" href="#escape">Escape</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#security">Security</a><ul>
-<li><a class="reference internal" href="#get-parameter">Get Parameter</a></li>
-<li><a class="reference internal" href="#post-parameter">Post Parameter</a></li>
-<li><a class="reference internal" href="#server">$_SERVER</a></li>
-<li><a class="reference internal" href="#honeypot">Honeypot</a></li>
-<li><a class="reference internal" href="#violation">Violation</a></li>
-<li><a class="reference internal" href="#client-parameter-via-sip">Client Parameter via SIP</a></li>
-<li><a class="reference internal" href="#secure-direct-fileaccess">Secure direct fileaccess</a></li>
-<li><a class="reference internal" href="#file-upload">File upload</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#store">Store</a><ul>
-<li><a class="reference internal" href="#predefined-variable-names">Predefined variable names</a><ul>
-<li><a class="reference internal" href="#store-form-f">Store: <em>FORM</em> - F</a></li>
-<li><a class="reference internal" href="#store-sip-s">Store: <em>SIP</em> - S</a></li>
-<li><a class="reference internal" href="#store-record-r">Store: <em>RECORD</em> - R</a></li>
-<li><a class="reference internal" href="#store-before-b">Store: <em>BEFORE</em> - B</a></li>
-<li><a class="reference internal" href="#store-client-c">Store: <em>CLIENT</em> - C</a></li>
-<li><a class="reference internal" href="#store-typo3-bodytext-t">Store: <em>TYPO3</em> (Bodytext) - T</a></li>
-<li><a class="reference internal" href="#store-vars-v">Store: <em>VARS</em> - V</a></li>
-<li><a class="reference internal" href="#store-ldap-l">Store: <em>LDAP</em> - L</a></li>
-<li><a class="reference internal" href="#store-system-y">Store: <em>SYSTEM</em> - Y</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#ldap">LDAP</a><ul>
-<li><a class="reference internal" href="#typeahead-ta">Typeahead (TA)</a><ul>
-<li><a class="reference internal" href="#pedantic">Pedantic</a></li>
-<li><a class="reference internal" href="#prefetch">Prefetch</a></li>
-<li><a class="reference internal" href="#pertoken">PerToken</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#fill-store-ldap-fsl">Fill STORE LDAP (FSL)</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#form">Form</a><ul>
-<li><a class="reference internal" href="#id18">General</a></li>
-<li><a class="reference internal" href="#record-locking">Record locking</a><ul>
-<li><a class="reference internal" href="#exclusive">Exclusive</a></li>
-<li><a class="reference internal" href="#advisory">Advisory</a></li>
-<li><a class="reference internal" href="#none">None</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#comment-and-space-character">Comment- and space-character</a></li>
-<li><a class="reference internal" href="#definition">Definition</a><ul>
-<li><a class="reference internal" href="#permitnew-permitedit">permitNew &amp; permitEdit</a></li>
-<li><a class="reference internal" href="#required-parameter-new-edit">Required Parameter New|Edit</a></li>
-<li><a class="reference internal" href="#showbutton">showButton</a></li>
-<li><a class="reference internal" href="#forward-save-close">Forward: Save / Close</a><ul>
-<li><a class="reference internal" href="#forward-forwardmode">Forward (=forwardMode)</a></li>
-<li><a class="reference internal" href="#forward-url-page-forwardpage">Forward URL / Page (=forwardPage)</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#example-forwardpage">Example forwardPage</a></li>
-<li><a class="reference internal" href="#type-combined-dynamic-mode-url-page">Type: combined dynamic mode &amp; URL/page</a></li>
-<li><a class="reference internal" href="#parameter">Parameter</a><ul>
-<li><a class="reference internal" href="#submitbuttontext">submitButtonText</a></li>
-<li><a class="reference internal" href="#class">class</a></li>
-<li><a class="reference internal" href="#classpill">classPill</a></li>
-<li><a class="reference internal" href="#classbody">classBody</a></li>
-<li><a class="reference internal" href="#extradeleteform">extraDeleteForm</a></li>
-<li><a class="reference internal" href="#form-mode-global">Form mode global</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#formelements">FormElements</a></li>
-<li><a class="reference internal" href="#class-container">Class: Container</a><ul>
-<li><a class="reference internal" href="#type-fieldset">Type: fieldset</a></li>
-<li><a class="reference internal" href="#type-pill">Type: pill</a></li>
-<li><a class="reference internal" href="#type-templategroup">Type: templateGroup</a><ul>
-<li><a class="reference internal" href="#column-primary-record">Column: primary record</a></li>
-<li><a class="reference internal" href="#column-non-primary-record">Column: non primary record</a><ul>
-<li><a class="reference internal" href="#load">Load</a></li>
-<li><a class="reference internal" href="#insert-update-delete">Insert / Update / Delete</a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#class-native">Class: Native</a><ul>
-<li><a class="reference internal" href="#fe-value">FE: Value</a></li>
-<li><a class="reference internal" href="#fe-report-notation">FE: &#8216;Report&#8217; notation</a></li>
-<li><a class="reference internal" href="#attributes-defined-in-the-parameter-field">Attributes defined in the parameter field</a></li>
-<li><a class="reference internal" href="#effect-matrix">Effect matrix</a><ul>
-<li><a class="reference internal" href="#native-formelements">Native <em>FormElements</em></a><ul>
-<li><a class="reference internal" href="#autofocus">autofocus</a></li>
-<li><a class="reference internal" href="#extrabuttonlock">extraButtonLock</a></li>
-<li><a class="reference internal" href="#extrabuttonpassword">extraButtonPassword</a></li>
-<li><a class="reference internal" href="#extrabuttoninfo">extraButtonInfo</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#type-checkbox">Type: checkbox</a></li>
-<li><a class="reference internal" href="#type-date">Type: date</a></li>
-<li><a class="reference internal" href="#type-datetime">Type: datetime</a></li>
-<li><a class="reference internal" href="#type-extra">Type: extra</a></li>
-<li><a class="reference internal" href="#type-text">Type: text</a><ul>
-<li><a class="reference internal" href="#type-ahead">Type Ahead</a><ul>
-<li><a class="reference internal" href="#configuration-via-form-formelement">Configuration via Form / FormElement</a></li>
-<li><a class="reference internal" href="#sql">SQL</a></li>
-<li><a class="reference internal" href="#id26">LDAP</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#type-editor">Type: editor</a></li>
-<li><a class="reference internal" href="#type-note">Type: note</a></li>
-<li><a class="reference internal" href="#type-password">Type: password</a></li>
-<li><a class="reference internal" href="#type-radio">Type: radio</a></li>
-<li><a class="reference internal" href="#type-select">Type: select</a></li>
-<li><a class="reference internal" href="#type-subrecord">Type: subrecord</a></li>
-<li><a class="reference internal" href="#type-time">Type: time</a></li>
-<li><a class="reference internal" href="#type-upload">Type: upload</a><ul>
-<li><a class="reference internal" href="#deleting-a-record-and-the-referenced-file">Deleting a record and the referenced file</a><ul>
-<li><a class="reference internal" href="#upload-simple-mode">Upload simple mode</a></li>
-<li><a class="reference internal" href="#upload-advanced-mode">Upload advanced mode</a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#class-action">Class: Action</a><ul>
-<li><a class="reference internal" href="#type-before-after">Type: before... | after...</a><ul>
-<li><a class="reference internal" href="#parameter-sqlvalidate">Parameter: sqlValidate</a></li>
-<li><a class="reference internal" href="#parameter-slaveid">Parameter: slaveId</a></li>
-<li><a class="reference internal" href="#parameter-sqlbefore-sqlinsert-sqlupdate-sqldelete-sqlafter">Parameter: sqlBefore / sqlInsert / sqlUpdate / sqlDelete / sqlAfter</a></li>
-<li><a class="reference internal" href="#example">Example</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#type-sendmail">Type: sendmail</a><ul>
-<li><a class="reference internal" href="#type-paste">Type: paste</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#multi-language-form">Multi Language Form</a><ul>
-<li><a class="reference internal" href="#id33">Example</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#dynamic-update">Dynamic Update</a><ul>
-<li><a class="reference internal" href="#examples">Examples</a><ul>
-<li><a class="reference internal" href="#content-of-a-select-list">Content of a select list</a></li>
-<li><a class="reference internal" href="#show-hide-a-formelement">Show / Hide a <em>FormElement</em></a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#form-layout">Form Layout</a><ul>
-<li><a class="reference internal" href="#custom-field-width">Custom field width</a></li>
-<li><a class="reference internal" href="#multiple-elements-per-row">Multiple Elements per row</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#copy-form">Copy Form</a><ul>
-<li><a class="reference internal" href="#id37">Concept</a></li>
-<li><a class="reference internal" href="#table-self-referencing-records">Table self referencing records</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#delete-record">Delete Record</a></li>
-<li><a class="reference internal" href="#locking-record-form">Locking Record / Form</a></li>
-<li><a class="reference internal" href="#best-practice">Best practice</a><ul>
-<li><a class="reference internal" href="#custom-default-value-only-for-new-records">Custom default value only for &#8216;new records&#8217;</a></li>
-<li><a class="reference internal" href="#central-configured-values">Central configured values</a></li>
-<li><a class="reference internal" href="#debug-report">Debug Report</a></li>
-<li><a class="reference internal" href="#more-detailed-error-messages">More detailed error messages</a></li>
-<li><a class="reference internal" href="#person-search-form">Person search form</a></li>
-<li><a class="reference internal" href="#form-compute-next-free-ord-automatically">Form: compute next free &#8216;ord&#8217; automatically</a><ul>
-<li><a class="reference internal" href="#version-1">Version 1</a></li>
-<li><a class="reference internal" href="#version-2">Version 2</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#form-person-wizard-firstname-city">Form: Person Wizard - firstname, city</a></li>
-<li><a class="reference internal" href="#form-person-wizard-firstname-single-note">Form: Person Wizard - firstname, single note</a></li>
-<li><a class="reference internal" href="#icons-template-group">Icons Template Group</a></li>
-<li><a class="reference internal" href="#chart">Chart</a></li>
-<li><a class="reference internal" href="#upload-form-simple">Upload Form Simple</a></li>
-<li><a class="reference internal" href="#upload-form-advanced-1">Upload Form Advanced 1</a></li>
-<li><a class="reference internal" href="#upload-form-advanced-2">Upload Form Advanced 2</a></li>
-<li><a class="reference internal" href="#typeahead-sql">Typeahead: SQL</a></li>
-<li><a class="reference internal" href="#typeahead-ldap-with-additional-values">Typeahead: LDAP with additional values</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#faq">FAQ</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#report">Report</a><ul>
-<li><a class="reference internal" href="#qfq-content-element">QFQ content element</a></li>
-<li><a class="reference internal" href="#id40">General</a><ul>
-<li><a class="reference internal" href="#a-simple-example">A simple example</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#syntax-of-report">Syntax of <cite>report</cite></a></li>
-<li><a class="reference internal" href="#debug-the-bodytext">Debug the bodytext</a></li>
-<li><a class="reference internal" href="#structure">Structure</a><ul>
-<li><a class="reference internal" href="#text-across-several-lines">Text across several lines</a></li>
-<li><a class="reference internal" href="#nesting-of-levels">Nesting of levels</a></li>
-<li><a class="reference internal" href="#access-column-values">Access column values</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#wrapping-rows-and-columns-level-keys">Wrapping rows and columns: Level keys</a></li>
-<li><a class="reference internal" href="#processing-of-columns-in-the-sql-result">Processing of columns in the SQL result</a></li>
-<li><a class="reference internal" href="#special-column-names">Special column names</a><ul>
-<li><a class="reference internal" href="#column-link">Column: _link</a></li>
-<li><a class="reference internal" href="#render-mode">Render mode</a></li>
-<li><a class="reference internal" href="#link-examples">Link Examples</a></li>
-<li><a class="reference internal" href="#question">Question</a></li>
-<li><a class="reference internal" href="#download">Download</a><ul>
-<li><a class="reference internal" href="#parameter-and-element-sources">Parameter and (element) sources</a></li>
-<li><a class="reference internal" href="#export-area">Export area</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#columns-page-x">Columns: _page[X]</a></li>
-<li><a class="reference internal" href="#column-paged">Column: _paged</a><ul>
-<li><a class="reference internal" href="#mode-table">Mode: table</a></li>
-<li><a class="reference internal" href="#mode-form">Mode: form</a></li>
-<li><a class="reference internal" href="#id47">Examples:</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#id48">Columns: _Page[X]</a></li>
-<li><a class="reference internal" href="#id49">Column: _Paged</a></li>
-<li><a class="reference internal" href="#column-vertical">Column: _vertical</a></li>
-<li><a class="reference internal" href="#column-mailto">Column: _mailto</a></li>
-<li><a class="reference internal" href="#column-sendmail">Column: _sendmail</a></li>
-<li><a class="reference internal" href="#column-img">Column: _img</a></li>
-<li><a class="reference internal" href="#column-exec">Column: _exec</a></li>
-<li><a class="reference internal" href="#column-pdf-file-zip">Column: _pdf | _file | _zip</a></li>
-<li><a class="reference internal" href="#id50">Column: _Pdf | _File | _Zip</a></li>
-<li><a class="reference internal" href="#column-f">Column: _F</a><ul>
-<li><a class="reference internal" href="#challenge-1">Challenge 1</a></li>
-<li><a class="reference internal" href="#challenge-2">Challenge 2</a></li>
-<li><a class="reference internal" href="#solution">Solution</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#qfq-css-classes">QFQ CSS Classes</a></li>
-<li><a class="reference internal" href="#id51">Examples</a><ul>
-<li><a class="reference internal" href="#basic-queries">Basic Queries</a></li>
-<li><a class="reference internal" href="#accessing-the-database">Accessing the database</a></li>
-<li><a class="reference internal" href="#formatting-examples">Formatting Examples</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#help">Help</a><ul>
-<li><a class="reference internal" href="#error-messages">Error Messages</a><ul>
-<li><a class="reference internal" href="#internal-server-error">Internal Server Error</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#javascript-problem">Javascript problem</a></li>
-<li><a class="reference internal" href="#webserver-error-log">Webserver error log</a><ul>
-<li><a class="reference internal" href="#call-to-undefined-function-qfq-mb-internal-encoding">Call to undefined function qfq\mb_internal_encoding()</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#qfq-specific">QFQ specific</a><ul>
-<li><a class="reference internal" href="#variable-empty">Variable empty: {{...}}</a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-
-  <h4>Previous topic</h4>
-  <p class="topless"><a href="Index.html"
-                        title="previous chapter">QFQ Extension</a></p>
-  <h4>Next topic</h4>
-  <p class="topless"><a href="Release.html"
-                        title="next chapter">Release</a></p>
-  <div role="note" aria-label="source link">
-    <h3>This Page</h3>
-    <ul class="this-page-menu">
-      <li><a href="_sources/Manual.rst.txt"
-            rel="nofollow">Show Source</a></li>
-    </ul>
-   </div>
-<div id="searchbox" style="display: none" role="search">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <div><input type="text" name="q" /></div>
-      <div><input type="submit" value="Go" /></div>
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="Release.html" title="Release"
-             >next</a> |</li>
-        <li class="right" >
-          <a href="Index.html" title="QFQ Extension"
-             >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &#169; Copyright 2017, Carsten Rose.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.5.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/extension/Documentation/html/OnlineRecuitingTool.html b/extension/Documentation/html/OnlineRecuitingTool.html
deleted file mode 100644
index 4820fc790..000000000
--- a/extension/Documentation/html/OnlineRecuitingTool.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Online Recruiting Tool &#8212; QFQ Extension 0.25.0 documentation</title>
-    
-    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    './',
-        VERSION:     '0.25.0',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true,
-        SOURCELINK_SUFFIX: '.txt'
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="index" title="Index" href="genindex.html" />
-    <link rel="search" title="Search" href="search.html" /> 
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-  <div class="section" id="online-recruiting-tool">
-<span id="onlinerecruitingtool"></span><h1>Online Recruiting Tool<a class="headerlink" href="#online-recruiting-tool" title="Permalink to this headline">¶</a></h1>
-<p>The ORT will show a typical QFQ application with some best practices tips.</p>
-<p>Play the SQL file &#8216;onlineRecruitingTool.sql&#8217; on a fresh installation. Otherwise some <cite>Form</cite> and <cite>FormElement</cite> id&#8217;s might be
-used and playing the file will fail.</p>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-  <div role="note" aria-label="source link">
-    <h3>This Page</h3>
-    <ul class="this-page-menu">
-      <li><a href="_sources/OnlineRecuitingTool.rst.txt"
-            rel="nofollow">Show Source</a></li>
-    </ul>
-   </div>
-<div id="searchbox" style="display: none" role="search">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <div><input type="text" name="q" /></div>
-      <div><input type="submit" value="Go" /></div>
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &#169; Copyright 2017, Carsten Rose.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.5.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/extension/Documentation/html/README.html b/extension/Documentation/html/README.html
deleted file mode 100644
index b6b1ac39b..000000000
--- a/extension/Documentation/html/README.html
+++ /dev/null
@@ -1,113 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>TYPO3 Documentation Starter “Public Info” &#8212; QFQ Extension 0.25.0 documentation</title>
-    
-    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    './',
-        VERSION:     '0.25.0',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true,
-        SOURCELINK_SUFFIX: '.txt'
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="index" title="Index" href="genindex.html" />
-    <link rel="search" title="Search" href="search.html" />
-    <link rel="prev" title="Links" href="Links.html" /> 
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="Links.html" title="Links"
-             accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-  <div class="section" id="typo3-documentation-starter-public-info">
-<h1>TYPO3 Documentation Starter &#8220;Public Info&#8221;<a class="headerlink" href="#typo3-documentation-starter-public-info" title="Permalink to this headline">¶</a></h1>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Repository:</th><td class="field-body"><a class="reference external" href="https://github.com/T3DocumentationStarter/Public-Info-053">https://github.com/T3DocumentationStarter/Public-Info-053</a></td>
-</tr>
-<tr class="field-even field"><th class="field-name">Published at:</th><td class="field-body"><a class="reference external" href="https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/">https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/</a></td>
-</tr>
-<tr class="field-odd field"><th class="field-name">Writing here:</th><td class="field-body">Carsten Rose</td>
-</tr>
-</tbody>
-</table>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-  <h4>Previous topic</h4>
-  <p class="topless"><a href="Links.html"
-                        title="previous chapter">Links</a></p>
-  <div role="note" aria-label="source link">
-    <h3>This Page</h3>
-    <ul class="this-page-menu">
-      <li><a href="_sources/README.rst.txt"
-            rel="nofollow">Show Source</a></li>
-    </ul>
-   </div>
-<div id="searchbox" style="display: none" role="search">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <div><input type="text" name="q" /></div>
-      <div><input type="submit" value="Go" /></div>
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="Links.html" title="Links"
-             >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &#169; Copyright 2017, Carsten Rose.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.5.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/extension/Documentation/html/Release.html b/extension/Documentation/html/Release.html
deleted file mode 100644
index b41b8d0bc..000000000
--- a/extension/Documentation/html/Release.html
+++ /dev/null
@@ -1,1384 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Release &#8212; QFQ Extension 0.25.0 documentation</title>
-    
-    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    './',
-        VERSION:     '0.25.0',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true,
-        SOURCELINK_SUFFIX: '.txt'
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="index" title="Index" href="genindex.html" />
-    <link rel="search" title="Search" href="search.html" />
-    <link rel="next" title="Links" href="Links.html" />
-    <link rel="prev" title="General" href="Manual.html" /> 
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="Links.html" title="Links"
-             accesskey="N">next</a> |</li>
-        <li class="right" >
-          <a href="Manual.html" title="General"
-             accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-  <div class="section" id="release">
-<span id="id1"></span><h1>Release<a class="headerlink" href="#release" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="version-0-future">
-<h2>Version 0.future<a class="headerlink" href="#version-0-future" title="Permalink to this headline">¶</a></h2>
-<p>Date: &lt;date&gt;</p>
-<div class="section" id="notes">
-<h3>Notes<a class="headerlink" href="#notes" title="Permalink to this headline">¶</a></h3>
-</div>
-<div class="section" id="features">
-<h3>Features<a class="headerlink" href="#features" title="Permalink to this headline">¶</a></h3>
-</div>
-<div class="section" id="bug-fixes">
-<h3>Bug Fixes<a class="headerlink" href="#bug-fixes" title="Permalink to this headline">¶</a></h3>
-</div>
-</div>
-<div class="section" id="version-0-25-0">
-<h2>Version 0.25.0<a class="headerlink" href="#version-0-25-0" title="Permalink to this headline">¶</a></h2>
-<p>Date: 10.10.2017</p>
-<div class="section" id="id2">
-<h3>Notes<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>The config.qfq.ini directives DB_USER, DB_NAME, DB_HOST, DB_PASSWORD are replaced by DB_1_USER, DB_1_NAME, DB_1_HOST,
-DB_1_PASSWORD. The old directives are still used, as long as the new directives does not exist.</li>
-<li>New config.qfq.ini directives: DB_INDEX_DATA, DB_INDEX_QFQ</li>
-</ul>
-</div>
-<div class="section" id="id3">
-<h3>Features<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4720 - Separate database handles for QFQ &#8216;form&#8217; and QFQ &#8216;data&#8217; - &#8216;Form&#8217; might  now load/save from forign database/host/user.</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-24-0">
-<h2>Version 0.24.0<a class="headerlink" href="#version-0-24-0" title="Permalink to this headline">¶</a></h2>
-<p>Date: 09.10.2017</p>
-<div class="section" id="id4">
-<h3>Notes<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Change Remove SYSTEM_SECURITY_ABSOLUTE_GET_MAX_LENGTH - makes no sense to hardcode an upper limit.</li>
-</ul>
-</div>
-<div class="section" id="id5">
-<h3>Features<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Feature Manual.rst: Doc updated for latest subrecord column special names</li>
-<li>Feature AbstractBuildForm.php: new function subrecordHead(). Replaced several hard coded subrecord column names against constants.</li>
-<li>Feature #4456 / formModeGlobal=requiredOff - update Manual.rst</li>
-<li>Feature #4606 / _link: qualifier to render bootstrap button - fix unit tests for tooltip. Add tooltip to button/text, even if there is no link. Implement token  &#8216;b:...&#8217; for link class. Manual is updated. Open: <cite>pageX</cite> should be recoded to use the new &#8216;b:&#8217; instead of hardcoed behaviour to render a button.</li>
-<li>Feature: Upload Button - wrapped with Bootstrap Button. New option &#8216;fileButtonText&#8217; to specify a button text.</li>
-<li>Feature #3752 / Pills auf mode|modeSql=hidden|readonly setzen - implemented during &#8216;form load&#8217; (not dynamic update)</li>
-<li>Feature: Neu wird nach dem Speichern das Formular nochmal komplett geladen. Das ist wichtig um die durch aftersave geaenderten Records in die Formularelemente zu bekommen.</li>
-<li>Feature #4511 / Form: URL Forward - mode dynamic computed - more generic implementation.</li>
-</ul>
-</div>
-<div class="section" id="id6">
-<h3>Bug Fixes<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Bug #4731 / Dynamic Update: load(post) triggers &#8216;check required&#8217; - makes no sense during filling a form - fixed</li>
-<li>Bug #4730 / InvalidDate-00-00-2000 FE.type=date - detection of empty date was broken for &#8216;00.00.0000&#8217;.</li>
-<li>Bug Fixed problem in subrecord when no record is selected.</li>
-<li>Bug #4620 / Easy Fix: saveButtonText / closeButtonText Formatierung</li>
-</ul>
-</div>
-</div>
-</div>
-<div class="section" id="id7">
-<h1>Release<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="version-0-23-1">
-<h2>Version 0.23.1<a class="headerlink" href="#version-0-23-1" title="Permalink to this headline">¶</a></h2>
-<p>Date: 23.9.2017</p>
-<div class="section" id="id8">
-<h3>Bug Fixes<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4620 / Easy Fix: saveButtonText / closeButtonText Formatierung</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-23-0">
-<h2>Version 0.23.0<a class="headerlink" href="#version-0-23-0" title="Permalink to this headline">¶</a></h2>
-<p>Date: 17.09.2017</p>
-<div class="section" id="id9">
-<h3>Features<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#3752 / Pills auf mode|modeSql=hidden|readonly setzen - implemented during &#8216;form load&#8217; (not dynamic update)</li>
-</ul>
-</div>
-<div class="section" id="id10">
-<h3>Bug Fixes<a class="headerlink" href="#id10" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4548 /Template Group: &#8216;form-update&#8217; broken - Broken Redirect after Save - Broken same HTML ID for FE copies in a template group.</li>
-<li>#4548 /Template Group: &#8216;form-update&#8217; broken - max tg element value/index shown after save instead of last user supplied value, but save is ok. Neu wird nach dem Speichern das Formular nochmal komplett geladen. Das ist wichtig um die durch aftersave geaenderten Records in die Formularelemente zu bekommen.</li>
-</ul>
-</div>
-</div>
-</div>
-<div class="section" id="id11">
-<h1>Release<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="version-0-22">
-<h2>Version 0.22<a class="headerlink" href="#version-0-22" title="Permalink to this headline">¶</a></h2>
-<p>Date: 14.09.2017</p>
-<div class="section" id="id12">
-<h3>Notes<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Form Editor: element &#8216;forwardPage&#8217; is static again (no dynamic update) - see features in #4511.</li>
-</ul>
-</div>
-<div class="section" id="id13">
-<h3>Features<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4511 / Form: URL Forward - mode dynamic computed</li>
-</ul>
-</div>
-<div class="section" id="id14">
-<h3>Bug Fixes<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4512 | SIP URL does not respect anker token &#8216;#&#8217;- fixed PLUS: L and type _GET Params included in links which contain a SIP (regular links still open).</li>
-<li>#4508 / Form: during Save with FE with &#8216;report&#8217;-Note/Values an exception is thrown - report does not expect, to be called without typo3 - but this is the case during save and generating the JSON.</li>
-<li>#4021 / &#8220;required&#8221; asterik does not handle multi column labels correctly</li>
-<li>#4423 / Date inputs with readonly: label is grey.</li>
-<li>Empty date might create &#8216;2001-00-00&#8217;</li>
-<li>#4504 / Upload Button: required asterik missing after save - seems to be a problem for every element - should be fixed now.</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-21-0">
-<h2>Version 0.21.0<a class="headerlink" href="#version-0-21-0" title="Permalink to this headline">¶</a></h2>
-<p>Date: 10.09.2017</p>
-<div class="section" id="id15">
-<h3>Notes<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>The Form-Editor now has two &#8216;requiredParamter&#8217; fields: one for &#8216;New&#8217; record and one &#8216;Edit&#8217;. Existing settings will be
-automatically copied to both.</li>
-<li>The FormElement-Editor field &#8216;Note&#8217; is not anymore a TinyMCE Editor. Instead a regular &#8216;textarea&#8217; is used. Main reason
-are incompatibilities between TinyMCE HTML mode and the neede CR/LF linebreaks needed for &#8216;Report&#8217; Syntax in the &#8216;note&#8217;
-column.</li>
-</ul>
-</div>
-<div class="section" id="id16">
-<h3>Features<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4431 / FE.type=note: QFQ Report Syntax in &#8216;FE.value&#8217; and &#8216;FE.note&#8217;</li>
-<li>#4456 / formModeGlobal=requiredOff - Switches FormElement.mode=required to &#8216;show&#8217; for all FE of the current Form.</li>
-<li>Feature #4356 / Form: required parameter - split between &#8216;New&#8217; &amp; &#8216;Edit&#8217;</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-20-0">
-<h2>Version 0.20.0<a class="headerlink" href="#version-0-20-0" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="changes">
-<h3>Changes<a class="headerlink" href="#changes" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>New configuration value EXTRA_BUTTON_INFO_POSITION in config.qfq.ini</li>
-</ul>
-</div>
-<div class="section" id="id17">
-<h3>Features<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4386 Fuer GRC: Optional Info Button bei &#8216;input&#8217; wie bei &#8216;textarea&#8217; - EXTRA_BUTTON_INFO_POSITION=below</li>
-<li>#4429 / subrecord: new FE parameter &#8216;subrecordTableCass&#8217; - a custom class for the subrecord table might be specified.</li>
-<li>#4428 / subrecord: mode=readonly</li>
-<li>#4421 / subrecord: column of the sql1 row should go into the edit link - implemented</li>
-<li>#4399 / Do not render &#8216;_pdf&#8217; when r:5 or empty string</li>
-</ul>
-</div>
-<div class="section" id="id18">
-<h3>Bug Fixes<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4396 / FE: Justify DATE and TIME in case it&#8217;s DATETIME on a non primary table.</li>
-<li>#2414 / Deaktivieren von Option &#8216;new&#8217; bei subrecord hat keine Folge</li>
-<li>#4426 / Subrecord: mode=hidden - still shown</li>
-<li>#4425/ Subrecords: Table head is not wrapped in &lt;thead&gt;</li>
-<li>#4331 / SQL Statement &#8216;REPLACE&#8217; not fired - Keyword missing in list of SQL Keywords</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-19-7">
-<h2>Version 0.19.7<a class="headerlink" href="#version-0-19-7" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id19">
-<h3>Changes<a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4306 / Update Text Subrecord: Please save this record first</li>
-</ul>
-</div>
-<div class="section" id="id20">
-<h3>Features<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h3>
-</div>
-<div class="section" id="id21">
-<h3>Bug Fixes<a class="headerlink" href="#id21" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4278 / Language: Check that language settings are respectet inside of container / pill / fieldset / templateGroup.</li>
-<li>#4310 / Fixed error where custom values wouldn&#8217;t be saved, nor not found for non pedantic.</li>
-<li>#4311 / Record Lock: expired lock wird nicht geloescht bei form reload.</li>
-<li>#4309 / typeahead: allow free entry</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-19-6">
-<h2>Version 0.19.6<a class="headerlink" href="#version-0-19-6" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id22">
-<h3>Features<a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4299 / HTML Element &#8216;Select&#8217;: Placeholder</li>
-<li>Changes to the alert generation and added btn-group for multiple buttons.</li>
-<li>Should only show reload button and be modal when the conflict is mandatory.</li>
-<li>#4144 / Close/New: bei acquireLock=false anschliessend keine Nachfrage ob gespeichert werden soll</li>
-<li>#4120 / Removed Timeout from Dirty Alert Message</li>
-<li>#4283 / FE.parameter=emptyMeansNull</li>
-</ul>
-</div>
-<div class="section" id="id23">
-<h3>Bug Fixes<a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4281 Prevent save from being clicked multiple times. Save no turns orange when saving.</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-19-5">
-<h2>Version 0.19.5<a class="headerlink" href="#version-0-19-5" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id24">
-<h3>Features<a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#3790 / Multilanguage: German/ English/ ...</li>
-</ul>
-</div>
-<div class="section" id="id25">
-<h3>Bug Fixes<a class="headerlink" href="#id25" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4274 / ItemList: escape &#8216;,&#8217; &#8216;:&#8217;</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-19-4">
-<h2>Version 0.19.4<a class="headerlink" href="#version-0-19-4" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id26">
-<h3>Features<a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Feature: Form Paste Records - skip columns during copy if they do not exist on the source side.</li>
-</ul>
-</div>
-<div class="section" id="id27">
-<h3>Bug Fixes<a class="headerlink" href="#id27" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4266 / FormElement Type=Editor: value not saved - fixed</li>
-<li>#4253 / Record Lock not deleted, when window closes without save.</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-19-3">
-<h2>Version 0.19.3<a class="headerlink" href="#version-0-19-3" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id28">
-<h3>Changes<a class="headerlink" href="#id28" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Changing buttons for the dirty Events depending on status</li>
-</ul>
-</div>
-<div class="section" id="id29">
-<h3>Bug Fixes<a class="headerlink" href="#id29" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4257 / Dynamic update broken - after changing JSON data structure, update load.php has been missed.</li>
-</ul>
-</div>
-<div class="section" id="open">
-<h3>Open<a class="headerlink" href="#open" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4253 / Record Lock not deleted when window closes without save</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-19-2">
-<h2>Version 0.19.2<a class="headerlink" href="#version-0-19-2" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id30">
-<h3>Features<a class="headerlink" href="#id30" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#4250 / autocron: sending mails</li>
-<li>#4248 / FormElement: TypeAhead fuer den Spaltennamen - Implemented</li>
-<li>#4144 / Close/New: bei acquireLock=false anschliessend keine Nachfrage ob gespeichert werden soll</li>
-<li>#4120: Removed Timeout from Dirty Alert Message</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-19-1">
-<h2>Version 0.19.1<a class="headerlink" href="#version-0-19-1" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id31">
-<h3>Features<a class="headerlink" href="#id31" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>#4172 /record locking: Bob tries to delete a record and get &#8216;status=error&#8217;: Client should disable &#8216;delete&#8217; button</li>
-<li>#4185 / Detect modified record</li>
-<li>#4143 / New alert removes old alert(s)</li>
-<li>#4173 / Form: User open&#8217;s a new tab and press close - alert to inform user that he has to close the tab</li>
-<li>#1930, #3980 /  Client: Bei Form Submit den Status &#8216;submit_reason=save|save,close&#8217; mitsenden</li>
-<li>Implemented: New &gt; Close (save) now closes correctly the current page. Addtional, #1930 has been solved implizit.</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id32">
-<h3>Bug Fixes<a class="headerlink" href="#id32" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>Bug #4174 / record locking: error message if delete fails due to record locking</li>
-<li>Bug: SQL &#8216;CREATE&#8217; implemented as a valid command.</li>
-</ul>
-</div></blockquote>
-</div>
-</div>
-<div class="section" id="version-0-19-0">
-<h2>Version 0.19.0<a class="headerlink" href="#version-0-19-0" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id33">
-<h3>Changes<a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>bower.json: change bootstrap version number from micro to minor.</li>
-<li>Sip.php: Guarantee that uniqid() is unique at least for the current user.</li>
-<li>Makefile: change installation of phpDocumentor to &#8211;alldeps and remove &#8216;phpdoc/&#8217;.</li>
-</ul>
-</div>
-<div class="section" id="id34">
-<h3>Features<a class="headerlink" href="#id34" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#3881 / Variables: Ex &#8216;keySemId&#8217;, New &#8216;periodId&#8217; (System Store)</li>
-<li>AbstractBuildForm.php: if a datetime / timestamp has the string &#8216;CURRENT_TIMESTAMP&#8217; it will be replaced by the current date/time.</li>
-<li>Add new STORE_TYPO3 vars: pageAlias, pageTitle</li>
-<li>Config.php: cleanup of checking GET variables.</li>
-<li>#3981 / Record Locking</li>
-<li>Manual.rst: add documentation for record locking</li>
-<li>Manual.rst: more details about QFQ variables.</li>
-<li>plantuml: sequence diagrams for record locking</li>
-</ul>
-</div>
-<div class="section" id="id35">
-<h3>Bug Fixes<a class="headerlink" href="#id35" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Bug #4158 / Delete Button im Form fehlen die SIP Parameter.</li>
-<li>Bug #4159 / missing htmlspecialchar_decode() for FE.value supplied content.</li>
-<li>Bug Makefile: fixed unwanted removing of whole &#8216;doc&#8217; by &#8216;maintainer-clean&#8217; - doc nowadays contains QFQ related manually created documentation.</li>
-<li>Bug typeahead.php: An exception catched in typeahead.php has been assigned as array element, instead of a whole array. Fixed.</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-18-7">
-<h2>Version 0.18.7<a class="headerlink" href="#version-0-18-7" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id36">
-<h3>Changes<a class="headerlink" href="#id36" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Makefile: &#8216;make bootstrap&#8217; udpates all JS Lib packages. Double npm install removed.</li>
-</ul>
-</div>
-<div class="section" id="id37">
-<h3>Features<a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#3947 / Attack detectect: logout current user (only QFQ, FE User still logged in).</li>
-<li>#3959 / Class _link: implement &#8216;any&#8217; Bootstrap glyphicons. New token &#8216;G:&#8217; for &#8216;_link&#8217;.</li>
-</ul>
-</div>
-<div class="section" id="id38">
-<h3>Bug Fixes<a class="headerlink" href="#id38" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#3953 / Radio buttons: Auswahl nicht angezeigt, wenn per itemList definiert</li>
-<li>Feature #3982 / Filename Sanatize: remove spaces. Filename not properbly enclosed by double ticks.</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-18-6">
-<h2>Version 0.18.6<a class="headerlink" href="#version-0-18-6" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id39">
-<h3>Features<a class="headerlink" href="#id39" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Feature #3460 / Report: new column types &#8216;_striptags, &#8216;_htmlentities&#8217;, &#8216;_+Tag&#8217;</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-18-5">
-<h2>Version 0.18.5<a class="headerlink" href="#version-0-18-5" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id40">
-<h3>Features<a class="headerlink" href="#id40" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>QuickFormQuery.php: added function to check if there are copyForm paste records</li>
-<li>Manual.rst, formEditor.sql: add several links in Form &#8216;FormEditor&#8217; to the online documentation. The FormEditor now
-contains links to the Online Documentation. Add missing explanations: Required Parameter, Forward.</li>
-</ul>
-</div>
-<div class="section" id="id41">
-<h3>Bug Fixes<a class="headerlink" href="#id41" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Bug #3912 / templateGroup: max. 5 instances are saved.</li>
-<li>Manual.rst: Fixed missing &#8216;{{&#8216; and &#8216;%&#8217; in examples.</li>
-<li>Bug #3925 / templateGroup / non primary / delete records: only one at a time</li>
-<li>Makefile: Artifactory builds fails at chromedriver - temporary remove npm install of chromedriver</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-18-4">
-<h2>Version 0.18.4<a class="headerlink" href="#version-0-18-4" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id42">
-<h3>Bug Fixes<a class="headerlink" href="#id42" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Bug #3910 / &#8216;submitButtonText&#8217; not shown</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-18-3b">
-<h2>Version 0.18.3b<a class="headerlink" href="#version-0-18-3b" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id43">
-<h3>Features<a class="headerlink" href="#id43" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Feature #3906 / Mark required inputs with an asterik</li>
-</ul>
-</div>
-<div class="section" id="id44">
-<h3>Bug Fixes<a class="headerlink" href="#id44" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Bug #3903 / Copy/Paste form: references inside a record are not updated at all</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-18-3a">
-<h2>Version 0.18.3a<a class="headerlink" href="#version-0-18-3a" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id45">
-<h3>Changes<a class="headerlink" href="#id45" title="Permalink to this headline">¶</a></h3>
-<ul>
-<li><p class="first">Copy / Paste form: take care that there is now Form.id=3. This is now the reserved formId for the &#8216;copyForm&#8217;.</p>
-<blockquote>
-<div><p>UPDATE <cite>FormElement</cite> SET formId=100 WHERE formId=3
-UPDATE <cite>Form</cite> SET <cite>id</cite> = &#8216;100&#8217; WHERE <cite>Form</cite>.`id` = 3;</p>
-</div></blockquote>
-</li>
-</ul>
-</div>
-<div class="section" id="id46">
-<h3>Bug Fixes<a class="headerlink" href="#id46" title="Permalink to this headline">¶</a></h3>
-</div>
-</div>
-<div class="section" id="version-0-18-3">
-<h2>Version 0.18.3<a class="headerlink" href="#version-0-18-3" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id47">
-<h3>Features<a class="headerlink" href="#id47" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#3899 / Copy/Paste<ul>
-<li>DatabaseUpdate.php: New table Clipboard, New FE.type=&#8217;paste&#8217;, New Form.forwardMode=&#8217;url-sip&#8217; - will be applied for 0.18.3.</li>
-<li>Store.php: New member in STORE_CLIENT &#8216;CLIENT_COOKIE_QFQ&#8217; - might be used to identify current user.</li>
-<li>formEditor.sql: New form &#8216;copyForm&#8217;. New table &#8216;Clipboard&#8217;</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-18-2">
-<h2>Version 0.18.2<a class="headerlink" href="#version-0-18-2" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id48">
-<h3>Changes<a class="headerlink" href="#id48" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Feature #3891 / Dynamic Update: Multiple Elements in a row - single show/hide - First implementation: Show / Hide via dynamicUpdate for a second element, wrapped in an own &#8216;col-md&#8217; div.</li>
-</ul>
-</div>
-<div class="section" id="id49">
-<h3>Bug Fixes<a class="headerlink" href="#id49" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Bug #3875 / FormElement &#8216;extra&#8217;: Fehler bei neuen Records.</li>
-<li>Bug #3647 / Dynamic Update: Multiple Elements in a row not updated properly.</li>
-<li>Bug #3890 / upload-FormElement: mode &#8216;hide&#8217; without effect</li>
-<li>Bug #3876 / upload-FormElement: verschwindet bei dynamicUpdate.</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-18-1">
-<h2>Version 0.18.1<a class="headerlink" href="#version-0-18-1" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li>Update unit tests</li>
-</ul>
-</div>
-<div class="section" id="version-0-18-0">
-<h2>Version 0.18.0<a class="headerlink" href="#version-0-18-0" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id50">
-<h3>Changes<a class="headerlink" href="#id50" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>New defaults to FormElement.type=`file` (=Upload).</li>
-</ul>
-<blockquote>
-<div><ul class="simple">
-<li><cite>access</cite> = <cite>application/pdf</cite></li>
-<li><cite>maxFileSize</cite> = <cite>10485760</cite> (10MB)</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id51">
-<h3>Features<a class="headerlink" href="#id51" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Make the image shown for ExtraButtonInfo configureable. Manual.rst: added documentation for new config.qfq.ini
-variables GFX_EXTRA_BUTTON_INFO_INLINE, GFX_EXTRA_BUTTON_INFO_BELOW.</li>
-<li>Manual.rst: description added for <cite>extraButtonLock</cite> ,`extraButtonPassword`, <cite>extraButtonInfo</cite>. Example on how to reuse
-custom vars defined in <cite>config.qfq.ini</cite>. Add three more examples to _pdf. How to access local online documentation.
-Add note about wkhtml only on linux boxes. More wkhtml explanations.</li>
-<li>#3773 / Button: Info / Unlock / ShowPassword: FE_PARAMETER: extraButtonLock / extraButtonPassword / extraButtopnInfo.</li>
-<li>#3769 / Allow specific GET variables longer than SECURITY_GET_MAX_LENGTH. config.php: implemented special handling of
-GET vars, named with &#8216;..._&lt;num&gt;&#8217;.</li>
-<li>#3766 / SQL_LOG per tt_content record einstellbar machen. Add <cite>sqlLog</cite> and <cite>sqlLogMode</cite> to QFQ tt-content records.
-Add mode &#8216;error&#8217; and <cite>none</cite> to sqlLogMode. Manual.rst: Added explanations for SQL_LOG, SQL_LOG_MODE, and tt-content
-pendants sqlLog, sqlLogMode. Update config.qfq.ini to latest attributes.</li>
-<li>Config.php: Set defaults for config.qfq.ini SQL_LOG and SQL_LOG_MODE</li>
-<li>Manual.rst:</li>
-<li>config.qfq.example.ini: Remove DB_NAME_TEST, Add some details about SQL_LOG, add example for TECHNICAL_CONTACT</li>
-<li>Session.php: Activate cookie_httponly for QFQ cookies.</li>
-<li>Html2Pdf.php:  recode setting of $this-&gt;logFile.</li>
-<li>config.qfq.ini: new syntax for SHOW_DEBUG_INFO - [yes,no,auto][,download]</li>
-<li>#3711 / Upload Button opens the camera on a smartphone. New attribute &#8216;capture&#8217;.</li>
-<li>Database.php: Add SQL keyword &#8216;DROP&#8217;.</li>
-<li>#3706 / Check File Upload: a) mime type, b) max file size. Implemented: file upload check for mime type and max file size.</li>
-<li>New &#8216;pageForward&#8217;-Mode: &#8216;url-skip-history&#8217;.</li>
-<li>FormEditor:<ul>
-<li>Most radio FEs changed from HTML standard to Bootstrap Design.</li>
-<li>FE &#8216;feIdContainer&#8217; will only be shown if there is at least one FE container element.</li>
-<li>Use dynamicUpdate to hide/show FE &#8216;forwardPage&#8217;.</li>
-<li>FE &#8216;subrecordOption&#8217; shown only for FE.type==subrecord.</li>
-<li>FE &#8216;checkPattern&#8217; shown only for FE.checkType==&#8217;pattern|min%&#8217;.</li>
-<li>In form &#8216;FormElement&#8217; the FE &#8216;formId&#8217; removed - not necessary.</li>
-</ul>
-</li>
-<li>#3568 / Form: fuer alle Buttons (save, close, new, delete) eine optionale class &amp; text konfigurierbar.</li>
-<li>#3569 / Input Optional &#8216;0&#8217; unterdruecken.</li>
-<li>#3863: New config var &#8216;DB_UPDATE&#8217; in config.qfq.ini.</li>
-</ul>
-</div>
-<div class="section" id="id52">
-<h3>Bug Fixes<a class="headerlink" href="#id52" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>#3770 / Attack Delay: merge processing to one codeplace. Config.php: new function attackDetectedExitNow(). Sip.php:
-replace local sleep(PENALTY_TIME_BROKEN_SIP) with central function attackDetectedExitNow().</li>
-<li>#3768 / log to sql.log: ip, formname, feuser</li>
-<li>Store.php: Fix problem that an empty SQL_LOG will be added to SYSTEM_PATH_EXT. Logger.php: do nothing if there is no
-file defined.</li>
-<li>#3751 / download FE_GROUP protected pages failed. Implement additional &#8216;SHOW_DEBUG_INFO = download&#8217; to track down
-problems with &#8216;session forwarding&#8217;.</li>
-<li>Allow spaces in value when selection &lt;radio&gt; and &lt;select&gt; tags.</li>
-<li>#3812 / extraButtonInfo (extraButtonLock, extraButtonPassword) - Problems in TemplateGroups.</li>
-<li>#3832 / Dynamic Update und Radio buttons - leerer value ( &#8216;&#8217; ) kann nicht angewählt werden</li>
-<li>#3612 / Konflikt typeAheadLdap mit dynamic modesql: inputs with typeahead lacks &#8216;dynamicUpdate&#8217; via &#8216;modeSql&#8217;.</li>
-<li>#3853 / New &gt; Save: Reload des Forms mit neuer SIP und neu erstellter recordId.</li>
-<li>#3854 / Wrong final page: a) New &gt; Save &gt; Close, b) New &gt; Save &gt; Delete, c) New &gt; New
-formEditor.sql: update table &#8216;Form.forwardMode&#8217; to (&#8216;client&#8217;, &#8216;no&#8217;, &#8216;url&#8217;, &#8216;url-skip-history&#8217;).</li>
-<li>#2337 / Checkbox: checked/unchecked parameters genügen nicht.</li>
-<li>#2542 / FormElement-Typ &#8216;note&#8217; funktioniert nicht mit dynamic update</li>
-<li>#3863 / DB Update Fails: Expected no record, got 2 rows: SHOW TABLE STATUS WHERE Name=&#8217;Form&#8217;</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-17-0">
-<h2>Version 0.17.0<a class="headerlink" href="#version-0-17-0" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id53">
-<h3>Changes<a class="headerlink" href="#id53" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>ALTER TABLE  <cite>FormElement</cite> ADD  <cite>encode</cite> ENUM(  &#8216;none&#8217;,  &#8216;specialchar&#8217; ) NOT NULL DEFAULT  &#8216;specialchar&#8217; AFTER  <cite>subrecordOption</cite> ;</li>
-<li>UPDATE <cite>FormElement</cite> SET encode=&#8217;none&#8217; WHERE class=&#8217;native&#8217; AND type=&#8217;editor&#8217;</li>
-<li>ALTER TABLE  <cite>Form</cite> ADD  <cite>escapeTypeDefault</cite> ENUM(  &#8216;&#8217;,  &#8216;s&#8217;,  &#8216;d&#8217;,  &#8216;l&#8217;,  &#8216;L&#8217;,  &#8216;m&#8217;,  &#8216;-&#8216; ) NOT NULL DEFAULT  &#8216;&#8217; AFTER  <cite>permitEdit</cite> ;</li>
-<li>In order to not break functionality of existing forms, it might be necessary (bad for security, good for stability) to
-leave existing forms untouched: <cite>UPDATE Form SET escapeTypeDefault=&#8217;-&#8216;</cite></li>
-<li>Play formEditor.sql</li>
-</ul>
-</div>
-<div class="section" id="id54">
-<h3>Features<a class="headerlink" href="#id54" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>New security option <cite>escapeTypeDefault</cite>: will be defined 1) sytem wide in config.qfq.ini, or 2) more specific per
-Form or 3) individually per variable. The later has priority.</li>
-<li><dl class="first docutils">
-<dt>#3544 / Form: view current form - It&#8217;s now possible to direct view a form, which is currently loaded/edited in the</dt>
-<dd>FormEditor: Button &#8216;eye&#8217; near left of button &#8216;save&#8217;.</dd>
-</dl>
-</li>
-<li>#3552 / typeAheadLdapSearchPerToken - webpass kann nicht gleichzeitig nach Vornamen und Nachnamen suchen. Added option
-typeAheadLdapSearchPerToken to split search value in token and OR-combine every search with the individual tokens.</li>
-<li>Download latest QFQ builds and releases: <a class="reference external" href="https://w3.math.uzh.ch/qfq/">https://w3.math.uzh.ch/qfq/</a>.</li>
-<li>#3218, #3600 / download.php / export: QFQ is now able to create PDFs and ZIPs on the fly. The sources might be
-uploaded PDFs or Websites (local or remote) which will be converted to PDFs.</li>
-<li>Implement &#8216;encode=specialchar&#8217; - new option per FormElement which is now the default for every FormElement.</li>
-<li>Sanatize.php: New function urlDecodeArr(). Decode all _GET vars.</li>
-<li>Implemented max GET parameter lenght. Default: 50.</li>
-<li>Implemented new escape class &#8216;mysql&#8217; (realEscapeString).</li>
-<li>LICENSE.txt: Add GPLv3</li>
-<li>Html2Pdf.php: Add SIP support wkhtmltopdf URLs. Move cookies for wkhtmltopdf from commandline arguments to filebased.</li>
-<li>SessionCookie.php: New class to save current cookies in a file.</li>
-<li>Html2Pdf.php: implemented session forwarding to wkhtmltopdf.</li>
-<li>Session.php: introduced close(). This will unlock the current session. Take care on subsequent calls to reopen primary session again.</li>
-<li>Database.php: Set charset to real_escape_string() functions properly. Proxy for mysqli::real_escape_string()</li>
-<li>Implement honeypot variables to detect bots.</li>
-<li>HTML special char encode all URL GET parameter. This can&#8217;t be skipped.</li>
-</ul>
-</div>
-<div class="section" id="id55">
-<h3>Bug Fixes<a class="headerlink" href="#id55" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>Sip.php: Parameter XDEBUG_SESSUIB_START excluded from GET parameter copied to SIP.</li>
-<li>Manual.rst: add libxrender1 to install by using wkhtmltopdf.</li>
-<li>Download.php: Skip &#8216;pdftk&#8217; if there is only one PDF file to concatenate.</li>
-<li>#3615 / download.php: Das Popup schliesst nicht automatisch bei ZIP, im FF, Warnung in der Console, hourglass wobbles.</li>
-<li>Split PHP &#8216;print.php&#8217; in a pure API file &#8216;print.php&#8217; and a class &#8216;Html2Pdf.php&#8217; - the class will be reused by Download.php</li>
-<li>#3573 / TypeaheadLdap: Prefetch funktioniert nicht</li>
-<li>#3547 / FE of type &#8216;note&#8217; causes writing of empty fields.</li>
-<li>#3546 / Throw of a UserFormException with wrong parameter. Fixed.</li>
-<li>#3545 / Errormessages via API/JSON not displayed</li>
-<li>#3536 / a) Datum (datetime / timestamp) werden nicht angezeigt, b) Angezeigte Datumsformat String und aktzeptierte Eingabe matchen nicht.</li>
-<li>#3533 / afterSave: sqlUpdate auf child-record ändert xId von Hauptrecord auf 0</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-16">
-<h2>Version 0.16<a class="headerlink" href="#version-0-16" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id56">
-<h3>Changes<a class="headerlink" href="#id56" title="Permalink to this headline">¶</a></h3>
-<ul>
-<li><p class="first">Play:</p>
-<blockquote>
-<div><p>ALTER TABLE <cite>FormElement</cite> ADD INDEX <cite>feIdContainer</cite> (<cite>feIdContainer</cite>);
-ALTER TABLE <cite>FormElement</cite> ADD INDEX <cite>ord</cite> (<cite>ord</cite>);
-ALTER TABLE <cite>FormElement</cite> ADD INDEX <cite>feGroup</cite> (<cite>feGroup</cite>);</p>
-<p>ALTER TABLE <cite>FormElement</cite> ADD <cite>adminNote</cite> TEXT NOT NULL AFTER <cite>note</cite>;</p>
-</div></blockquote>
-</li>
-<li><p class="first">Play formEditor.sql</p>
-</li>
-</ul>
-</div>
-<div class="section" id="id57">
-<h3>Features<a class="headerlink" href="#id57" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>formEditor.sql:<ul>
-<li>Added &#8216;on update current timestamp&#8217;.</li>
-<li>Add three indexes to formEditor.sql.</li>
-<li>Column FormElement.adminNote added.</li>
-<li>Change default width on Form for subrecord FormElement.name</li>
-<li>Changed input height of &#8216;parameter of FormEditor and FormElementEditor to 8 lines.</li>
-</ul>
-</li>
-<li>Enlarge placeholder value in FormElement. Old 512, New 2048.</li>
-<li>#3466 / Input Typeahead: optional only allow specified input. Mode: typeAheadPedantic</li>
-<li>#3465 / Save button: optional &#8216;active after form load&#8217;: <cite>Form.parameter.saveButtonActive</cite> - if this attribute is set,
-the save button will be enabled directly on form load.</li>
-<li>#3463 / form.mode=readonly. Make a form complete <cite>readonly</cite>. This can be done statically or dynamically via variable (e.g. SIP).</li>
-<li>#3447 / Icons das man im FrontEnd direkt das gewaehlte FormElement im Formulareditor bearbeiten kann. Add checkbox left
-to the &#8216;EditForm&#8217;-Button, to toogle the &#8216;FormElemnt&#8217;-Icons. Like the  &#8216;Form Edit&#8217;-Pencil, the &#8216;FormElement Checkbox&#8217;
-is only displayed if the user is logged in BE.</li>
-<li>#3456 / LDAP: with Credentials (e.g. to access &#8216;webpass&#8217;). Updated doc for a) config.qfq.ini: LDAP_1_RDN, LDAP_1_PASSWORD,
-b) Form.parameter|FormElement.parameter: ldapUseBindCredentials<ul>
-<li>ErrorHandler.php: removed details - the end user should not too many details.</li>
-<li>FormAction.php, Ldap.php, QuickFormQuery.php: implement &#8216;ldapUseBindCredentials&#8217;</li>
-<li>Ldap.php: set_error_handler() to catch ldap_bind() problems. Always set LDAP_OPT_PROTOCOL_VERSION=3 - this might cause problems with som LDAP Servers - we will see.</li>
-</ul>
-</li>
-</ul>
-</div>
-<div class="section" id="id58">
-<h3>Bug Fixes<a class="headerlink" href="#id58" title="Permalink to this headline">¶</a></h3>
-<ul class="simple">
-<li>3509 / SELECT Element: value wird nicht selektiert</li>
-<li>3502 / TemplateGroups: Checkboxen werden beim ersten Speichern (insert) nicht geschrieben - ein anschliessendes Update
-ist ok</li>
-<li>3385 / templateGroup: insert/update/delete non primary records<ul>
-<li>Non primary record leads to a problem that the default values, given as an array, are not replaced by scalar values. fixed.</li>
-<li>Update doc how to insert/update/delete non primary templateGroup records.</li>
-<li>Removed $templateGroupIndex - solved implicit by defining a LIMIT on &#8216;slaveId&#8217; . Implemented &#8216;%D&#8217; (one below %d). Implemented FE_SQL_HONOR_FORM_ELEMENTS - reduces unecassary SQL queries.</li>
-<li>Fill STORE_RECORD during Formload - to read templateGroup records very early. Local copy of <cite>getNativeFormElements()</cite>, new <cite>explodeTemplateGroupElements()</cite></li>
-</ul>
-</li>
-<li>TypeAhead.js: Handle &lt;ENTER&gt; key properly.</li>
-<li><dl class="first docutils">
-<dt>#3462 / FormElement.parameter: requiredList not ok for non numeric content. STORE_FORM had been called without &#8216;sanatize class&#8217;.</dt>
-<dd>Therefore, all non numeric values has been sanatized by default. New: SANATIZE_ALLOW_ALL.</dd>
-</dl>
-</li>
-<li>Corrected error message to use &#8216;itemList&#8217; instead of &#8216;itemValues&#8217;. Renamed constant too.</li>
-<li>#2542 / FormElement-Typ &#8216;note&#8217; funktioniert nicht mit dynamic update. &#8216;Label&#8217; and &#8216;note&#8217; are fixed - &#8216;value&#8217; is still not updated, open.</li>
-</ul>
-</div>
-</div>
-<div class="section" id="version-0-15">
-<h2>Version 0.15<a class="headerlink" href="#version-0-15" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id59">
-<h3>Changes<a class="headerlink" href="#id59" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul>
-<li><p class="first">Play formEditor.sql.</p>
-<ul>
-<li><p class="first">Form &#8216;FormElement&#8217; failed to display the formtitle of the current form in case of a new FE.</p>
-</li>
-<li><p class="first">Updated subrecord in &#8216;Form&#8217; for &#8216;FormElements&#8217; - columns &#8216;size&#8217; and &#8216;sql1&#8217; removed and &#8216;dyn&#8217; inserted. Play formEditor.sql.</p>
-</li>
-<li><p class="first">#3431, Parameter keyword &#8216;typeAheadLdapKeyPrintf&#8217; changed to &#8216;typeAheadLdapIdPrintf&#8217;.:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">UPDATE</span> <span class="nx">FormElement</span> <span class="nx">SET</span> <span class="nx">parameter</span> <span class="o">=</span> <span class="nx">REPLACE</span><span class="p">(</span><span class="nx">parameter</span><span class="p">,</span> <span class="s1">&#39;typeAheadLdapKeyPrintf&#39;</span><span class="p">,</span> <span class="s1">&#39;typeAheadLdapIdPrintf&#39;</span><span class="p">)</span>
-</pre></div>
-</div>
-</li>
-<li><p class="first">Size &#8216;placeholder&#8217; increased:</p>
-<div class="highlight-php"><div class="highlight"><pre><span></span><span class="nx">ALTER</span> <span class="nx">TABLE</span>  <span class="sb">`FormElement`</span> <span class="nx">CHANGE</span>  <span class="sb">`placeholder`</span>  <span class="sb">`placeholder`</span> <span class="nx">VARCHAR</span><span class="p">(</span> <span class="mi">2048</span> <span class="p">)</span> <span class="nx">CHARACTER</span> <span class="nx">SET</span> <span class="nx">utf8</span> <span class="nx">COLLATE</span> <span class="nx">utf8_general_ci</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span>  <span class="s1">&#39;&#39;</span><span class="p">;</span>
-</pre></div>
-</div>
-</li>
-</ul>
-</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id60">
-<h3>Features<a class="headerlink" href="#id60" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>Introduce new config.qfq.ini setting &#8216;EDIT_FORM_PAGE&#8217; - by default set to &#8216;form&#8217; - the wrench symbol on every Form
-will direct to that page. Fix #3420 / Quicklink &#8216;editform&#8217; on form: directs to the current T3 page which might be insufficient.</li>
-<li>Form &#8216;subrecord&#8217; columns: the default width limit of 20 chars are disabled if &#8216;nostrip&#8217; is specifed.</li>
-<li>#3431 / typeAheadSql: columnname &#8216;key&#8217; is a reserverd SQL statement - replace by &#8216;id&#8217;. Additional the parametername
-&#8216;typeAheadLdapKeyPrintf&#8217; renamed to &#8216;typeAheadLdapIdPrintf&#8217;. By using &#8216;id&#8217; instead of &#8216;key&#8217; the quoting of the columnname
-is not necessary anoymore.</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id61">
-<h3>Bug Fixes<a class="headerlink" href="#id61" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>Fix #3419 / typeAheadSql: Array with only one column or non standard columnnames are not handeld properbly.
-Detection of missing LIMIT implemented.</li>
-<li><dl class="first docutils">
-<dt>#3425 / Form.parameter, FormElement.parameter: comment handling, trailing &amp; leading spaces</dt>
-<dd>Manual.rst: commented handling of &#8216;comment character&#8217; and &#8216;escaping of leading/trailing spaces&#8217;
-Support.php: new funtion handleEscapeSpaceComment().</dd>
-</dl>
-</li>
-<li>Evaluate.php: parse all F|FE.parameter via handleEscapeSpaceComment(). A leading &#8216;#&#8217; or &#8216; &#8216; might be escaped by &#8216;&#8217;.</li>
-<li>Saving &#8216;extra&#8217; FE in STORE_SIP has been done with inappropiate FE_NAME. Correct is the pure FE_NAME, without any
-extension like recordId. Unessary and broken decoding removed.</li>
-<li>#3426 | Dynamic Update: Inputs loose the new content and shows the old value</li>
-<li>Through fix #2064 the FE.checkType has not been used anymore. This is fixed now.</li>
-<li>#3433 | templateGroup on primary Record: Values of removed copies are not deleted. The new implementation creates empty
-fake instances of all copies of templateGroup FormElements. Those are empty. Before save, the submitted form values
-will be expanded with the empty fake templateGroup FormElements and such empty values will be saved.</li>
-</ul>
-</div></blockquote>
-</div>
-</div>
-<div class="section" id="version-0-14">
-<h2>Version 0.14<a class="headerlink" href="#version-0-14" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id62">
-<h3>Changes<a class="headerlink" href="#id62" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul>
-<li><p class="first">Play formEditor.sql.</p>
-<ul>
-<li><p class="first">All Form &amp; FormEditor input elements now have a maxlength definition of 0, which means take the column definition value.</p>
-</li>
-<li><p class="first">Drop-down list of container assignment:</p>
-<ul class="simple">
-<li>Display &#8216;type&#8217; (&#8216;pill&#8217;, &#8216;fieldset&#8217;, &#8216;templategroup&#8217;) instead of &#8216;class&#8217; (always &#8216;container&#8217;).</li>
-<li>Display &#8216;name&#8217; (internal name) instead of &#8216;label&#8217; (shown on the website and might not so usefull as &#8216;name&#8217; which is nowhere else used than in that drop-down.</li>
-</ul>
-</li>
-<li><p class="first">FormElement.placeholder colum width extended to 512:</p>
-<p>ALTER TABLE <cite>FormElement</cite> CHANGE <cite>placeholder</cite> <cite>placeholder</cite> VARCHAR(512) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT &#8216;&#8217;</p>
-</li>
-</ul>
-</li>
-<li><p class="first">New class Ldap.php.</p>
-</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id63">
-<h3>Features<a class="headerlink" href="#id63" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>Typeahead for SQL and LDAP Datasources implemented.</li>
-<li>formEditor.sql: Changed width of column FormElement.placeholder from 255 to 512. Removed hardcoded &#8216;size&#8217; in FormElement &#8216;placeholder&#8217;.</li>
-<li>Character Count: Display a <cite>counter</cite> on input or textarea fields, activated by specifying the formElement.parameter &#8216;characterCountWrap&#8217;.</li>
-<li>Evaluate.php: Two new escape options &#8216;l&#8217; and &#8216;L&#8217;. Backport of ldap_escape() for PHP &lt;5.6. Multiple escaping for one value now possible.</li>
-<li>Manual.rst: add some example for TypeAhead and for saving LDAP value.</li>
-<li>Load foreign values in templatGroups - saving is not implemented yet.</li>
-<li>Manual: Added howto prevent &lt;p&gt;-wrap in TinyMCE</li>
-<li>TemplateGroup: Add button now disabled if max. number of copies reached.</li>
-<li>#3414/QuickFormQuery.php: wrap whole form in &#8216;col-md-XX&#8217; - User controls the width of an QFQ form.</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id64">
-<h3>Bug Fixes<a class="headerlink" href="#id64" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>Dynamic Update has been broken since implementing of &#8216;element-update&#8217; (#3180). Now both methods, &#8216;element-update&#8217; and &#8216;form-update&#8217; should be fine.</li>
-<li>qfq-bs.css.less: Fixed problem with &#8216;typeahead input elements&#8217; not expanded to Bootstrap column width. Changed
-Layout/Design Typeahead drop-down box. Add hoover for the drop-down box with a blue background</li>
-<li>AbstractBuildForm.php: #3374 - textarea elements now contains &#8216;maxlength&#8217; attribute.</li>
-<li>BuildFormBootstrap.php: wrapping of optional &#8216;submitButtonText&#8217; now done with the &#8216;per form&#8217; values.</li>
-<li>typeahead.php: if there is an exception, the message body is sent as regular &#8216;content&#8217; for the drop-down box. At the
-moment this is the only way to transmit any error messages.</li>
-<li>formEditor.sql: removed all &#8216;maxLength&#8217; string values for &#8216;Form&#8217; and &#8216;FormElement&#8217; forms.</li>
-<li>Save button becomes active if a templateGroup copy is removed.</li>
-<li>#3413 Form ohne Pill hat kein padding am Rand. Fix: if there are no pills, an additinal col-md-12 will be rendered.</li>
-</ul>
-</div></blockquote>
-</div>
-</div>
-<div class="section" id="version-0-13">
-<h2>Version 0.13<a class="headerlink" href="#version-0-13" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id65">
-<h3>Changes<a class="headerlink" href="#id65" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul>
-<li><p class="first">Play formEditor.sql.</p>
-</li>
-<li><p class="first">formEditor.sql:</p>
-<ul class="simple">
-<li>Checktype of <cite>Form.name</cite> restricted to <cite>alnumx</cite> (prior <cite>all</cite>).</li>
-<li>Changed <cite>access</cite> for Form <cite>form</cite> &amp; &#8216;<cite>ormElement</cite> from <cite>always</cite> to <cite>sip</cite>.</li>
-</ul>
-</li>
-<li><p class="first">Table <cite>FormElement</cite></p>
-<ul>
-<li><p class="first">Modified column: <cite>checkType</cite> - new value <cite>numerical</cite></p>
-<dl class="docutils">
-<dt>ALTER TABLE FormElement MODIFY COLUMN checkType ENUM(&#8216;alnumx&#8217;,&#8217;digit&#8217;,&#8217;numerical&#8217;,&#8217;email&#8217;,&#8217;min|max&#8217;,&#8217;min|max date&#8217;,</dt>
-<dd><p class="first last">&#8216;pattern&#8217;,&#8217;allbut&#8217;,&#8217;all&#8217;) NOT NULL DEFAULT &#8216;alnumx&#8217;</p>
-</dd>
-</dl>
-</li>
-</ul>
-</li>
-<li><p class="first">Example Report for <cite>forms</cite> extended by a delete button per row.</p>
-</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id66">
-<h3>Features<a class="headerlink" href="#id66" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul>
-<li><p class="first">print.php: offers &#8216;print page&#8217; for any local page - create a PDF on the fly (printout is then browser independent).</p>
-<ul>
-<li><p class="first">Install <cite>wkhtmltopdf</cite> on the webserver (<a class="reference external" href="http://wkhtmltopdf.org/">http://wkhtmltopdf.org/</a>).</p>
-</li>
-<li><p class="first">In config.qfq.ini setup:</p>
-<blockquote>
-<div><p>BASE_URL_PRINT=http://www.../
-WKHTMLTOPDF=/opt/wkhtmltox/bin/wkhtmltopdf</p>
-</div></blockquote>
-</li>
-</ul>
-</li>
-<li><p class="first">Check and error report if &#8216;php_intl&#8217; is missing.</p>
-</li>
-<li><p class="first">New Checktype &#8216;allow numerical&#8217;.</p>
-</li>
-<li><p class="first">Documentation: example for &#8216;radio&#8217; with no pre selection.</p>
-</li>
-<li><p class="first">#3063, Radios and checkboxes optional rendered in Bootstrap layout.</p>
-</li>
-<li><p class="first">Added &#8216;help-box with-errors&#8217;-DIV after radios and checkboxes.</p>
-</li>
-<li><p class="first">Respect attribute <cite>data-class-on-change</cite> on save buttons.</p>
-</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id67">
-<h3>Bug Fixes<a class="headerlink" href="#id67" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>#2138 / digit sanitize: new class &#8216;numerical&#8217; implemented.</li>
-<li>Fixed recursive thrown exception.</li>
-<li>#2064 / search of a default value for a non existing tablecolumn returns &#8216;false&#8217;.<ul>
-<li>Fixed setting of STORE_SYSTEM / showDebugInfo during API call.</li>
-</ul>
-</li>
-<li>#2081, #3180 Form: Label &amp; note - update via <cite>DynamicUpdate</cite></li>
-<li>#3253, if there is no STORE_TYPO3 (calls through .../api/ like save, delete, load): use SIP / CLIENT_TYPO3VARS.</li>
-<li>qfq-bs.css:<ul>
-<li>Alignment of checkboxes and radios optimized.</li>
-<li>CSS class &#8216;qfq-note&#8217; for &#8216;notes&#8217; (third column in a form).</li>
-</ul>
-</li>
-</ul>
-</div></blockquote>
-</div>
-</div>
-<div class="section" id="version-0-12">
-<h2>Version 0.12<a class="headerlink" href="#version-0-12" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id68">
-<h3>Changes<a class="headerlink" href="#id68" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul>
-<li><p class="first">Table &#8216;FormElement&#8217;
-* New column: rowLabelInputNote</p>
-<blockquote>
-<div><p>ALTER TABLE  <cite>FormElement</cite> ADD <cite>rowLabelInputNote</cite> set(&#8216;row&#8217;,&#8217;label&#8217;,&#8217;/label&#8217;,&#8217;input&#8217;,&#8217;/input&#8217;,&#8217;note&#8217;,&#8217;/note&#8217;,&#8217;/row&#8217;)
-NOT NULL DEFAULT &#8216;row,label,/label,input,/input,note,/note,/row&#8217; AFTER  <cite>bsNoteColumns</cite> ;</p>
-</div></blockquote>
-<ul>
-<li><p class="first">Modified column: &#8216;type&#8217; - new value &#8216;templateGroup&#8217;</p>
-<blockquote>
-<div><p>ALTER TABLE  <cite>FormElement</cite> CHANGE  <cite>type</cite>  <cite>type</cite> ENUM(  &#8216;checkbox&#8217;,  &#8216;date&#8217;,  &#8216;datetime&#8217;,  &#8216;dateJQW&#8217;,  &#8216;datetimeJQW&#8217;,  &#8216;extra&#8217;,
-&#8216;gridJQW&#8217;,  &#8216;text&#8217;,  &#8216;editor&#8217;,  &#8216;time&#8217;,  &#8216;note&#8217;,  &#8216;password&#8217;,  &#8216;radio&#8217;,  &#8216;select&#8217;,  &#8216;subrecord&#8217;,  &#8216;upload&#8217;,  &#8216;fieldset&#8217;, &#8216;pill&#8217;,
-&#8216;templateGroup&#8217;,  &#8216;beforeLoad&#8217;,  &#8216;beforeSave&#8217;,  &#8216;beforeInsert&#8217;,  &#8216;beforeUpdate&#8217;,  &#8216;beforeDelete&#8217;,  &#8216;afterLoad&#8217;,  &#8216;afterSave&#8217;,
-&#8216;afterInsert&#8217;,  &#8216;afterUpdate&#8217;,  &#8216;afterDelete&#8217;,  &#8216;sendMail&#8217; ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT  &#8216;text&#8217;</p>
-</div></blockquote>
-</li>
-</ul>
-</li>
-<li><p class="first">formEditor.sql: Added HTML &#8216;placeholder&#8217; in FormEditor for bs*Columns.</p>
-<ul class="simple">
-<li>PLAY &#8216;formEditor.sql&#8217;.</li>
-</ul>
-</li>
-<li><p class="first">User Input will be UTF8 normalized.</p>
-<ul class="simple">
-<li>INSTALL &#8216;php5-intl&#8217; or &#8216;php7.0-intl&#8217; on Webserver.</li>
-</ul>
-</li>
-<li><p class="first">Add globalize.js to be included. Needed by jqx-all.js</p>
-<ul class="simple">
-<li>UPDATE EXISTING TypoScript TEMPLATES of QFQ Installation.</li>
-</ul>
-</li>
-<li><p class="first">Name of variable &#8216;_filename&#8217; (used in field &#8216;parameter&#8217;) has changed. Old: &#8216;_filename&#8217;, New: &#8216;filename&#8217;</p>
-<ul class="simple">
-<li>UPDATE <cite>FormElement</cite> SET parameter = REPLACE(parameter, &#8220;_filename&#8221;, &#8220;filename&#8221;)</li>
-</ul>
-</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id69">
-<h3>Features<a class="headerlink" href="#id69" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>User input will be UTF8 normalized</li>
-<li>config.qfq-ini:
-* New configuration values: FORM_BS_LABEL_COLUMNS / FORM_BS_INPUT_COLUMNS / FORM_BS_NOTE_COLUMNS
-* Comment empty variables - the new default setting is, that empty parameter in config.qfq.ini means EMPTY (=parameter is set and will not be overwritten by internal default), not UNDEFINED (overwritten by internal default).</li>
-<li>FileUpload:
-* Implemented new Formelement.parameter: fileReplace=always - will replace existing files.
-* Multiple / Advanced Upload: new logic implements slaveId, sqlInsert, sqlUpdate, sqlDelete.</li>
-<li>FormElement.parameter: sqlBefore / sqlAfter fired during &#8216;Form&#8217; save for action elements.</li>
-<li>STORE FORM: variable &#8216;filename&#8217; moved to STORE VAR - sanatize class needs no longer specified.</li>
-<li>STORE VAR: two new variables &#8216;filename&#8217; and &#8216;fileDestination&#8217; valid during processing of current upload FormElement.</li>
-<li>Default store priority list changed. Old: &#8216;FSRD&#8217;, New: &#8216;FSRVD&#8217;.</li>
-<li>CODING.md: update doc for FormElement &#8216;upload&#8217; and general &#8216;Form&#8217; rendering &amp; save (recursive rendering).</li>
-<li>User manual:
-* Described form layout options: description for bsLabelColumn, bsInputColumn, bsNoteColumn
-* Update &#8216;file-upload&#8217; doc.
-* Described 3 examples for upload forms.</li>
-<li>Administrator manual:
-* Add description page.meta...</li>
-<li>New FormElement (type= &#8216;container&#8217;) added: &#8216;templateGroup&#8217;
-* FormElement.parameter.tgAddClass | tgAddText | tgRemoveClass | tgRemoveText | tgClass
-* FormElement.maxSize: max number of duplicates
-* #3230 templateGroup: margin between copies. &#8216;tgClass&#8217; implemented.</li>
-<li>Native FormElements:
-* FormElement.parameter.htlmlBefore|htmlAfter - add the specified HTML code before or after the element (outside of any wrapping)
-* #3224, #3231 Html Tag &lt;hr&gt; als FormElement. &gt;&gt; htmlBefore | htmlAfter.
-* FormElement.parameter.wrapLabel | wrapInput | wrapAfter | wrapRow - if specified, any default wrapping is omitted.
-* FormElement.bsNoteColumns | bsInputColumns | bsNoteColumns - a &#8216;0&#8217; will suppress the whole rendering of the item.
-* FormElement.rowLabelInputNote - switch on/off rendering of the corresponding system wrapping items.</li>
-<li>#3232 Define custom &#8216;on-change&#8217; color - used for the save button: Form.parameter.buttonOnChangeClass=...</li>
-<li>Form.parameter &amp; FormElement.parameter: Lines starting with &#8216;#&#8217; are treated as comments and will not be parsed.</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id70">
-<h3>Bug fixes<a class="headerlink" href="#id70" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>User manual:
-* Fixed double include of validator.js in T3 Typoscript template example.
-* Fixed wrong store name SYSTEM: S &gt; Y
-* Fixed wrong STORE_FORM variable names.
-* Reformat FormElement.parameter description.
-* Styling errors fixed.</li>
-<li>Use of &#8216;decryptCurlyBraces()&#8217; to get better error messages.</li>
-<li>Skip unwanted parameter expansion during save.</li>
-<li>Fixed bug with uninitialized FE_SLAVE_ID</li>
-<li>formEditor.sql:
-* The defintion as &#8216;editor&#8217; (not text) for FormElement &#8216;note&#8217; has been lost - reinserted.
-* Fixed problem while playing SQL query - deleting old FormElements of Formeditor deleted also FormElements of other forms.</li>
-<li>#3066 / help-text with-error - CSS class &#8216;hidden&#8217; will be rendered by default (as long there is no error).</li>
-<li>Labels are skipped, if FormElement.bsLabelColumns=0.</li>
-<li>Respect attribute <cite>data-class-on-change</cite> on save buttons.</li>
-</ul>
-</div></blockquote>
-</div>
-</div>
-<div class="section" id="version-0-11">
-<h2>Version 0.11<a class="headerlink" href="#version-0-11" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id71">
-<h3>Features<a class="headerlink" href="#id71" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>Added STORE_BEFORE, #3146 - Mainly used to compare old and new values during a form &#8216;save&#8217; action.</li>
-<li>Added &#8216;best practice&#8217; for defining and using of &#8216;Central configure values&#8217; in UserManual.</li>
-<li>Added accent characters to sanatize class &#8216;alnumx&#8217;, #3183.</li>
-<li>Set default all QFQ send mails to &#8216;auto-submit&#8217;.</li>
-<li>Added possibility to customize error messages (&#8216;data-pattern-error&#8217;, &#8216;data-rquired-error&#8217;, &#8216;data-match-error&#8217;,
-&#8216;data-error&#8217;) if validation fails. Customization can be done on global level (config.qfq.ini), per Form or per FormElement.</li>
-<li><em>FormElement</em>: Double an input element and validate that the input match: FormElement.parameter.retype=1</li>
-<li>Autofocus in Forms is now supported. By default the first Input Element receives the focus. Can be customized.</li>
-<li>Added a timestamp in shown exceptions. Usefull for screenshots, send by customer, to find the problem in SQL logfiles.</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id72">
-<h3>Bug fixes<a class="headerlink" href="#id72" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>Fixed missing docutmentation for FormElement &#8216;note&#8217;.</li>
-<li>Failed SQL queries will now always be logged, even if they do not modify some data.</li>
-</ul>
-</div></blockquote>
-</div>
-</div>
-<div class="section" id="version-0-10">
-<h2>Version 0.10<a class="headerlink" href="#version-0-10" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id73">
-<h3>Features<a class="headerlink" href="#id73" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>Implemented Parameter &#8216;extraDeleteForm&#8217; for &#8216;forms&#8217; and &#8216;subrecords&#8217;. Update doc.</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id74">
-<h3>Bug fixes<a class="headerlink" href="#id74" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>Suppress rendering of form title during a &#8216;delete&#8217; call. No one will see it and required parameters are not supplied.</li>
-<li>In case of broken SQL queries, print them in ajax error message.</li>
-<li>Remove parameter &#8216;table&#8217; from Delete SIP URLs. ToolTip updated.</li>
-</ul>
-</div></blockquote>
-</div>
-</div>
-<div class="section" id="version-0-9">
-<h2>Version 0.9<a class="headerlink" href="#version-0-9" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="id75">
-<h3>Features<a class="headerlink" href="#id75" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>FormEditor:
-* design update - new default background color: grey.
-* per form configureable background colors.
-* Optional right align of all form element labels.
-* Added config.qfq.ini values CSS_CLASS_QFQ_FORM_PILL, CSS_CLASS_QFQ_FORM_BODY, CSS_CLASS_QFQ_CONTAINER.</li>
-</ul>
-</div></blockquote>
-</div>
-<div class="section" id="id76">
-<h3>Bug fixes<a class="headerlink" href="#id76" title="Permalink to this headline">¶</a></h3>
-<blockquote>
-<div><ul class="simple">
-<li>BuildFormBootstrap.php: added new class name &#8216;qfq-label&#8217; to form labels - needed to assign &#8216;qfq-form-right&#8217; class. Changed wrapping of formelements from &#8216;col-md-8&#8217; (wrong) to &#8216;col-md-12&#8217;.</li>
-<li>QuickFormQuery.php: Set default for new F_CLASS_PILL &amp; F_CLASS_BODY.</li>
-<li>formEditor.sql: New default background color for formElements is blue.</li>
-<li>qfq-bs.css.less: add classes qfq-form-pill, qfq-form-body, form-group (center), qfq-color-..., qfq-form-right.</li>
-<li>Index.rst: Add note to hierachy chars. Fixed uncomplete doc to a) bs*Columns, showButton. Add classPill, classBody. Rewrote form.paramter.class.</li>
-<li>QuickFormQuery.php: Button save/ close/ delete/ new - align to right border of form.</li>
-<li>UsersManual/index.rst: renamed chapter for formelements. Cleanup formelement types. Wrote chapter &#8216;Detailed concept&#8217;.</li>
-<li>QuickFormQuery.php, FormAction.php: &#8216;#2931 / afterSave Hauptrecord xId nicht direkt verfügbar&#8217; - load master record again, after &#8216;action&#8217;-elements has been processed.</li>
-<li>UsersManual/index.rst: Startet FAQ section.</li>
-<li>config.qfq.example.ini: Added comment where to save config.qfq.ini.</li>
-<li>UsersManual/index.rst: Rewrite of &#8216;action&#8217;-FormElement definition.</li>
-<li>#2739: beforeDelete / afterDelete.</li>
-<li>PROTOCOL.md: update &#8216;delete&#8217; description.</li>
-<li>delete.php: fixed unwanted loose of MSG_CONTENT.</li>
-<li>Report.php: Fixed double &#8216;&amp;&amp;&#8217; in building UrlParam.</li>
-<li>FormAction.php: In case of &#8216;AFTER_DELETE&#8217;, do not try to load primary record - that one is already deleted.</li>
-<li>Sip.php: Do not skip SIP_TARGET_URL as parameter for the SIP.</li>
-<li>#3001 Report: delete implementieren.</li>
-<li>Index.rst, Constants.php: reverted parameter &#8216;_table&#8217; in delete links back to &#8216;table&#8217; - Reason: &#8216;form&#8217; needs to be &#8216;form&#8217; (instead of &#8216;_form&#8217;) due to many used places already.</li>
-<li>Sip.php: move SIP_TARGET_URL back to stored inside SIP - it&#8217;s necessary for &#8216;delete&#8217;-links.</li>
-<li>Report.php, Constants.php: Remove code to handle unecessary &#8216;p:&#8217; tag for delete links.</li>
-<li>Link.php: Check paged / Paged that the parameter r, table and form are given in the right combination.</li>
-<li>Link.php, Report.php: New &#8216;_link&#8217; token &#8216;x&#8217;. &#8216;_paged&#8217; and &#8216;_Paged&#8217; are rendered via Link() class, Link() class now supports delete links.</li>
-<li>QuickFormQuery.php: for modeForm=&#8217;Form Delete&#8217; the &#8216;required param&#8217; are not respected - this makes sense, cause these parameters typically filled in newly created records.</li>
-<li>Fixed: #3076 Delete Button bei Subrecords erzeugt sporadisch Javascript Exceptions (Webkit: Chrome / Vivaldi) - kein loeschen moeglich.</li>
-</ul>
-</div></blockquote>
-</div>
-</div>
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-  <h3><a href="Index.html">Table Of Contents</a></h3>
-  <ul>
-<li><a class="reference internal" href="#">Release</a><ul>
-<li><a class="reference internal" href="#version-0-future">Version 0.future</a><ul>
-<li><a class="reference internal" href="#notes">Notes</a></li>
-<li><a class="reference internal" href="#features">Features</a></li>
-<li><a class="reference internal" href="#bug-fixes">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-25-0">Version 0.25.0</a><ul>
-<li><a class="reference internal" href="#id2">Notes</a></li>
-<li><a class="reference internal" href="#id3">Features</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-24-0">Version 0.24.0</a><ul>
-<li><a class="reference internal" href="#id4">Notes</a></li>
-<li><a class="reference internal" href="#id5">Features</a></li>
-<li><a class="reference internal" href="#id6">Bug Fixes</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#id7">Release</a><ul>
-<li><a class="reference internal" href="#version-0-23-1">Version 0.23.1</a><ul>
-<li><a class="reference internal" href="#id8">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-23-0">Version 0.23.0</a><ul>
-<li><a class="reference internal" href="#id9">Features</a></li>
-<li><a class="reference internal" href="#id10">Bug Fixes</a></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><a class="reference internal" href="#id11">Release</a><ul>
-<li><a class="reference internal" href="#version-0-22">Version 0.22</a><ul>
-<li><a class="reference internal" href="#id12">Notes</a></li>
-<li><a class="reference internal" href="#id13">Features</a></li>
-<li><a class="reference internal" href="#id14">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-21-0">Version 0.21.0</a><ul>
-<li><a class="reference internal" href="#id15">Notes</a></li>
-<li><a class="reference internal" href="#id16">Features</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-20-0">Version 0.20.0</a><ul>
-<li><a class="reference internal" href="#changes">Changes</a></li>
-<li><a class="reference internal" href="#id17">Features</a></li>
-<li><a class="reference internal" href="#id18">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-19-7">Version 0.19.7</a><ul>
-<li><a class="reference internal" href="#id19">Changes</a></li>
-<li><a class="reference internal" href="#id20">Features</a></li>
-<li><a class="reference internal" href="#id21">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-19-6">Version 0.19.6</a><ul>
-<li><a class="reference internal" href="#id22">Features</a></li>
-<li><a class="reference internal" href="#id23">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-19-5">Version 0.19.5</a><ul>
-<li><a class="reference internal" href="#id24">Features</a></li>
-<li><a class="reference internal" href="#id25">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-19-4">Version 0.19.4</a><ul>
-<li><a class="reference internal" href="#id26">Features</a></li>
-<li><a class="reference internal" href="#id27">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-19-3">Version 0.19.3</a><ul>
-<li><a class="reference internal" href="#id28">Changes</a></li>
-<li><a class="reference internal" href="#id29">Bug Fixes</a></li>
-<li><a class="reference internal" href="#open">Open</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-19-2">Version 0.19.2</a><ul>
-<li><a class="reference internal" href="#id30">Features</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-19-1">Version 0.19.1</a><ul>
-<li><a class="reference internal" href="#id31">Features</a></li>
-<li><a class="reference internal" href="#id32">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-19-0">Version 0.19.0</a><ul>
-<li><a class="reference internal" href="#id33">Changes</a></li>
-<li><a class="reference internal" href="#id34">Features</a></li>
-<li><a class="reference internal" href="#id35">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-18-7">Version 0.18.7</a><ul>
-<li><a class="reference internal" href="#id36">Changes</a></li>
-<li><a class="reference internal" href="#id37">Features</a></li>
-<li><a class="reference internal" href="#id38">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-18-6">Version 0.18.6</a><ul>
-<li><a class="reference internal" href="#id39">Features</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-18-5">Version 0.18.5</a><ul>
-<li><a class="reference internal" href="#id40">Features</a></li>
-<li><a class="reference internal" href="#id41">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-18-4">Version 0.18.4</a><ul>
-<li><a class="reference internal" href="#id42">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-18-3b">Version 0.18.3b</a><ul>
-<li><a class="reference internal" href="#id43">Features</a></li>
-<li><a class="reference internal" href="#id44">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-18-3a">Version 0.18.3a</a><ul>
-<li><a class="reference internal" href="#id45">Changes</a></li>
-<li><a class="reference internal" href="#id46">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-18-3">Version 0.18.3</a><ul>
-<li><a class="reference internal" href="#id47">Features</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-18-2">Version 0.18.2</a><ul>
-<li><a class="reference internal" href="#id48">Changes</a></li>
-<li><a class="reference internal" href="#id49">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-18-1">Version 0.18.1</a></li>
-<li><a class="reference internal" href="#version-0-18-0">Version 0.18.0</a><ul>
-<li><a class="reference internal" href="#id50">Changes</a></li>
-<li><a class="reference internal" href="#id51">Features</a></li>
-<li><a class="reference internal" href="#id52">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-17-0">Version 0.17.0</a><ul>
-<li><a class="reference internal" href="#id53">Changes</a></li>
-<li><a class="reference internal" href="#id54">Features</a></li>
-<li><a class="reference internal" href="#id55">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-16">Version 0.16</a><ul>
-<li><a class="reference internal" href="#id56">Changes</a></li>
-<li><a class="reference internal" href="#id57">Features</a></li>
-<li><a class="reference internal" href="#id58">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-15">Version 0.15</a><ul>
-<li><a class="reference internal" href="#id59">Changes</a></li>
-<li><a class="reference internal" href="#id60">Features</a></li>
-<li><a class="reference internal" href="#id61">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-14">Version 0.14</a><ul>
-<li><a class="reference internal" href="#id62">Changes</a></li>
-<li><a class="reference internal" href="#id63">Features</a></li>
-<li><a class="reference internal" href="#id64">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-13">Version 0.13</a><ul>
-<li><a class="reference internal" href="#id65">Changes</a></li>
-<li><a class="reference internal" href="#id66">Features</a></li>
-<li><a class="reference internal" href="#id67">Bug Fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-12">Version 0.12</a><ul>
-<li><a class="reference internal" href="#id68">Changes</a></li>
-<li><a class="reference internal" href="#id69">Features</a></li>
-<li><a class="reference internal" href="#id70">Bug fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-11">Version 0.11</a><ul>
-<li><a class="reference internal" href="#id71">Features</a></li>
-<li><a class="reference internal" href="#id72">Bug fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-10">Version 0.10</a><ul>
-<li><a class="reference internal" href="#id73">Features</a></li>
-<li><a class="reference internal" href="#id74">Bug fixes</a></li>
-</ul>
-</li>
-<li><a class="reference internal" href="#version-0-9">Version 0.9</a><ul>
-<li><a class="reference internal" href="#id75">Features</a></li>
-<li><a class="reference internal" href="#id76">Bug fixes</a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-
-  <h4>Previous topic</h4>
-  <p class="topless"><a href="Manual.html"
-                        title="previous chapter">General</a></p>
-  <h4>Next topic</h4>
-  <p class="topless"><a href="Links.html"
-                        title="next chapter">Links</a></p>
-  <div role="note" aria-label="source link">
-    <h3>This Page</h3>
-    <ul class="this-page-menu">
-      <li><a href="_sources/Release.rst.txt"
-            rel="nofollow">Show Source</a></li>
-    </ul>
-   </div>
-<div id="searchbox" style="display: none" role="search">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <div><input type="text" name="q" /></div>
-      <div><input type="submit" value="Go" /></div>
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="right" >
-          <a href="Links.html" title="Links"
-             >next</a> |</li>
-        <li class="right" >
-          <a href="Manual.html" title="General"
-             >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &#169; Copyright 2017, Carsten Rose.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.5.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/extension/Documentation/html/_sources/Index.rst.txt b/extension/Documentation/html/_sources/Index.rst.txt
deleted file mode 100644
index 921da99e5..000000000
--- a/extension/Documentation/html/_sources/Index.rst.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-.. ==================================================
-.. FOR YOUR INFORMATION TEST
-.. --------------------------------------------------
-.. -*- coding: utf-8 -*- with BOM.
-
-.. include:: Includes.txt
-
-
-.. _start:
-
-=============================================================
-QFQ Extension
-=============================================================
-
-.. only:: html
-
-	:Classification:
-			qfq
-
-    	:Version:
-    		|release|
-
-	:Language:
-    		en
-
-    	:Description:
-	    		The extension offers support to:
-
-	    		 * Create HTML Forms by clicking them together,
-	    		 * Create reports based an SQL queries. The SQL can be nested and offers support for any kind of tags.
-
-    	:Keywords:
-		    		Quick Form Query, Form, Report, SQL, Query, Generator, Framework, Secure, Mobile Ready, Responsive.
-
-    	:Copyright:
-	    		2017
-
-    	:Author:
-				Carsten Rose, Rafael Ostertag
-
-    	:Email:
-		    	carsten.rose@math.uzh.ch, rafael.ostertag@math.uzh.ch
-
-    	:License:
-    		This document is published under the Open Publication License
-    		available from http://www.opencontent.org/openpub/
-
-	:Rendered:
-    		|today|
-
-	The content of this document is related to TYPO3,
-	a GNU/GPL CMS/Framework available from `www.typo3.org <https://typo3.org/>`__.
-
-
-	**Table of Contents**
-
-.. toctree::
-	:maxdepth: 4
-
-    	Manual
-    	Release
-    	Links
-    	README
diff --git a/extension/Documentation/html/_sources/Links.rst.txt b/extension/Documentation/html/_sources/Links.rst.txt
deleted file mode 100644
index 8829568f3..000000000
--- a/extension/Documentation/html/_sources/Links.rst.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-.. ==================================================
-.. FOR YOUR INFORMATION
-.. --------------------------------------------------
-.. -*- coding: utf-8 -*- with BOM.
-
-.. include:: Includes.txt
-
-
-.. _links:
-
-Links
------
-
-:TER:
-    	https://typo3.org/extensions/repository/view/<extension key>
-
-:Bug Tracker:
-    	https://forge.typo3.org/projects/extension-<extension key>/issues
-
-:Git Repository:
-    	https://github.com/<username>/<extension key>
-
-:Contact:
-    	`@<username> <https://twitter.com/your-username>`__
diff --git a/extension/Documentation/html/_sources/Manual.rst.txt b/extension/Documentation/html/_sources/Manual.rst.txt
deleted file mode 100644
index a55c9f407..000000000
--- a/extension/Documentation/html/_sources/Manual.rst.txt
+++ /dev/null
@@ -1,5854 +0,0 @@
-.. ==================================================
-.. Header hierachy
-.. ==
-..  --
-..   ^^
-..    ''
-..     ;;
-..      ,,
-..
-.. --------------------------------------------------
-.. Best Practice T3 reST  https://docs.typo3.org/typo3cms/drafts/github/xperseguers/RstPrimer/
-.. External Links: `Bootstrap <http://getbootstrap.com/>`_:
-.. Add Images: https://wiki.typo3.org/ReST_Syntax#Images
-..
-.. -*- coding: utf-8 -*- with BOM.
-
-
-.. include:: Includes.txt
-
-.. _general:
-
-General
-=======
-
-* Project homepage: https://git.math.uzh.ch/typo3/qfq
-* Latest relases: https://w3.math.uzh.ch/qfq/
-
-
-.. _installation:
-
-Installation
-============
-
-The following features are only tested on linux hosts:
-
-* HTML to PDF conversion - command `wkhtmltopdf`.
-* Concatenation of PDF files - command `pdftk`.
-* Mime type detection for uploads - command `file`.
-
-.. _`preparation`:
-
-Preparation
------------
-
-Report & Form
-^^^^^^^^^^^^^
-
-In PHP 5.x the QFQ extension needs  the PHP MySQL native driver. The following functions are used and are only available with the
-native driver (see also: http://dev.mysql.com/downloads/connector/php-mysqlnd/):
-
-* mysqli::get_result (important),
-* mysqli::fetch_all (nice to use)
-
-To normalize UTF8 input, the *php5-intl* resp. *php7.0-intl* package is needed by
-
-* normalizer::normalize()
-
-For the `download`_ function, the programs `pdftk` and `file` are necessary to concatenate PDF files.
-
-Preparation for Ubuntu 14.04::
-
-	sudo apt-get install php5-mysqlnd php5-intl
-	sudo apt-get install pdftk file                # for file upload and PDF
-	sudo php5enmod mysqlnd
-	sudo service apache2 restart
-
-Preparation for Ubuntu 16.04::
-
-	sudo apt install php7.0-intl
-	sudo apt install pdftk libxrender1 file        # for file upload, PDF and 'HTML to PDF' (wkhtmltopdf)
-
-.. _wkhtml:
-
-wkhtmltopdf
-^^^^^^^^^^^
-
-`wkhtmltopdf <http://wkhtmltopdf.org/>`_ will be used by QFQ to offer 'website print' and 'HTML to PDF' conversion.
-The program is not included in QFQ and has to be manually installed.
-
-* The Ubuntu package `wkhtmltopdf` needs a running Xserver - this does not work on a headless webserver.
-
-  * Best is to install the QT version from the named website above.
-  * In case of trouble with wkhtmltopdf, also install 'libxrender1'.
-
-In `config-qfq-ini`_ specify the:
-
-* installed `wkhtmltopdf` binary:
-
-  * `WKHTMLTOPDF = /.../wkhtmltopdf`
-
-* the site base URL:
-
-  * `BASE_URL_PRINT = http://example.com/`
-
-
-**Important**: To access FE_GROUP protected pages or content, it's necessary to disable the `[FE][lockIP]` check! `wkhtml`
-will access the Typo3 page locally (localhost) and that IP address is different from the client (=user) IP.
-
-Configure via Typo3 Installtool `All configuration > $TYPO3_CONF_VARS['FE']`: ::
-
-   [FE][lockIP] = 0
-
-**Warning**: this disables an important anti-'session hijacking' protection. The security level of the whole installation
-will be *lowered*! Again, this is only needed if `wkhtml` needs access to FE_GROUP protected pages & content. As an
-alternative to lower the security level, create a separated page subtree which is only accessible (configured via
-Typosript) from specific IPs **or** if a FE-User is logged in.
-
-If there are problems with converting/downloading FE_GROUP protected pages, check `SHOW_DEBUG_INFO = download` to debug.
-
-HTML to PDF conversion
-''''''''''''''''''''''
-
-`wkhtmltopdf` converts a website (local or remote) to a (multi)-page PDF file. It's mainly used in `download`_.
-
-Print
-'''''
-
-Different browser prints the same page in different variations. To prevent this, QFQ implements a small PHP wrapper
-`print.php` with uses `wkhtmltopdf` to convert HTML to PDF.
-
-Provide a `print this page`-link (replace {current pageId})::
-
-	<a href="typo3conf/ext/qfq/qfq/api/print.php?id={current pageId}">Print this page</a>
-
-Any parameter specified after `print.php` will be delivered to `wkhtmltopdf` as part of the URL.
-
-Typoscript code to implement a print link on every page::
-
-	10 = TEXT
-	10 {
-		wrap = <a href="typo3conf/ext/qfq/qfq/api/print.php?id=|&type=2"><span class="glyphicon glyphicon-print" aria-hidden="true"></span> Printview</a>
-		data = page:uid
-	}
-
-Setup
------
-
-* Install the extension via the Extensionmanager.
-
-  * If you install the extension by manual download/upload and get an error message
-    "can't activate extension": rename the downloaded zip file to `qfq.zip` or `qfq_<version>.zip` (e.g. version: 0.9.1).
-
-  * If the Extensionmanager stops after importing: check your memory limit in php.ini.
-
-* Enable the online local-documentation_.
-* Copy/rename the file *<Documentroot>/typo3conf/ext/<ext_dir>/config.example.qfq.ini* to
-  *<Documentroot>/typo3conf/config.qfq.ini* and configure the necessary values: `config.qfq.ini`_
-  The configuration file is outside the extension directory to not loose it during updates.
-* When the QFQ Extension is called the first time on the Typo3 Frontend, the file *<ext_dir>/qfq/sql/formEditor.sql* will
-  played and fills the database with the *Form editor* records. This also happens automatically after each software update of QFQ.
-* Configure Typoscript to include Bootstrap, jQuery, QFQ javascript and CSS files.
-
-::
-
-	page.meta {
-	  X-UA-Compatible = IE=edge
-	  X-UA-Compatible.attribute = http-equiv
-	  viewport=width=device-width, initial-scale=1
-	}
-
-	page.includeCSS {
-		file1 = typo3conf/ext/qfq/Resources/Public/Css/bootstrap.min.css
-		file2 = typo3conf/ext/qfq/Resources/Public/Css/bootstrap-theme.min.css
-		file3 = typo3conf/ext/qfq/Resources/Public/Css/jqx.base.css
-		file4 = typo3conf/ext/qfq/Resources/Public/Css/jqx.bootstrap.css
-		file5 = typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css
-	}
-
-	page.includeJS {
-		file1 = typo3conf/ext/qfq/Resources/Public/JavaScript/jquery.min.js
-		file2 = typo3conf/ext/qfq/Resources/Public/JavaScript/bootstrap.min.js
-		file3 = typo3conf/ext/qfq/Resources/Public/JavaScript/validator.min.js
-		file4 = typo3conf/ext/qfq/Resources/Public/JavaScript/jqx-all.js
-		file5 = typo3conf/ext/qfq/Resources/Public/JavaScript/globalize.js
-		file6 = typo3conf/ext/qfq/Resources/Public/JavaScript/tinymce.min.js
-		file7 = typo3conf/ext/qfq/Resources/Public/JavaScript/EventEmitter.min.js
-		file8 = typo3conf/ext/qfq/Resources/Public/JavaScript/qfq.min.js
-	}
-
-.. _form-editor:
-
-FormEditor
-----------
-
-Setup a *report* to manage all *forms*:
-
-* Create a Typo3 page.
-* Set the 'URL Alias' to `form` (default) or the individual defined value in parameter EDIT_FORM_PAGE (config.qfq.ini).
-* Insert a content record of type *qfq*.
-* In the bodytext insert the following code:
-
-::
-
-	# If there is a form given by SIP: show
-	form={{form:SE}}
-
-	10 {
-		# List of Forms: Do not show this list of forms if there is a form given by SIP.
-		# Table header.
-		sql = SELECT CONCAT('{{pageId:T}}&form=form&') as _Pagen, '#', 'Name', 'Title', 'Table', '' FROM (SELECT 1) AS fake WHERE  '{{form:SE}}'=''
-		head = <table class="table table-hover qfq-table-50">
-		tail = </table>
-		rbeg = <thead><tr>
-		rend = </tr></thead>
-		fbeg = <th>
-		fend = </th>
-
-		10 {
-			# All forms
-			sql = SELECT CONCAT('{{pageId:T}}&form=form&r=', f.id) as _Pagee, f.id, f.name, f.title, f.tableName, CONCAT('form=form&r=', f.id) as _Paged FROM Form AS f ORDER BY f.name
-			rbeg = <tr>
-			rend = </tr>
-			fbeg = <td>
-			fend = </td>
-		}
-	}
-
-.. _config-qfq-ini:
-
-config.qfq.ini
---------------
-
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| Keyword                     | Example                                         | Description                                                                |
-+=============================+=================================================+============================================================================+
-| DB_<n>_USER                 | DB_1_USER=qfqUser                               | Credentials configured in MySQL                                            |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DB_<n>_PASSWORD             | DB_1_PASSWORD=1234567890                        | Credentials configured in MySQL                                            |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DB_<n>_SERVER               | DB_1_SERVER=localhost                           | Hostname of MySQL Server                                                   |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DB_<n>_NAME                 | DB_1_NAME=qfq_db                                | Database name                                                              |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DB_INIT                     | DB_INIT=set names utf8                          | Global init for using the database.                                        |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DB_INDEX_DATA               | DB_INDEX_DATA = 1                               | Optional. Default: 1.                                                      |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DB_INDEX_QFQ                | DB_INDEX_QFQ = 1                                | Optional. Default: 1.                                                      |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SQL_LOG                     | SQL_LOG=sql.log                                 | Filename to log SQL commands: relative to <ext_dir> or absolute.           |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SQL_LOG_MODE                | SQL_LOG_MODE=modify                             | *all*: every statement will be logged - this might a lot.                  |
-|                             |                                                 | *modify*: log only statements who change data.                             |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SHOW_DEBUG_INFO             | SHOW_DEBUG_INFO=auto                            | FE - Possible values: yes|no|auto|download. For 'auto': If a BE User is    |
-|                             |                                                 | logged in, a debug information will be shown on the FE.                    |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| REDIRECT_ALL_MAIL_TO        | REDIRECT_ALL_MAIL_TO=john@doe.com               | If set, redirect all QFQ generated mails (Form, Report) to the specified.  |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| CSS_LINK_CLASS_INTERNAL     | CSS_LINK_CLASS_INTERNAL=internal                | CSS class name of links which points to internal tagets                    |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| CSS_LINK_CLASS_EXTERNAL     | CSS_LINK_CLASS_EXTERNAL=external                | CSS class name of links which points to internal tagets                    |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| CSS_CLASS_QFQ_CONTAINER     |CSS_CLASS_QFQ_CONTAINER=container                | QFQ with own Bootstrap: 'container'.                                       |
-|                             |                                                 | QFQ already nested in Bootstrap of mainpage: <empty>                       |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| CSS_CLASS_QFQ_FORM          | CSS_CLASS_QFQ_FORM=qfq-color-base               | Wrap around QFQ 'Form'                                                     |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| CSS_CLASS_QFQ_FORM_PILL     |CSS_CLASS_QFQ_FORM_PILL=qfq-color-grey-1         | Wrap around title bar for pills: CSS Class, typically a background color   |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| CSS_CLASS_QFQ_FORM_BODY     |CSS_CLASS_QFQ_FORM_BODY=qfq-color-grey-2         | Wrap around formelements: CSS Class, typically a background color          |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DATE_FORMAT                 | DATE_FORMAT= yyyy-mm-dd                         | Possible options: yyyy-mm-dd, dd.mm.yyyy                                   |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_DATA_PATTERN_ERROR     |FORM_DATA_PATTERN_ERROR=please check pa.         | Customizable error message used in validator.js. 'pattern' violation       |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_DATA_REQUIRED_ERROR    |FORM_DATA_REQUIRED_ERROR=missing value           | Customizable error message used in validator.js. 'required' fields         |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_DATA_MATCH_ERROR       |FORM_DATA_MATCH_ERROR=type error                 | Customizable error message used in validator.js. 'match' retype mismatch   |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_DATA_ERROR             |FORM_DATA_ERROR=generic error                    | Customizable error message used in validator.js. 'no specific' given       |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_BS_COLUMNS             | FORM_BS_COLUMNS=12                              | The whole form will be wrapped in 'col-md-??'. Default is 12 for 100%      |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_BS_LABEL_COLUMNS       | FORM_BS_LABEL_COLUMNS = 3                       | Default number of BS columns for the 'label'-column                        |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_BS_INPUT_COLUMNS       | FORM_BS_INPUT_COLUMNS = 6                       | Default number of BS columns for the 'input'-column                        |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_BS_NOTE_COLUMNS        | FORM_BS_NOTE_COLUMNS = 3                        | Default number of BS columns for the 'note'-column                         |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_BUTTON_ON_CHANGE_CLASS | FORM_BUTTON_ON_CHANGE_CLASS=alert-info btn-info | Color for save button after modification                                   |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| BASE_URL_PRINT              | BASE_URL_PRINT=http://example.com               | URL where wkhtmltopdf will fetch the HTML (no parameter, those comes later)|
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| WKHTMLTOPDF                 | WKHTMLTOPDF=/usr/bin/wkhtmltopdf                | Binary where to find wkhtmltopdf.                                          |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| EDIT_FORM_PAGE              | EDIT_FORM_PAGE = form                           | T3 Pagealias to edit a form.                                               |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| LDAP_1_RDN                  | LDAP_1_RDN='ou=Admin,ou=example,dc=com'         | Credentials for non-anonymous LDAP access. At the moment only one set of   |
-+-----------------------------+-------------------------------------------------+ crendentials is supported.                                                 |
-| LDAP_1_PASSWORD             | LDAP_1_PASSWORD=mySecurePassword                |                                                                            |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| ESCAPE_TYPE_DEFAULT         | ESCAPE_TYPE_DEFAULT=s                           | All variables `{{...}}` get this escape class by default.                  |
-|                             |                                                 | See `variable-escape`_.                                                    |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SECURITY_VARS_HONEYPOT      | SECURITY_VARS_HONEYPOT = email,username,password| If empty: no check. All named variables will rendered as INPUT elements    |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SECURITY_ATTACK_DELAY       | SECURITY_ATTACK_DELAY = 5                       | If an attack is detected, sleep 'x' seconds and exit PHP process           |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SECURITY_SHOW_MESSAGE       | SECURITY_SHOW_MESSAGE = true                    | If an attack is detected, show a message                                   |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SECURITY_GET_MAX_LENGTH     | SECURITY_GET_MAX_LENGTH = 50                    | GET vars longer than 'x' chars triggers an `attack-recognized`.            |
-|                             |                                                 | `ExceptionMaxLength`_                                                      |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| GFX_EXTRA_BUTTON_INFO_INLINE| <img src="info.png">                            | Image for `extraButtonInfo`_ (inline)                                      |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| GFX_EXTRA_BUTTON_INFO_BELOW | <img src="info.png">                            | Image for `extraButtonInfo`_ (below)                                       |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| EXTRA_BUTTON_INFO_POSITION  | SYSTEM_EXTRA_BUTTON_INFO_POSITION=below         | 'auto' (default) or 'below'. See `extraButtonInfo`_                        |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| EXTRA_BUTTON_INFO_CLASS     | SYSTEM_EXTRA_BUTTON_INFO_CLASS=pull-right       | '' (default) or 'pull-right'. See `extraButtonInfo`_                       |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SAVE_BUTTON_TEXT            | SAVE_BUTTON_TEXT =                              | Default text on the form save button. Typically none.                      |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SAVE_BUTTON_TOOLTIP         | SAVE_BUTTON_TOOLTIP = save                      | Default tooltip on the form save button.                                   |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SAVE_BUTTON_CLASS           | SAVE_BUTTON_CLASS = btn btn-default navbar-btn  | Default Bootstrap CSS class for buttons on top of the form                 |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| SAVE_BUTTON_GLYPH_ICON      | SAVE_BUTTON_GLYPH_ICON = glyphicon-ok           | Default Icon for the form save button                                      |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| CLOSE_BUTTON_TEXT           | CLOSE_BUTTON_TEXT =                             | Default text on the form close button. Typically none.                     |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| CLOSE_BUTTON_TOOLTIP        | CLOSE_BUTTON_TOOLTIP = close                    | Default tooltip on the form close button.                                  |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| CLOSE_BUTTON_CLASS          | CLOSE_BUTTON_CLASS = btn btn-default navbar-btn | Default Bootstrap CSS class for buttons on top of the form                 |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| CLOSE_BUTTON_GLYPH_ICON     | CLOSE_BUTTON_GLYPH_ICON = glyphicon-remove      | Default Icon for the form close button                                     |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DELETE_BUTTON_TEXT          | DELETE_BUTTON_TEXT =                            | Default text on the form delete button. Typically none.                    |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DELETE_BUTTON_TOOLTIP       | DELETE_BUTTON_TOOLTIP = delete                  | Default tooltip on the form delete button.                                 |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DELETE_BUTTON_CLASS         | DELETE_BUTTON_CLASS = btn btn-default navbar-btn| Default Bootstrap CSS class for buttons on top of the form                 |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DELETE_BUTTON_GLYPH_ICON    | DELETE_BUTTON_GLYPH_ICON = glyphicon-trash      | Default Icon for the form delete button                                    |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| NEW_BUTTON_TEXT             | NEW_BUTTON_TEXT =                               | Default text on the form new button. Typically none.                       |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| NEW_BUTTON_TOOLTIP          | NEW_BUTTON_TOOLTIP = new                        | Default tooltip on the form new button.                                    |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| NEW_BUTTON_CLASS            | NEW_BUTTON_CLASS = btn btn-default navbar-btn   | Default Bootstrap CSS class for buttons on top of the form                 |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| NEW_BUTTON_GLYPH_ICON       | NEW_BUTTON_GLYPH_ICON = glyphicon-plus          | Default Icon for the form new button                                       |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DB_UPDATE                   | DB_UPDATE = auto                                | 'auto': apply DB Updates only if there is a newer version.                 |
-|                             |                                                 | 'always': apply DB Updates always, especially play formEditor.sql every    |
-|                             |                                                 | time QFQ is called - *not* recommended!                                    |
-|                             |                                                 | 'never': never apply DB Updates.                                           |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DIRTY_RECORD_TIMEOUT_SECONDS| DIRTY_RECORD_TIMEOUT_SECONDS = 900              | Timeout for record locking. After this time, a record will be replaced     |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| DOCUMENTATION_QFQ           | DOCUMENTATION_QFQ=http://docs.typo3.org...      | Link to the online documentation of QFQ. Every QFQ installation also       |
-|                             |                                                 | contains a local copy: typo3conf/ext/qfq/Documentation/html/Manual.html    |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| VAR_ADD_BY_SQL              | VAR_ADD_BY_SQL = {{!SELECT s.id AS ...          | Specific values read from the database to fill the system store during QFQ |
-|                             |                                                 | load. See `VariablesAddBySql`_ for a usecase.                              |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_LANGUAGE_A_ID          | FORM_LANGUAGE_A__ID = 1                         | In Typo3 configured pageLanguage id. The number after the 'L' parameter.   |
-| FORM_LANGUAGE_B_ID          |                                                 |                                                                            |
-| FORM_LANGUAGE_C_ID          |                                                 |                                                                            |
-| FORM_LANGUAGE_D_ID          |                                                 |                                                                            |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_LANGUAGE_A_LABEL       | FORM_LANGUAGE_A_LABEL = english                 | Label shown in *Form editor*, on the 'basic' tab.                          |
-| FORM_LANGUAGE_B_LABEL       |                                                 |                                                                            |
-| FORM_LANGUAGE_C_LABEL       |                                                 |                                                                            |
-| FORM_LANGUAGE_D_LABEL       |                                                 |                                                                            |
-+-----------------------------+-------------------------------------------------+----------------------------------------------------------------------------+
-
-Example: *typo3conf/config.qfq.ini*
-
-::
-
-	; To get internal default values, inactivate the option by commenting (= ';') it.
-	DB_1_USER = qfqUser
-	DB_1_SERVER = localhost
-	DB_1_PASSWORD = 12345678
-	DB_1_NAME = qfq_db
-	DB_INIT = set names utf8
-	; DB_INDEX_DATA = 1
-   ; DB_INDEX_QFQ = 1
-	; SQL_LOG = sql.log
-	; SQL_LOG_MODE = modify
-	; SHOW_DEBUG_INFO = auto
-	; REDIRECT_ALL_MAIL_TO = john.doe@example.com
-	CSS_LINK_CLASS_INTERNAL = internal
-	CSS_LINK_CLASS_EXT = external
-	; CSS_CLASS_QFQ_CONTAINER =
-	; CSS_CLASS_QFQ_FORM =
-	CSS_CLASS_QFQ_FORM_PILL = qfq-color-grey-1
-	CSS_CLASS_QFQ_FORM_BODY = qfq-color-grey-2
-	; DATE_FORMAT= yyyy-mm-dd
-
-	; TECHNICAL CONTACT = john@doe.com
-
-	; FORM_DATA_PATTERN_ERROR =
-	; FORM_DATA_REQUIRED_ERROR =
-	; FORM_DATA_MATCH_ERROR =
-	; FORM_DATA_ERROR =
-
-	; FORM_BS_COLUMNS = 12
-	; FORM_BS_LABEL_COLUMNS = 3
-	; FORM_BS_INPUT_COLUMNS = 6
-	; FORM_BS_NOTE_COLUMNS = 3
-
-	BASE_URL_PRINT=http://example.com/
-	WKHTMLTOPDF=/usr/bin/wkhtmltopdf
-
-	; EDIT_FORM_PAGE = form
-
-	; LDAP_1_RDN='ou=Admin,dc=example,dc=com'
-	; LDAP_1_PASSWORD=mySecurePassword
-
-	; ESCAPE_TYPE_DEFAULT=s
-	; SECURITY_VARS_HONEYPOT=email,username,password
-	; SECURITY_ATTACK_DELAY=5
-	; SECURITY_SHOW_MESSAGE=true
-	; SECURITY_GET_MAX_LENGTH=50
-
-	;SAVE_BUTTON_TEXT =
-	;SAVE_BUTTON_TOOLTIP = save
-	;SAVE_BUTTON_CLASS = btn btn-default navbar-btn
-	;SAVE_BUTTON_GLYPH_ICON = glyphicon-ok
-
-	;CLOSE_BUTTON_TEXT =
-	;CLOSE_BUTTON_TOOLTIP = close
-	;CLOSE_BUTTON_CLASS = btn btn-default navbar-btn
-	;CLOSE_BUTTON_GLYPH_ICON = glyphicon-remove
-
-	;DELETE_BUTTON_TEXT =
-	;DELETE_BUTTON_TOOLTIP = delete
-	;DELETE_BUTTON_CLASS = btn btn-default navbar-btn
-	;DELETE_BUTTON_GLYPH_ICON = glyphicon-trash
-
-	;NEW_BUTTON_TEXT =
-	;NEW_BUTTON_TOOLTIP = new
-	;NEW_BUTTON_CLASS = btn btn-default navbar-btn
-	;NEW_BUTTON_GLYPH_ICON = glyphicon-plus
-
-	; auto | always | never
-	;DB_UPDATE = auto
-
-	;RECORD_LOCK_TIMEOUT_SECONDS = 900
-
-	; Local Documentation (doc fits to installed version):  typo3conf/ext/qfq/Documentation/html/Manual.html
-	;DOCUMENTATION_QFQ = https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/Manual.html
-
-	;VAR_ADD_BY_SQL = {{!SELECT s.id AS _periodId FROM Period AS s WHERE s.start<=NOW() ORDER BY s.start DESC LIMIT 1}}
-
-	;FORM_LANGUAGE_A_ID = 1
-	;FORM_LANGUAGE_A_LABEL = english
-
-	;GFX_EXTRA_BUTTON_INFO_INLINE = <img src='info.png'>
-	;GFX_EXTRA_BUTTON_INFO_BELOW = <img src='info.png'>
-	;EXTRA_BUTTON_INFO_POSITION = auto | below
-	;EXTRA_BUTTON_INFO_CLASS = pull-right
-
-.. _`CustomVariables`:
-
-Custom variables
-^^^^^^^^^^^^^^^^
-
-It's also possible to setup custom variables in `config.qfq.ini`.
-
-E.g. to setup a contact address and reuse the information inside your installation do:
-
- * `config.qfq.in`::
-
-		ADMINISTRATIVE_CONTACT = john@doe.com
-		ADMINISTRATIVE_ADDRESS = John Doe, Hollywood Blvd. 1, L.A.
-		ADMINISTRATIVE_NAME = John Doe
-
- * Somewhere in a `Form` or in `Report`::
-
-      {{ADMINISTRATIVE_CONTACT:Y}}, {{ADMINISTRATIVE_ADDRESS:Y}}, {{ADMINISTRATIVE_NAME}}
-
-.. _`VariablesAddBySql`:
-
-Variables add by SQL
-^^^^^^^^^^^^^^^^^^^^
-
-A specified SELECT statement in `config.qfq.ini`_ in variable `VAR_ADD_BY_SQL` fill be fired after filling the SYSTEM STORE.
-The query should have 0 (nothing happens) or 1 row. The column names and column values will be added as variables to the SYSTEM_STORE.
-Existing variables will be overwritten. Be carefull not to overwrite needed values.
- 
-This option is usefull to make generic custom values, saved in the database, accessible to all QFQ Report and Forms.
-Access such variables as usual via `{{<varname>:Y}}`.
-
-.. _`periodId`:
-
-periodId
-''''''''
-
-This is
-
-* a usecase, implemented via `VariablesAddBySql`_,
-* a way to access `Period.id` with respect to the current period (the period itself is custom defined).
-
-After a full QFQ installation, three things are prepared:
-
-* a table `Period` (extend / change it to your needs, fill them with your periods),
-* one sample record in table `Period`,
-* in `config.qfq.ini`_ the default definition of `VAR_ADD_BY_SQL` will set the variable `periodId` during QFQ load.
-
-Websites, delivering semester data, schoolyears schedules, or any other type or periods, often need an index to the
-*current* period. One way is a) to mark the current period and b) to change the marker every time when the next period
-becomes current.
-The QFQ approach works without a marker and without manual intervention: the whished index will be computed during QFQ load.
-
-In `config.qfq.ini`: ::
-
-	VAR_ADD_BY_SQL = SELECT id AS periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1
-
-a variable 'periodId' will automatically computed and filled in STORE SYSTEM. Access it via `{{periodId:Y0}}`.
-To get the name and current period: ::
-
-  SELECT name, ' / ', start FROM Period WHERE id={{periodId:Y0}}
-
-Typically, it's necessary to offer a 'previous' / 'next' link. In this example, the STORE SIP holds the new periodId: ::
-
-  SELECT CONCAT('id={{pageId:T}}&periodId=', {{periodId:SY0}}-1, '|Next') AS _Page, ' ', name, ' ', CONCAT('id={{pageId:T}}&periodId=', {{periodId:SY0}}+1, '|Next') AS _Page FROM Period AS s WHERE s.id={{periodId:SY0}}
-
-Take care for minimum and maximum indexes (do not render the links if out of range).
-
-.. _`DbUserPrivileges`:
-
-DB USER privileges
-^^^^^^^^^^^^^^^^^^
-
-The specified DB User needs privileges to the database of at least: SELECT / INSERT / UPDATE / DELETE / SHOW.
-
-To apply automatically QFQ-'DB UPDATE' the following rights are mandatory too: CREATE / ALTER
-
-To get access to the Typo3 installation, 'dbuser' should also have acces to the Typo3 Database with at least SELECT / INSERT / UPDATE / DELETE.
-
-
-
-.. _`ExceptionMaxLength`:
-
-Exception for SECURITY_GET_MAX_LENGTH
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-If it is necessary to use a GET variable which exceeds SECURITY_GET_MAX_LENGTH limit, name the variable with '_<num>' at
-the end. E.g. `my_long_variable_130`. Such a variable has an allowed length of 130 chars. Access the variable as
-usual with the variable name: `{{my_long_variable_130:C:...}}`.
-
-
-.. _local-documentation:
-
-Local Documentation
--------------------
-
-A HTML rendered version is available under: <your site>/typo3conf/ext/qfq/Documentation/html/Index.html
-
-If you get a 'Page forbidden / not found' there might be some Webserver restrictions. E.g. the Typo3 example of `.htaccess`
-in the Typo3 installation folder will forbid access to any extension documentation (which is a good idea on a productive
-server). For a development server instead, deactivate the forbid rule of 'documentation'. In `.htaccess` (snippet from
-Typo3 7.6 _.htaccess): ::
-
-  production:   RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]
-  development:  RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|docs?)/ - [F]
-
-.. _concept:
-
-Concept
-=======
-
-SIPs
-----
-
-The following is a technical background information. Not needed to just use QFQ.
-
-The SIPs (=Server Id Pairs) are uniq timestamps, created/registered on the fly for a specific browser session (=user). Every SIP is
-registered on the server (= stored in a PHP Session) and contains one or more key/value pairs. The key/value pairs never leave
-the server. The SIPs will be used:
-
-* to protect values not to be spoofed by anyone,
-* to protect values not to be altered by anyone,
-* to grant access, e.g.:
-
-  * load and save forms,
-  * upload files,
-  * download files,
-  * PHP AJAX pages.
-
-SIPs becomes invalid, as soon as the current browser session is destroyed. The client (= user) can't manipulate the content
-of SIPs - it's only possible to reuse already registered SIPs by the user, who already owns the session.
-
-Access privileges
------------------
-
-The Typo3 FE Groups can be used to implement access privileges. Such groups are assigned to
-
-* Typo3 FE users,
-* Typo3 pages,
-* and/or Typo3 content records (e.g. QFQ records).
-
-This will be used for general page structure privileges.
-
-A `record base` privileges controlling (e.g. which user can edit
-which person record) will be implicit configured, by the way that records are viewable / editable (or not) through
-SQL in the specific QFQ tt-content statements.
-
-Typo3 QFQ content element
--------------------------
-
-Insert one or more QFQ content elements on a Typo3 page. Specify column and language per content record as wished.
-
-The title of the QFQ content element will not be rendered. It's only visible in the backend for orientation.
-
-QFQ Keywords (Bodytext)
-^^^^^^^^^^^^^^^^^^^^^^^
-
- +-------------------+---------------------------------------------------------------------------------+
- | Name              | Explanation                                                                     |
- +===================+=================================================================================+
- | form              | Formname defined in ttcontent record bodytext                                   |
- |                   | - Fix. E.g.: **form = person**                                                  |
- |                   | - by SIP: **form = {{form}}**                                                   |
- |                   | - by SQL: **form = {{SELECT c.form FROM conference AS c WHERE c.id={{a:C}} }}** |
- +-------------------+---------------------------------------------------------------------------------+
- | r                 | <record id> The form will load the record with the specified id                 |
- |                   | - Variants: **r = 123**, by SQL: **r = {{SELECT ...}}**                         |
- |                   | - If not specified, the default is '0'                                          |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.db        | Select a DB. Only necessary if a different than the standard DB should be used. |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.fbeg      | Start token for every field (=column)                                           |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.fend      | End token for every field (=column)                                             |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.head      | Start token for whole <level>                                                   |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.tail      | End token for whole <level>                                                     |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.rbeg      | Start token for row.                                                            |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.rbgd      | Alternating (per row) token                                                     |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.rend      | End token for row. Will be rendered **before** subsequent levels are processed  |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.renr      | End token for row. Will be rendered **after** subsequent levels are processed   |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.rsep      | Seperator token between rows                                                    |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.fsep      | Seperator token between fields (=columns)                                       |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.sql       | SQL Query                                                                       |
- +-------------------+---------------------------------------------------------------------------------+
- | <level>.althead   | If <level>.sql is empty, these token will be rendered                           |
- +-------------------+---------------------------------------------------------------------------------+
- | debugShowBodyText | If='1' and config.qfq.ini:*SHOW_DEBUG_INFO = yes*, shows a tooltip with bodytext|
- +-------------------+---------------------------------------------------------------------------------+
- | sqlLog            | Overwrites config.qfq.ini: `SQL_LOG`_ . Only affects `Report`, not `Form`.      |
- +-------------------+---------------------------------------------------------------------------------+
- | sqlLogMode        | Overwrites config.qfq.ini: `SQL_LOG_MODE`_ . Only affects `Report`, not `Form`. |
- +-------------------+---------------------------------------------------------------------------------+
-
-.. _debug:
-
-Debug
-^^^^^
-
-File: `config.qfq.ini`_
-
-.. _SQL_LOG:
-
-* *SQL_LOG*
-
-  * Filename where to log SQL queries and statistical data.
-  * File is relative to the extension directory or absolute (starting with '/').
-  * Content: SQL queries and timestamp, formName/formId, fe_user, success, affected rows, newly created record
-    id's and accessed from IP.
-  * The global setting can be overwritten by defining `sqlLog` inside of a QFQ tt-content record.
-
-
-.. _SQL_LOG_MODE:
-
-* *SQL_LOG_MODE = all|modify|error|none*
-
-  * *all*: logs every SQL statement.
-  * *modify*: logs only statements who might potentially change data.
-  * *error*: logs only queries which generate SQL errors.
-  * *none*: no query logging at all.
-  * The global setting can be overwritten by defining `sqlLogMode` inside of a QFQ tt-content record.
-
-* *SHOW_DEBUG_INFO = [yes|no|auto],[download]*
-
-  If active, displays additional information in the Frontend (FE). This is typically helpful during development.
-
-  * *yes*:
-
-    * Form:
-
-      * For every internal link/button, show tooltips with decoded SIP on mouseover.
-      * Shows an 'Edit form'-button (wrench symbol) on a form. The link points to the T3 page with the :ref:`form-editor`.
-
-    * Report: Will be configured per tt-content record.
-
-      *debugShowBodyText = 1*
-
-  * *no*: No debug info.
-
-  * *auto*: Depending if there is a Typo3 BE session, set internally:
-
-    * *SHOW_DEBUG_INFO = yes*  (BE session exist)
-    * *SHOW_DEBUG_INFO = no*   (no BE session)
-
-  * *download*:
-
-    * During a download (especially by using wkhtml), temporary files are not deleted automatically. Also the
-      `wkhtmltopdf` and `pdftk` commandlines will be logged to `SQL_LOG`_. Use this only to debug problems on download.
-
-.. _REDIRECT_ALL_MAIL_TO:
-
-* *REDIRECT_ALL_MAIL_TO=john@doe.com*
-
-  * During the development, it might be helpful to configure a 'catch all' email address, which QFQ uses as the final receiver
-    instead of the original intended one.
-
-  * The setting will:
-
-    * Replace the 'To' with the configured one.
-    * Clear 'CC' and 'Bcc'
-    * Write a note and the original configured receiver at the top of the email body.
-
-.. _variables:
-
-Databases
----------
-
-A Typo3 / QFQ Installation needs at least two databases. One for the Typo3 installation and one for QFQ.
-
-QFQ itself can be separated in 'QFQ system' and 'QFQ data' databases, if necessary (than at least three databases are needed).
-Furthermore a `Form` can operate on any additional database, specified per `Form`.parameter.dbIndex and configured via `config.qfq.ini`_.
-
-* Option 'A' is the most simple and commonly used.
-* Option 'B' separate the T3 and QFQ databases on two database hosts.
-* Option 'C' is like 'B' but with a shared 'QFQ data'-database between three 'Typo3 / QFQ' instances.
-* Further variants are possible.
-
-+---+----------------+--------------+-------------------------------+------------------------------+----------------------------------+
-|   | Domain         | Website Host | T3                            | QFQ system                   | QFQ data                         |
-+===+================+==============+===============================+==============================+==================================+
-| A | standalone.edu | 'w'          | <dbHost>, <dbname>_t3, <dbnameSingle>_db                                                        |
-+---+----------------+--------------+-------------------------------+------------------------------+----------------------------------+
-| B | appB1.edu      | 'wApp'       | <dbHostApp>, <dbnameB1>_t3    | <dbHostB1>, <dbnameApp>_db                                      |
-+---+----------------+--------------+-------------------------------+------------------------------+----------------------------------+
-| B | appB2.edu      | 'wApp'       | <dbHostApp>, <dbnameB2>_t3    | <dbHostB2>, <dbnameApp>_db                                      |
-+---+----------------+--------------+-------------------------------+------------------------------+----------------------------------+
-| C | appC1.edu      | 'wAppC'      | <dbHostAppC>, <dbnameC1>_t3   | <dbHostC>, <dbnameSysC1>_db  | <dbHostData>_db, <dbNameData>_db |
-+---+----------------+--------------+-------------------------------+------------------------------+----------------------------------+
-| C | appC2.edu      | 'wAppC'      | <dbHostAppC>, <dbnameC2>_t3   | <dbHostC>, <dbnameSysC2>_db  | <dbHostData>_db, <dbNameData>_db |
-+---+----------------+--------------+-------------------------------+------------------------------+----------------------------------+
-| C | appC3.edu      | 'wAppC3'     | <dbHostAppC3>, <dbnameC3>_t3  | <dbHostC3>, <dbnameSysC3>_db | <dbHostData>_db, <dbNameData>_db |
-+---+----------------+--------------+-------------------------------+------------------------------+----------------------------------+
-
-In `config.qfq.ini`_ mutliple database credentials can be prepared. Mandatory is at least one credential setup like
-`DB_1_USER`, `DB_1_SERVER`, `DB_1_PASSWORD`, `DB_1_NAME`. The number '1' indicates the `dbIndex`. Increment the number
-to specify further database credential setups.
-
-Often the `DB_1_xxx` is identically to the used Typo3 database credentials.
-
-If not explicit specified, 'QFQ system' and 'QFQ database' will use the same database with the same credentials (setup 'A').
-
-To define separate 'QFQ data' and 'QFQ system', in `config.qfq.ini`_ define  `DB_1_USER`, ... (e.g. 'QFQ data') and `DB_2_USER`,
-... (e.g. 'QFQ system') and specify the assignment::
-
-	DB_INDEX_DATA = 1
-	DB_INDEX_QFQ = 2
-
-To let a form operate (show, load and save) on a different database, use `Form.parameter.dbIndexData` (see `form-parameter`_).
-
-Different QFQ versions, shared database
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-When using different QFQ versions and a shared 'QFQ data'-database, there is some risk of conflicting
-'QFQ system' tables. Best is to always use the same QFQ version on all instances.
-
-Variable
-========
-
-Most elements of a Form, FormElement or Report might contain (QFQ) variables. Such variables are surrounded by
-double curly braces. Three different types of functionality are provided. Access to:
-
-* `store-variables`_
-* `sql-variables`_
-* `column-variables`_
-
-Some examples, including nesting::
-
-  # Store
-  #---------------------------------------------
-  {{r}}
-  {{index:FS}}
-  {{name:FS:alnumx:s}}
-
-  # SQL
-  #---------------------------------------------
-  {{SELECT name FROM person WHERE id=1234}}
-
-  # Columns
-  #---------------------------------------------
-  {{10.pId}}
-  {{10.20.pId}}
-
-  # Nesting
-  #---------------------------------------------
-  {{SELECT name FROM person WHERE id={{r}} }}
-  {{SELECT name FROM person WHERE id={{key1:C:alnumx}} }} # explained below
-  {{SELECT name FROM person WHERE id={{SELECT id FROM pf LIMIT 1}} }} # it's more efficient to use only one query
-
-
-Leading and trailing spaces inside curly braces are removed.
-
-  * *{{ SELECT "Hello World"   }}* becomes *{{SELECT "Hello World"}}*
-  * *{{ varname   }}* becomes *{{varname}}*
-
-Types
------
-
-.. _`store-variables`:
-
-Store variables
-^^^^^^^^^^^^^^^
-
-Syntax:  *{{VarName[:<store / prio>[:<sanitize class>[:<escape>]]]}}*
-
-* Example::
-
-  {{pId}}
-  {{pId:FSE}}
-  {{pId:FSE:digit}}
-  {{name:FSE:alnumx:m}}
-
-* Zero or more stores might be specified to be searched for the given VarName.
-* If no store is specified, the by default searched stores are: **FSRVD** (=FORM > SIP > RECORD > VARS > DEFAULT).
-* If the VarName is not found in one store, the next store is searched,  up to the last specified store.
-* If the VarName is not found in any store, nothing is replaced - the string '{{<VarName>}}' remains.
-* If anywhere along the line an empty string is found, this **is** a value: therefore, the search will stop.
-
-See also:
-
- * `store`_
- * `variable-escape`_
- * `sanitize-class`_
-
-
-.. _`sql-variables`:
-
-SQL variables
-^^^^^^^^^^^^^
-
-* The detection of an SQL command is case *insensitive*.
-* Leading  whitespace will be skipped.
-* The following commands are interpreted as SQL commands:
-
-  * SELECT
-  * INSERT, UPDATE, DELETE, REPLACE, TRUNCATE
-  * SHOW, DESCRIBE, EXPLAIN, SET
-
-* A SQL Statement might contain parameters, including additional SQL statements. Inner SQL queries will be executed first.
-* All variables will be substituted one by one from inner to outer.
-* The number of variables inside an input field or a SQL statement is not limited.
-* A resultset of a SQL statement will be imploded over all: concat all columns of a row, concat all rows - there is no glue string.
-
-* Example::
-
-  {{SELECT id, name FROM Person}}
-  {{SELECT id, name, IF({{feUser}}=0,'Yes','No')  FROM Person WHERE id={{r:S}} }}
-  {{SELECT id, city FROM Address AS adr WHERE adr.accId={{SELECT id FROM Account AS acc WHERE acc.name={{feUser}} }} }}
-
-* Special case for `SELECT` input fields and FormElement.type=action `sqlValidate`. To deliver a result array specify an '!' before the SELECT: ::
-
-   {{!SELECT ...}}
-
-
-.. _`column-variables`:
-
-Column variables
-^^^^^^^^^^^^^^^^
-
-Syntax:  *{{<level>.<column>}}*
-
-Only used in report to access outer columns. See `access-column-values`_ and `syntax-of-report`_.
-
-There might be name conflicts between VarName / SQL keywords and <line identifier>. QFQ checks first for '<level>',
-than for 'SQL keywords' and than for 'VarNames' in stores.
-
-All types might be nested with each other. There is no limit of nesting variables.
-
-Very specific: Also, it's possible that the content of a variable is again (including curly braces) a variable - this
-is sometimes used in text templates, where the template is retrieved from a record and
-specific locations in the text will be (automatically by QFQ) replaced by values from other sources.
-
-.. _`sanitize-class`:
-
-Sanitize class
---------------
-
-* If a value violates a parameter sanitize class, the value becomes an empty string.
-* Per store there is a default if sanitizing applies and if yes, which class.
-
-  * Store *C* (Client=Browser) and store *F* (Form) will be sanitized with 'digit'.
-
-* All `predefined-variable-names`_ have a specific default sanitize class. For these variables, it's not necessary
-  to specify a sanitize class.
-* All other variables (Store: C, F) get by default the sanitize class defined in the corresponding form. If not defined,
-  the default class is 'digit'.
-* A default sanitize class can be overwritten by individual definition: *{{a:C:all}}*
-* If there is a sanitized class specified, it applies to all given stores.
-
-For QFQ variables and FormElements:
-
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| Name             | Form | Query | Pattern                                                                                 |
-+==================+======+=======+=========================================================================================+
-| **alnumx**       | Form | Query | [A-Za-z][0-9]@-_.,;: /() ÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜŸäëïöüÿç            |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **digit**        | Form | Query | [0-9]                                                                                   |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **numerical**    | Form | Query | [0-9.-+]                                                                                |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **allbut**       | Form | Query | All characters allowed, but not [ ]  { } % & \ #. The used regexp: '^[^\[\]{}%&\\#]+$', |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **all**          | Form | Query | no sanitizing                                                                           |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-
-
-Only in FormElement:
-
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **email**        | Form | Query | [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}                                          |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **min|max**      | Form |       | Compares the value against an lower and upper limit (numeric or string).                |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **min|max date** | Form |       | Compares the value against an lower and upper date or datetime.                         |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **pattern**      | Form |       | Compares the value against a regexp.                                                    |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-
-.. _`variable-escape`:
-
-Escape
-------
-
-Variables used in SQL Statements might cause trouble by using: NUL (ASCII 0), \\n, \\r, \\, ', ", and Control-Z.
-
-To protect the web application the following `escape` types are available:
-
-	* 'm' - `real_escape_string() <http://php.net/manual/en/mysqli.real-escape-string.php>`_ (m = mysql)
-	* 'l' - LDAP search filter values will be escaped: `ldap-escape() <http://php.net/manual/en/function.ldap-escape.php>`_ (LDAP_ESCAPE_FILTER).
-	* 'L' - LDAP DN values will be escaped. `ldap-escape() <http://php.net/manual/en/function.ldap-escape.php>`_ (LDAP_ESCAPE_DN).
-	* 's' - single ticks will be escaped. str_replace() of ' against \\'.
-	* 'd' - double ticks will be escaped: str_replace() of " against \\".
-	* '-' - no escaping.
-
-* The `escape` type is defined by the fourth parameter of the variable. E.g.: `{{name:FE:alnumx:m}}` (m = mysql).
-* It's possible to combine different `escape` types, they will be processed in the order given. E.g. `{{name:FE:alnumx:Ls}}` (L, s).
-* Escaping is typically necessary for SQL or LDAP queries.
-* Be careful when escaping nested variables. Best is to escape **only** the most outer variable.
-* In `config.qfq.ini`_ a global `ESCAPE_TYPE_DEFAULT` can be defined. The configured escape type applies to all substituted
-  variables, who *do not* contain a *specific* escape type.
-* Additionally a `defaultEscapeType` can be defined per `Form` (separate field in the *Form editor*). This overwrites the
-  global definition of `config.qfq.ini`. By default, every `Form.defaultEscapeType` = 'c' (=config), which means the setting
-  in `config.qfq.ini`_.
-* To suppress a default escape type, define the `escape type` = '-' on the specific variable. E.g.: `{{name:FE:alnumx:-}}`.
-
-Security
-========
-
-All values passed to QFQ will be:
-
-* Checked against max. length and allowed content, on the client and on the server side. On the server side, the check
-  happens before any further processing. The 'length' and 'allowed' content is specified per `FormElement`. 'alnumx' is the
-  default allowed content for those. Violating the rules will stop the 'save record' process (Form) or result in an empty value (Report).
-
-* Only elements defined in the `Form` definition or requested by `Report` will be processed.
-
-* UTF8 normalized (normalizer::normalize) to unify different ways of composing characters. It's more a database interest
-  to work with unified data.
-
-SQL statements are typically fired as `prepared statements` with separated variables.
-Further *custom* SQL statements will be defined by the webmaster - those do not use `prepared statements` and might be
-affected by SQL injection. To prevent SQL injection, every variable can be escaped with `mysqli::real_escape_string` by
-defining the `escape` modifier `m`.
-
-**QFQ notice**:
-
-* Variables passed by the client (=Browser) are untrusted and use the default sanitize class 'digit' (if nothing else is
-  specified). If alpha characters are submitted, the content violates `digit` and becomes therefore empty - there is no
-  error message. Best is to always use SIP or digits.
-
-Get Parameter
--------------
-
-**QFQ security restriction**:
-
-* GET parameter might contain urlencoded content (%xx). Therefore all GET parameter will be processed by 'urldecode()'.
-  As a result a text like '%nn' in GET variables will always be decoded. It's not possible to transfer '%nn' itself.
-* GET variables are limited to SECURITY_GET_MAX_LENGTH chars - any violation will stop QFQ.
-
-Post Parameter
---------------
-
-Per `FormElement` (HTML input) the default is to `htmlspecialchars()` the input. This means &<>'" will be encoded as htmlentity
-and saved as a htmlentity in the database. In case any of these characters (e.g. for HTML tags) are
-required, the encoding can be disabled per FormElement: `encode=none` (default is `specialchar`).
-
-During Form load, htmlentities are decoded again.
-
-$_SERVER
---------
-
-All $_SERVER vars are htmlentities encoded (all, not only specialchars!) .
-
-Honeypot
---------
-
-Every QFQ Form contains 'honeypot'-HTML input elements (HTML: hidden & readonly). Which of them to use is configured in
-`config.qfq.ini`_ (default:   'username', 'password' and 'email'). On every start of QFQ (form, report, save, ...),
-these variables are tested if they are non-empty. In such a case a probably malicous bot has send the request and the
-request will not be processed.
-
-If any of the default configured variable names are needed (which will never be the case for QFQ), an explicit variable name
-list have to be configured in `config.qfq.ini`_.
-
-**QFQ security restriction**:
-
-* The honeypot variables can't be used in GET or POST as regular HTML input elements - any values of them will terminate QFQ.
-
-Violation
----------
-
-On any violation, QFQ will sleep SECURITY_ATTACK_DELAY seconds (`config.qfq.ini`_) and than exit the running PHP process.
-A detected attack leads to a complete white (=empty) page.
-
-If SECURITY_SHOW_MESSAGE = true (`config.qfq.ini`_), at least a message is displayed after the delay.
-
-Client Parameter via SIP
-------------------------
-
-Links with URL parameters, targeting to the local website, are typically SIP encoded. Instead of transferring the parameter
-as part of the URL, only one uniqe GET parameter 's' is appended at the link. The parameter 's' is uniq (equal to a
-timestamp) for the user. Assigned variables are stored as a part of the PHP user session on the server.
-Two users might have the same value of parameter 's', but the content is completely independet.
-
-Variables needed by Typo3 remains on the link and are not 'sip-encoded'.
-
-.. _`SecureDirectFileAccess`:
-
-Secure direct fileaccess
-------------------------
-
-If the application uploads files, mostly it's not necessary and often a security issue, to offer a direct download of
-the uploaded files. Best is to create a directory, e.g. `fileadmin/protected` and deny direct access via webbrowser to it.
-E.g. for Apache set a htaccess rule: ::
-
-		<Directory "/var/www/html/fileadmin/protected">
-			Require all denied
-		</Directory>
-
-**Important**: all QFQ uploads should then save files in or below such a directory.
-
-To offer download of those files, use the reserved columnname '_download':`download`_ or variants.
-
-**Important**: To protect the installation against executing of uploaded malicious script code, disable PHP for the final upload
-directory. E.g. `fileadmin`: ::
-
-		<Directory "/var/www/html/fileadmin">
-			php_admin_flag engine Off
-		</Directory>
-
-This is in general a good security improvement for directories with user supplied content.
-
-File upload
------------
-
-By default the mime type of every uploaded file is checked against a whitelist of allowed mime types. The mime type of
-a file can be (easily) faked by an attacker. This check is good to handle regular user file upload for specific file types. To
-prevent attacks against uploading and executing malicous code this won't help.
-
-Instead prohibit the execution of user contributed files by the webserver config (`SecureDirectFileAccess`_).
-
-.. _`store`:
-
-Store
-=====
-
-Only variables that are known in a specified store can be substituted.
-
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- |Name |Description                                                                             | Content                                                                    |
- +=====+========================================================================================+============================================================================+
- | F   | :ref:`STORE_FORM`: data not saved in database yet.                                     | All native *FormElements*. Recent values from the Browser.                 |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | S   | :ref:`STORE_SIP`: Client parameter 's' will indicate the current SIP, which will be    | sip, r (recordId), form                                                    |
- |     | loaded from the SESSION repo to the SIP-Store.                                         |                                                                            |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | R   | :ref:`STORE_RECORD`: Record - the current record loaded in the form                    | All columns of the current record from the current table                   |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | B   | :ref:`STORE_BEFORE`: Record - the current record loaded in the form before any update  | All columns of the current record from the current table                   |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | P   | Parent record. E.g.: on multi & copy forms the current record of the outer query,      | All columns of the MultiSQL Statement from the table for the current row   |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | D   | Default values column : The *table.column* specified *default value*.                  |                                                                            |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | M   | Column type: The *table.column* specified *type*                                       |                                                                            |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | C   | :ref:`STORE_CLIENT`: POST variable, if not found: GET variable                         | Parameter sent from the Client (=Browser).                                 |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | T   | :ref:`STORE_TYPO3`: a) Bodytext (ttcontent record), b) Typo3 internal variables        | See Typo3 tt_content record configuration                                  |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | V   | :ref:`STORE_VARS`: Generic variables                                                   |                                                                            |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | L   | :ref:`STORE_LDAP`: Will be filled on demand during processing of a *FormElement*       | Custom specified list of LDAP attributes                                   |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | 0   | *Zero* - allways value: 0, might be helpful if a variable is empty or undefined and    | Any key                                                                    |
- |     | will be used in an SQL statement.                                                      |                                                                            |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | E   | *Empty* - allways an empty string, might be helpful if a variable is empty or undefined| Any key                                                                    |
- |     | and will be used in an SQL statement                                                   |                                                                            |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
- | Y   | :ref:`STORE_SYSTEM`: a) Database, b) helper vars for logging/debugging:                |                                                                            |
- |     | SYSTEM_SQL_RAW ... SYSTEM_FORM_ELEMENT_COLUMN, c) Any custom fields: CONTACT, HELP, ...|                                                                            |
- +-----+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------+
-
-* Default *<prio>*: *FSRVD* - Form / SIP / Record / Vars / Table definition.
-* Hint: Preferable, parameter should be submitted by SIP, not by Client (=URL).
-
-  * Warning: Data submitted via 'Client' can be easily spoofed and altered.
-  * Best: Data submitted via SIP never leaves the server, cannot be spoofed or altered by the user.
-  * SIPs can _only_ be defined by using *Report*. Inside of *Report* use columns 'Link' (with attribute 's'), 'page?' or 'Page?'.
-
-.. _predefined-variable-names:
-
-Predefined variable names
--------------------------
-
-.. _STORE_FORM:
-
-Store: *FORM* - F
-^^^^^^^^^^^^^^^^^
-
-* Sanitized: *yes*
-* Represents the values in the form, typically before saving them.
-* Used for:
-
-  * *FormElements* who will be rerendered, after a parent *FormElement* has been changed by the user.
-  * *FormElement* actions, before saving the form.
-  * Values will be sanitized by the class configured in corresponding the *FormElement*. By default, the sanitize class is `alnumx`.
-
- +---------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
- | Name                            | Explanation                                                                                                                                |
- +=================================+============================================================================================================================================+
- | <FormElement name>              | Name of native *FormElement*. To get, exactly and only, the specified *FormElement* (for 'pId'): *{{pId:F}}*                               |
- +---------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _STORE_SIP:
-
-Store: *SIP* - S
-^^^^^^^^^^^^^^^^
-
-* Sanitized: *no*
-* Filled automatically by creating links. E.g.:
-
-  * in `Report` by using `_page?` or `_link` (with active 's')
-  * in `Form` by using subrecords: 'new', 'edit', 'delete' links (system) or by column type `_page?`, `_link`.
-
- +-------------------------+-----------------------------------------------------------+
- | Name                    | Explanation                                               |
- +=========================+===========================================================+
- | sip                     | 13 char uniqid                                            |
- +-------------------------+-----------------------------------------------------------+
- | r                       | current record id                                         |
- +-------------------------+-----------------------------------------------------------+
- | form                    | current form name                                         |
- +-------------------------+-----------------------------------------------------------+
- | table                   | current table name                                        |
- +-------------------------+-----------------------------------------------------------+
- | urlparam                | all non Typo3 paramter in one string                      |
- +-------------------------+-----------------------------------------------------------+
- | <user defined>          | additional user defined link parameter                    |
- +-------------------------+-----------------------------------------------------------+
-
-.. _STORE_RECORD:
-
-Store: *RECORD* - R
-^^^^^^^^^^^^^^^^^^^
-
-* Sanitized: *no*
-* Current record loaded in Form.
-* If r=0, all values are empty.
-
- +------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
- | Name                   | Explanation                                                                                                                                      |
- +========================+==================================================================================================================================================+
- | <column name>          | Name of a column of the primary table (as defined in the current form). To get, exactly and only, the specified form *FormElement*: *{{pId:R}}*  |
- +------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _STORE_BEFORE:
-
-Store: *BEFORE* - B
-^^^^^^^^^^^^^^^^^^^
-
-* Sanitized: *no*
-* Current record loaded in Form without any modification.
-* If r=0, all values are empty.
-
-This store is handy to compare new and old values of a form.
-
- +------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
- | Name                   | Explanation                                                                                                                                      |
- +========================+==================================================================================================================================================+
- | <column name>          | Name of a column of the primary table (as defined in the current form). To get, exactly and only, the specified form *FormElement*: *{{pId:R}}*  |
- +------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _STORE_CLIENT:
-
-Store: *CLIENT* - C
-^^^^^^^^^^^^^^^^^^^
-
-* Sanitized: *yes*
-
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
- | Name                    | Explanation                                                                                                                              |
- +=========================+==========================================================================================================================================+
- | s                       | =SIP                                                                                                                                     |
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
- | r                       | record id. Typically stored in SIP, rarely specified on the URL                                                                          |
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
- | keySemId                | always current Semester Id                                                                                                               |
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
- | keySemIdUser            | *{{keySemIdUser}}*, may be changed by user                                                                                               |
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
- | HTTP_HOST               | current HTTP HOST                                                                                                                        |
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
- | REMOTE_ADDR             | Client IP address                                                                                                                        |
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
- | '$_SERVER[*]'           | All other variables accessable by *$_SERVER[]*. Only the often used have a pre-defined sanitize class.                                   |
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
- | form                    | Unique name of current form                                                                                                              |
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
- | ANREDE                  | *{{sex}}* == male >> Sehr geehrter Herr, *{{sex}}* == female  Sehr geehrte Frau                                                          |
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
- | EANREDE                 | *{{sex}}* == male >> Dear Mr., *{{sex}}* == female >> Dear Mrs.                                                                          |
- +-------------------------+------------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _STORE_TYPO3:
-
-Store: *TYPO3* (Bodytext) - T
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-* Sanitized: *no*
-
- +-------------------------+-------------------------------------------------------------------+----------+
- | Name                    | Explanation                                                       | Note     |
- +=========================+===================================================================+==========+
- | form                    | Formname defined in ttcontent record bodytext                     | see note |
- |                         |                                                                   |          |
- |                         | * Fix. E.g. *form = person*                                       |          |
- |                         | * via SIP. E.g. *form = {{form}}*                                 |          |
- +-------------------------+-------------------------------------------------------------------+----------+
- | pageId                  | Record id of current Typo3 page                                   | see note |
- +-------------------------+-------------------------------------------------------------------+----------+
- | pageAlias               | Alias of current Typo3 page                                       | see note |
- +-------------------------+-------------------------------------------------------------------+----------+
- | pageTitle               | Title of current Typo3 page                                       | see note |
- +-------------------------+-------------------------------------------------------------------+----------+
- | pageType                | Current selected page type (typically URL parameter 'type')       | see note |
- +-------------------------+-------------------------------------------------------------------+----------+
- | pageLanguage            | Current selected page language (typically URL parameter 'L')      | see note |
- +-------------------------+-------------------------------------------------------------------+----------+
- | ttcontentUid            | Record id of current Typo3 content element                        | see note |
- +-------------------------+-------------------------------------------------------------------+----------+
- | feUser                  | Logged in Typo3 FE User                                           |          |
- +-------------------------+-------------------------------------------------------------------+----------+
- | feUserUid               | Logged in Typo3 FE User uid                                       |          |
- +-------------------------+-------------------------------------------------------------------+----------+
- | feUserGroup             | FE groups of logged in Typo3 FE User                              |          |
- +-------------------------+-------------------------------------------------------------------+----------+
- | beUserLoggedIn          | 'yes' | 'no' - Status if a BE-User is logged in                   |          |
- +-------------------------+-------------------------------------------------------------------+----------+
-
-* **note**: not available:
-
-  * in :ref:`dynamic-update` or
-  * by *FormElement* class 'action' with type 'beforeSave', 'afterSave', 'beforeDelete', 'afterDelete'.
-
-.. _STORE_VARS:
-
-Store: *VARS* - V
-^^^^^^^^^^^^^^^^^
-
-* Sanitized: *no*
-
- +-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
- | Name                    | Explanation                                                                                                                                |
- +=========================+============================================================================================================================================+
- | random                  | random string with length of 32 chars, alphanum                                                                                            |
- +-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
- | slaveId                 | see *FormElement* `action`                                                                                                                 |
- +-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
- | filename                | Original filename of an uploaded file via an 'upload'-FormElement. Valid only during processing of the current 'upload'-formElement.       |
- +-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
- | fileDestinaton          | Destination (path & filename) for an uploaded file. Defined in an 'upload'-FormElement.parameter. Valid: same as 'filename'.               |
- +-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _STORE_LDAP:
-
-Store: *LDAP* - L
-^^^^^^^^^^^^^^^^^
-
-* Sanitized: *yes*
-* See also :ref:`LDAP`:
-
- +-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
- | Name                    | Explanation                                                                                                                                |
- +=========================+============================================================================================================================================+
- | <custom defined>        | See *ldapAttributes*                                                                                                                       |
- +-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------+
-
-
-
-.. _STORE_SYSTEM:
-
-Store: *SYSTEM* - Y
-^^^^^^^^^^^^^^^^^^^
-
-* Sanitized: *no*
-
- +-------------------------+--------------------------------------------------------------------------+
- | Name                    | Explanation                                                              |
- +=========================+==========================================================================+
- | DB_USER                 | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | DB_SERVER               | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | DB_NAME                 | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | DB_INIT                 | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | SQL_LOG                 | defined in config.qfq.ini, see `SQL_LOG`_                                |
- +-------------------------+--------------------------------------------------------------------------+
- | SQL_LOG_MODE            | defined in config.qfq.ini, `SQL_LOG_MODE`_                               |
- +-------------------------+--------------------------------------------------------------------------+
- | SHOW_DEBUG_INFO         | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | CSS_LINK_CLASS_INTERNAL | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | CSS_LINK_CLASS_EXTERNAL | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | CSS_CLASS_QFQ_CONTAINER | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | EXT_PATH                | computed during runtime                                                  |
- +-------------------------+--------------------------------------------------------------------------+
- | SITE_PATH               | computed during runtime                                                  |
- +-------------------------+--------------------------------------------------------------------------+
- | DATE_FORMAT             | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | class                   | defined in config.qfq.ini (CSS_CLASS_QFQ_FORM) or form definition        |
- +-------------------------+--------------------------------------------------------------------------+
- | classPill               | defined in config.qfq.ini (CSS_CLASS_QFQ_FORM_PILL) or form definition   |
- +-------------------------+--------------------------------------------------------------------------+
- | classBody               | defined in config.qfq.ini (CSS_CLASS_QFQ_FORM_BODY) or form definition   |
- +-------------------------+--------------------------------------------------------------------------+
- | data-pattern-error      | defined in config.qfq.ini or form definition                             |
- +-------------------------+--------------------------------------------------------------------------+
- | data-require-error      | defined in config.qfq.ini or form definition                             |
- +-------------------------+--------------------------------------------------------------------------+
- | data-match-error        | defined in config.qfq.ini or form definition                             |
- +-------------------------+--------------------------------------------------------------------------+
- | data-error              | defined in config.qfq.ini or form definition                             |
- +-------------------------+--------------------------------------------------------------------------+
- | bsColumns               | defined in config.qfq.ini (FORM_BS_COLUMNS) or form definition           |
- +-------------------------+--------------------------------------------------------------------------+
- | bsLabelColumns          | defined in config.qfq.ini (FORM_BS_LABEL_COLUMNS) or form definition     |
- +-------------------------+--------------------------------------------------------------------------+
- | bsInputColumns          | defined in config.qfq.ini (FORM_BS_INPUT_COLUMNS) or form definition     |
- +-------------------------+--------------------------------------------------------------------------+
- | bsNoteColumns           | defined in config.qfq.ini (FORM_BS_NOTE_COLUMNS) or form definition      |
- +-------------------------+--------------------------------------------------------------------------+
- | sqlFinal                | computed during runtime, used for error reporting                        |
- +-------------------------+--------------------------------------------------------------------------+
- | sqlParamArray           | computed during runtime, used for error reporting                        |
- +-------------------------+--------------------------------------------------------------------------+
- | sqlCount                | computed during runtime, used for error reporting                        |
- +-------------------------+--------------------------------------------------------------------------+
-
-.. _LDAP:
-
-LDAP
-====
-
-A form can retrieve data from LDAP server(s) to display or to save them. Configuration options for LDAP will be specified
-in the *parameter* field of the *Form* and/or the *FormElement*. Definitions of the *FormElement* will overwrite definitions
-of the *Form*. One LDAP Server can be configured per *FormElement*. Multiple *FormElements* might use individual LDAP
-Server configurations.
-
-To decide which Parameter should be placed on *Form.parameter* and which on *FormElement.parameter*: If LDAP access is ...
-
-* only necessary in one *FormElement*, most usefull setup is to specify all values in that specific *FormElement*,
-* needed on multiple *FormElement*s (of the same *Form*, e.g. one *input* with *typeAhead*, one *note* and one *action*), it's more
-  efficient to specify the base parameter *ldapServer*, *ldapBaseDn* in *Form.parameter* and the rest on the current
-  *FormElement*.
-
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| Parameter                   | Example                          | Description                                                   | Form | FormElement | Used for |
-+=============================+==================================+===============================================================+======+=============+==========+
-| ldapServer                  | directory.example.com            | Hostname. For LDAPS: `ldaps://directory.example.com:636`      | x    | x           | TA, FSL  |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| ldapBaseDn                  | ou=Addressbook,dc=example,dc=com | Base DN to start the search                                   | x    | x           | TA, FSL  |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| ldapAttributes              | cn, email                        | List of attributes to save in STORE_LDAP                      | x    | x           | FSL      |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| ldapSearch                  | (mail=john.doe@example.com)      | Regular LDAP search expresssion                               | x    | x           | FSL      |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| ldapTimeLimit               | 3 (default)                      | Maximum time to wait for an answer of the LDAP Server         | x    | x           | TA, FSL  |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| ldapUseBindCredentials      | ldapUseBindCredentials=1         | Use LDAP_1_* crendentials from config.qfq.ini for ldap_bind() | x    | x           | TA, FSL  |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| typeAheadLdap               | -                                | Enable LDAP as 'Typeahead' data source                        |      | x           | TA       |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| typeAheadLdapSearch         | `(|(cn=*?*)(mail=*?*))`          | Regular LDAP search expresssion, returns upto typeAheadLimit  | x    | x           | TA       |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| typeAheadLdapSearchPrefetch | `(mail=?)`                       | Regular LDAP search expresssion, typically return one record  | x    | x           | TA       |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| typeAheadLdapSearchPerToken | -                                | Split search value in token and OR-combine every search with  | x    | x           | TA       |
-|                             |                                  |  the individual tokens                                        |      |             |          |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| typeAheadLdapValuePrintf    | `'%s / %s', cn, mail`            | Custom format to display attributes, as `value`               | x    | x           | TA       |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| typeAheadLdapIdPrintf       | `'%s', mail`                     | Custom format to display attributes, as `id`                  | x    | x           | TA       |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| typeAheadLimit              | 20 (default)                     | Result will be limited to this number of entries              | x    | x           | TA       |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| typeAheadPedantic           | typeAheadPedantic                | Activate 'pedantic' mode - only valid keys are allowed        | x    | x           | TA       |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| typeAheadMinLength          | 2 (default)                      | Minimum number of characters before starting the search       | x    | x           | TA       |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| fillStoreLdap               | -                                | Activate `Fill STORE LDAP` with the first retrieved record    |      | x           | FSL      |
-+-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-
-* *typeAheadLimit*: there might be a hard limit on the server side (e.g. 100) - which can't be extended.
-* *ldapUseBindCredentials* is only necessary if `anonymous` access is not possible. RDN and password has to be configured in
-  `config.qfq.ini`.
-
-.. _LDAP_Typeahead:
-
-Typeahead (TA)
---------------
-
-*Typeahead* offers continous searching of a LDAP directoy by using a regular *FormElement* of type *text*.
-The *FormElement.parameter*=*typeAheadLdap* will trigger LDAP searches on every user **keystroke**
-(starting after *typeAheadMinLength* keystrokes) for the current *FormElement* - this is different from *dynamicUpdate*
-(triggered by leaving focus of an input element). Typeahead delivers a list of elements.
-
-* *FormElement.parameter.typeAheadLdap* - activate the mode *Typeahead* - no value is needed, the existence is suffucient.
-* *Form.parameter* or *FormElement.parameter*:
-
-  * *ldapServer* = `directory.example.com`
-  * *ldapBaseDn* =  `ou=Addressbook,dc=example,dc=com`
-  * *typeAheadLdapSearch* = `(|(cn=*?*)(mail=*?*))`
-  * *typeAheadLdapValuePrintf* = `'%s / %s', cn, email`
-  * *typeAheadLdapIdPrintf* = `'%s', email`
-  * Optional: *ldapUseBindCredentials* = 1
-
-All fetched LDAP values will be formatted with:
-
-* *typeAheadLdapValuePrintf*, shown to the user in a drop-down box and
-* *typeAheadLdapIdPrintf*, which represents the final data to save.
-
-The `id/value` translation is compareable to a regular select drop-down box with id/value pairs.
-Only attributes, defined in *typeAheadLdapValuePrintf* / *typeAheadLdapIdPrintf* will be fetched from the LDAP directory.
-To examine all possible values of an LDAP server, use the commandline tool `ldapsearch`. E.g.::
-
-  ldapsearch -x -h directory.example.com -L -b ou=Addressbook,dc=example,dc=com "(mail=john.doe@example.com)"
-
-All occurences of a '?' in *ldapSearch* will be replaced by the user data typed in via the text-*FormElement*.
-The typed data will be escaped to fullfill LDAP search limitations.
-Regular *Form* variables might be used on all parameter and will be evaluated during form load (!) - *not* at the time when
-the user types something.
-
-Pedantic
-^^^^^^^^
-
-In case the typed value (technically this is the value of the *id*, latest in the moment when loosing the focus) have
-to be a valid (= exist on the LDAP server), the *typeAheadPedantic* mode can be activated.
-If the user typed something and that is not a valid *id*, the client (=browser) will delete the input when loosing the focus.
-To identify the exact *id*, an additional search filter is necessary: `ypeAheadLdapSearchPrefetch` - see next topic.
-
-* *Form.parameter* or *FormElement.parameter*:
-
-  * *typeAheadPedantic*
-
-Prefetch
-^^^^^^^^
-
-After 'form load' with an existing record, the user epects to see the previous saved data. In case there is an *id* to
-*value* translation, the *value* does not exist in the database, instead it has to be fetched again dynamically from the
-LDAP server. A precise LDAP query has to be defined to force this:
-
-* *Form.parameter* or *FormElement.parameter*:
-
-  * *typeAheadLdapSearchPrefetch* = `(mail=?)`
-
-This situation also applies in *pedantic* mode to verify the user input after each change.
-
-PerToken
-^^^^^^^^
-
-Sometimes a LDAP server only provides attributes like 'sn' and 'givenName', but not 'displayName' or another practial
-combination of multiple attributes - than it is difficult to search for 'firstname' *and* (=human AND) 'lastname'.
-E.g. 'John Doe', results to search like `(|(sn=*John Doe*)(givenName=*John Doe*))` which will be probably always be empty.
-Instead, the user input has to be splitted in token and the search string has to repeated for every token.
-
-* *Form.parameter* or *FormElement.parameter*:
-
-  * *typeAheadLdapSearchPerToken* - no value needed.
-
-This will repeat the search string per token.
-
-E.g.::
-
-   User search string: X Y
-   Ldap search string: (|(a=*?*)(b=*?*))
-
-   Result: (& (|(a=*X*)(b=*X*)) (|(a=*Y*)(b=*Y*))
-
-Attention: this option is only usefull in specific environments. Only use it, if it is really needed. The query becomes
-much more cpu / IO intensive.
-
-
-.. _Fill_LDAP_STORE:
-
-Fill STORE LDAP (FSL)
----------------------
-
-Before processing a *FormElement*, an optional configured FSL-action loads **one** record from a LDAP directory and stores
-the named attributes in STORE_LDAP. If the LDAP search query selects more than one record, only the first record is processed.
-The attributes names always becomes lowercase (PHP implentation detail on get_ldap_entries()) in the store. To make
-accessing STORE_LDAP easily, the keys are implemented case insensitive for this specific store. FLS is triggered during *Form*-...
-
-* load,
-* dynamic update,
-* save.
-
-The FLS happens *before* the *FormElement* processing starts. Therefore the fetched LDAP data (specified by *ldapAttributes*),
-are available via `{{<attributename>:L:allbut:s}}` during the regular *FormElement* processing. Take care to specify
-a sanitize class and optional escaping on further processing of those data.
-
-Also, the STORE LDAP remains filled, during the whole form processing time. E.g. if the values are needed for a person
-name and email, it's sufficient to fire one FSL on the first FormElement Action element, and use the same values during further FormElement
-Action Elements.
-
-Important: LDAP access might slow down the *Form* processing on load, update or save! The timeout (default: 3 seconds) have
-to be multiplied by the number of accesses. E.g. a broken LDAP connection and 3 *FormElements* with *FSL*
-results to 9 seconds delay on save. Also be prepared not to receive the expected data.
-
-* *FormElement.parameter.fillStoreLdap* - activate the mode *Fill S* - no value is needed, the existence is suffucient.
-* *Form.parameter* or *FormElement.parameter*:
-
-  * *ldapServer* = `directory.example.com`
-  * *ldapBaseDn* =  `ou=Addressbook,dc=example,dc=com`
-  * *typeAheadLdapSearch* = `(|(cn=*?*)(mail=*?*))`
-  * *ldapAttributes* = `givenName, sn, telephoneNumber, email`
-  * *ldapSearch* = `(mail={{email::l}})`
-  * Optional: *ldapUseBindCredentials* = 1
-
-After filling the store, access the content via `{{<attributename>:allbut:L:s}}`.
-
-Form
-====
-
-General
--------
-
-* Forms will be created by using the *Form Editor* on the Typo3 frontend (HTML form).
-* The *Form editor* itself consist of two predefined QFQ forms: *form* and *formElement* - these forms are often updated
-  during the installation of new QFQ versions.
-* Every form consist of a) a *Form* record and b) multiple *FormElement* records.
-* A form is assigned to a  *table*. Such a table is called the *primary table* for this form.
-* Forms can roughly categorized into:
-
-  * *Simple* form: the form acts on one record, stored in one table.
-
-    * The form will create necessary SQL commands for insert, update and delete (only primary record) automatically.
-
-  * *Advanced* form: the form acts on multiple records, stored in more than one table.
-
-    * Fields of the primary table acts like a *simple* form, all other fields have to be specified with *action/afterSave* records.
-
-  * *Multi* form: the form acts simultanously on more than one record. All records use the same *FormElements*.
-
-    * The *FormElements* are defined as a regular *simple* / or *advanced* form, plus a SQL Query, which selects and
-      iterates over all records. Those records will be loaded at the same time.
-
-  * *Delete* form: any form can be used as a form to `delete-record`_.
-
-* Form mode: The parameter 'r' (given via URL or via SIP) decide if the form is in mode:
-
-  * `New`:
-
-    * Missing parameter 'r' or 'r=0'
-    * On form load, no record is displayed.
-    * Saving the form creates a new primary record.
-    * E.g.: `http://example.com/index.php?id=home&form=Person`  or `http://example.com/index.php?id=home&form=Person&r=0`
-
-  * `Edit`:
-
-    * Parameter 'r>0'
-    * On form load, the specified record (<tablename>.id= <r>) will be loaded and displayed.
-    * Saving the form will update the existing record.
-    * E.g.: `http://example.com/index.php?id=home&form=Person&r=123`
-
-* Display a form:
-
-  * Create a QFQ tt_content record on a Typo 3 page.
-  * Inside the QFQ record: `form  = <formname>`. E.g.:
-
-    * Static: `form = Person`
-    * Dynamic: `form  = {{form:S}}`  (the left `form` is a keyword for QFQ, the right `form` is a free chooseable variable name)
-
-  * With the `Dynamic` option, it's easily possible to use one Typo3 page and display different forms on that specific
-    page. This is nice to configure few Typo 3 pages. The disadvantage is that the user might loose the navigation.
-
-
-.. _record_locking:
-
-Record locking
---------------
-
-Forms and 'record delete'-function support basic record locking. If a user opens a form and start to change content, a
-record lock will be acquired in the background. If the lock is denied (another user already owns a lock on the record) an
-alert is shown.
-By default the record lock mode is 'exclusive' and the default timeout is 15 minutes. Both can be configured per form. The
-initial default timeout can also be configured in `config.qfq.ini`_ (will be copied to the form during creating the form).
-
-If a timeout expires, the lock is deleted. During the next change in a form, the lock is acquired again.
-
-A lock is assgined to a record of a table. Multiple forms, with the same primary table, uses the same lock for a given record.
-
-If a `Form` acts on further records (e.g. via FE action), those records are not protected by this basic record locking.
-
-If a user tries to delete a record and another user already owns a lock on that record, the delete action is denied.
-
-If there are different locking modes in mulitiple forms, the most restricting mode applies for the current lock.
-
-Exclusive
-^^^^^^^^^
-
-An existing lock on a record forbids any write action on that record.
-
-Advisory
-^^^^^^^^
-
-An existing lock on a record informs the user that another user is currently working on that record. Nevertheless,
-writing is allowed.
-
-None
-^^^^
-
-No locking at all.
-
-.. _comment-space-character:
-
-Comment- and space-character
-----------------------------
-
-The following applies to the fields `Form.parameter` and `FormElement.parameter`:
-
-* Lines will be trimmed - leading and trailing spaces will be removed.
-* If a leading and/or trailing space is needed, escape it: '\ hello world \' > ' hello world '.
-* Lines starting with a '#' are treated as a comment and will not be parsed. Such lines are treated as 'empty lines'.
-* The comment sign can be escaped with '\\'.
-
-.. _form-main:
-
-Definition
-----------
-
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-| Name                    | Description                                                                                                                                        |
-+=========================+====================================================================================================================================================+
-|Name                     | Unique and speaking name of the *Form*. Form will be identified by this name. Use only '[a-zA-Z0-9._+-]'. _`form-name`                             |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Title                    | Title, shown on/above the form. _`form-title`                                                                                                      |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Note                     | Personal editor notes. _`form-note`                                                                                                                |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Table                    | Primary table of the form. _`form-tablename`                                                                                                       |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Required Parameter NEW   | Name of required SIP parameter to create a new record (r=0), separated by comma. '#' as comment delimiter. See `form-requiredParameter`_           |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Required Parameter EDIT  | Name of required SIP parameter to edit an existing record (r>0), separated by comma. '#' as comment delimiter. See `form-requiredParameter`_       |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Permit New               | 'sip, logged_in, logged_out, always, never' (Default: sip): See `form-permitNewEdit`_                                                              |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Permit Edit              | 'sip, logged_in, logged_out, always, never' (Default: sip): See `form-permitNewEdit`_                                                              |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Escape Type Default      | See `variable-escape`_.                                                                                                                            |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Show button              | 'new, delete, close, save' (Default: 'new,delete,close,save'): Shown named buttons in the upper right corner of the form.  See `form-showButton`_  |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Forward Mode             | 'client | no | url | url-skip-history' (Default: client): See `form-forward`_.                                                                     |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Forward (Mode) Page      | a) URL / Typo3 page id/alias or b) Forward Mode (via '{{...}}') or combination of a) & b). See `form-forward`_.                                    |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|Parameter                |  Misc additional parameters. See `form-parameter`_.                                                                                                |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|BS Label Columns         | The bootstrap grid system is based on 12 columns. The sum of *bsLabelColumns*,                                                                     |
-+-------------------------+ *bsInputColumns* and *bsNoteColumns* should be 12. These values here are the base values                                                           |
-|BS Input Columns         | for all *FormElements*. Exceptions per *FormElement* can be specified per *FormElement*.                                                           |
-+-------------------------+ Default: label=3, input=6, note=3. See `form-layout`_.                                                                                             |
-|BS Note Columns          |                                                                                                                                                    |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|multiMode                | NOT IMPLEMENTED - 'none, horizontal, vertical' (Default 'none')                                                                                    |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|multiSql                 | NOT IMPLEMENTED - Optional. SQL Query which selects all records to edit.                                                                           |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|multiDetailForm          | NOT IMPLEMENTED - Optional. Form to open, if a record is selected to edit (double click on record line)                                            |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-|multiDetailFormParameter | NOT IMPLEMENTED - Optional. Translated Parameter submitted to detailform (like subrecord parameter)                                                |
-+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _`form-permitNewEdit`:
-
-permitNew & permitEdit
-^^^^^^^^^^^^^^^^^^^^^^
-
-Depending on `r`, the following access permission will be taken:
-
-* `r=0` - permitNew
-* `r>0` - permitEdit
-
-
-+------------+---------------------------------------------------------------------------------------------------+
-| Option     | Description                                                                                       |
-+============+===================================================================================================+
-| sip        | The parameter 'form' and 'r' must be supplied via SIP or hard coded in the QFQ tt_content record. |
-+------------+---------------------------------------------------------------------------------------------------+
-| logged_in  | The form will only be shown if the current User is logged in as a FE User                         |
-+------------+---------------------------------------------------------------------------------------------------+
-| logged_out | The form will only be shown if the current User is *not* logged in as a FE User                   |
-+------------+---------------------------------------------------------------------------------------------------+
-| always     | No access restriction, the form will always be shown                                              |
-+------------+---------------------------------------------------------------------------------------------------+
-| never      | The form will never be shown                                                                      |
-+------------+---------------------------------------------------------------------------------------------------+
-
-
-* `sip`
-
-  * is *always* the preferred way. With 'sip' it's not necessary to differ between logged in or not, cause the SIP
-    only  exist and is only valid, if it's created via QFQ/report earlier. This means 'creating' the SIP implies
-    'access granted'. The grant will be revoked when the QFQ session is destroyed - this happens when a user loggs out or
-    the webbrowser is closed.
-
-* `logged_in` / `logged_out`: for forms which might be displayed without a SIP, but maybe on a protected or even unprotected page. *The option is probably not often used.*
-
-* `always`: such a form is always allowed to be loaded.
-
-  * `permitNew=always`: Public accessible forms (e.g. for registration) will allow users to fill and save
-    the form.
-
-  * `permitEdit=always`: Public accessible forms will allow users to update existing data. This
-    is dangerous, cause the URL paramater (recordId) 'r' might be changed by the user (URL manipulating) and therefore
-    the user might see and/or change data from other users. *The option is probably not often used.*
-
-* `never`: such a form is not allowed to be loaded.
-
-  * `permitNew=never`: Public accessible forms. It's not possible to create new records.
-
-  * `permitEdit=none`: Public accessible forms. It's not possible to update records.
-
-
-.. _`form-requiredParameter`:
-
-Required Parameter New|Edit
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Comma separated list of variable names. On form load, an error message will be shown in case of missing parameters.
-The parameters must be given by SIP.
-
-The list of required parameter has to be defined for `New` (r=0, create a new record) and for `Edit` (r>0, edit existing
-record).
-
-Optional a comment might be attached after the parameter definition.
-
-E.g.: ::
-
-  New: grId, pId # Always specify a person, grId2
-  Edit: pId
-
-.. _`form-showButton`:
-
-showButton
-^^^^^^^^^^
-
-Display or hide the button `new`, `delete`, `close`, `save`.
-
-* *new*: Creates a new record. If the form needs any special parameter via SIP or Client (=browser), hide this 'new' button - the necessary parameter are not provided.
-* *delete*: This either deletes the current record only, or (if defined via action *FormElement* 'beforeDelete' ) any specified subrecords.
-* *close*: Close the current form. If there are changes, a popup opens and ask to save / close / cancel. The last page from the history will be shown.
-* *save*: Save the form.
-
-* Default: show all buttons.
-
-.. _`form-forward`:
-
-Forward: Save / Close
-^^^^^^^^^^^^^^^^^^^^^
-
-Forward (=forwardMode)
-''''''''''''''''''''''
-
-After the user presses *Save*, *Close*, *Delete* or *New*, different actions are possible where the browser redirects to.
-
-* `client` (default) - the QFQ browser Javascript logic, decides to stay on the page or to force a redirection
-  to a previous page.
-  
-  * *Close* closes the current page and goes back to the previous page. Note: if a new tab is opened and the user presses
-    QFQ close (in any way) - in that new browser tab there is no previous page! QFQ won't close the tab, instead a message
-    is shown
-  * *Save* stays on the current page.
-  
-* `no` - no change, the browser remains on the current side. Close does not close the page. It just triggers a save if 
-  there are modified data.
-* `url` - the browser redirects to the URL or T3 page named in `Forward URL / Page`. Independent if the user presses `save` or `close`.
-* `url-skip-history` - same as `url`, but the current location won't saved in the browser history.
-
-Only with `Forward` == `url` | `url-skip-history`, the definition of `Forward URL / Page` becomes active.
-
-Forward URL / Page (=forwardPage)
-'''''''''''''''''''''''''''''''''
-
-Format: [<url>] or [<mode>|<url>]
-
-* `<url>`:
-
-  * `http://www.example.com/index.html?a=123#bottom`
-  * `website.html?a=123#bottom`
-  * `?<T3 Alias pageid>&a=123#bottom, ?id=<T3 page id>&a=123#bottom`
-  * `{{SELECT ...}}`
-  * `<mode>|<url>`
-
-* `<mode>` - Valid keywords are as above: `no|client|url|url-skip-history`
-
-Specifying the mode in `forwardPage` overwrites `formMode` (but only if `formMode` is `url...`).
-
-Also regular QFQ statements like {{var}} or {{SELECT ...}} are possible in `forwardPage`. This is useful to dynamically
-redirect to different targets, depending on user input or any other dependencies.
-
-If a forwardMode 'url...' is specified and there is no `forwardPage`, QFQ falls down to `client` mode.
-
-On a form, the user might click 'save' or 'save,close' or 'close' (with modified data this leads to 'save,close').
-The CLIENT `submit_reason` shows the user action:
-
-* `{{submit_reason:CE:alnumx}}` = `save` or `save,close`
-
-Example forwardPage
-^^^^^^^^^^^^^^^^^^^
-
-* `{{SELECT IF('{{formModeGlobal:S:anumx}}'='requiredOff', 'no', 'client') }}`
-* `{{SELECT IF('{{submit_reason:CE:alnumx}}'='save', 'no', 'url'), '|http://example.com' }}`
-
-Type: combined dynamic mode & URL/page
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Syntax: `forwardPage=<mode>|<page>`
-
-* `forwardPage={{SELECT IF(a.url='','no','url'), '|', a.url FROM address AS a }}`
-
-
-.. _form-parameter:
-
-Parameter
-^^^^^^^^^
-
-* The following parameter are optional and can be configured in the *Form.parameter* field.
-
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| Name                        | Type   | Description                                                                                              |
-+=============================+========+==========================================================================================================+
-| dbIndexData                 | int    | Database credential index, given via `config.qfq.ini`_ to let the current `Form` operate on the database.|
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| bsColumns                   | int    | Wrap the whole form in '<div class="col-md-??">                                                          |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| maxVisiblePill              | int    | Show pills upto <maxVisiblePill> as button, all further in a drop-down menu. Eg.: maxVisiblePill=3.      |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| class                       | string | HTML div with given class, surrounding the whole form. Eg.: class=container-fluid.                       |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| classPill                   | string | HTML div with given class, surrounding the `pill` title line.                                            |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| classBody                   | string | HTML div with given class, surrounding all *FormElement*.                                                |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| submitButtonText            | string | Show save button, with the <submitButtonText> at the bottom of the form.                                 |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| extraDeleteForm             | string | Name of a form which specifies how to delete the primary record and optional slave records.              |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| data-pattern-error          | string | Pattern violation: Text for error message used for all FormElements of current form.                     |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| data-required-error         | string | Required violation: Text for error message used for all FormElements of current form.                    |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| data-match-error            | string | Match violation: Text for error message used for all FormElements of current form.                       |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| data-error                  | string | If none specific is defined: Text for error message used for all FormElements of current form.           |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| buttonOnChangeClass         | string | Color for save button after user modified some content or current form. E.g.: 'btn-info alert-info'.     |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| ldapServer                  | string | FQDN Ldap Server. E.g.: directory.example.com.                                                           |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| ldapBaseDn                  | string | E.g.: `ou=Addressbook,dc=example,dc=com`.                                                                |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| ldapAttributes              | string | List of attributes to fill STORE_LDAP with. E.g.: cn, email.                                             |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| ldapSearch                  | string | E.g.: `(mail={{email::alnumx:l}})`                                                                       |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| ldapTimeLimit               | int    | Maximum time to wait for an answer of the LDAP Server.                                                   |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| typeAheadLdap               | -      | Enable LDAP as 'Typeahead' data source.                                                                  |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| typeAheadLdapSearch         | string | Regular LDAP search expresssion. E.g.:  `(|(cn=*?*)(mail=*?*))`                                          |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| typeAheadLdapValuePrintf    | string | Value formatting of LDAP result, per entry. E.g.: `'%s / %s / %s', mail, roomnumber, telephonenumber`    |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| typeAheadLdapIdPrintf       | string | Key formatting of LDAP result, per entry. E.g.: `'%s', mail`                                             |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| typeAheadLdapSearchPerToken | -      | Split search value in token and OR-combine every search with the individual tokens.                      |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| typeAheadLimit              | int    | Maximum number of entries. The limit is applied to the server (LDAP or SQL) and the Client.              |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| typeAheadMinLength          | int    | Minimum number of characters which have to typed to start the search.                                    |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| mode                        | string | The value `readonly` will activate a global readonly mode of the form - the user can't change any data.  |
-|                             |        | See :ref:`form-mode-global`                                                                              |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| saveButtonActive            | -      | Make the 'save'-button active on *Form* load (instead of waiting for the first user change).             |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| saveButtonText              | string | Overwrite default from config.qfq.ini: SAVE_BUTTON_TEXT                                                  |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| saveButtonTooltip           | string | Overwrite default from config.qfq.ini: SAVE_BUTTON_TOOLTIP                                               |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| saveButtonClass             | string | Overwrite default from config.qfq.ini: SAVE_BUTTON_CLASS                                                 |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| saveButtonGlyphIcon         | string | Overwrite default from config.qfq.ini: SAVE_BUTTON_GLYPH_ICON                                            |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| closeButtonText             | string | Overwrite default from config.qfq.ini: CLOSE_BUTTON_TEXT                                                 |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| closeButtonTooltip          | string | Overwrite default from config.qfq.ini: CLOSE_BUTTON_TOOLTIP                                              |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| closeButtonClass            | string | Overwrite default from config.qfq.ini: CLOSE_BUTTON_CLASS                                                |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| closeButtonGlyphIcon        | string | Overwrite default from config.qfq.ini: CLOSE_BUTTON_GLYPH_ICON                                           |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| deleteButtonText            | string | Overwrite default from config.qfq.ini: DELETE_BUTTON_TEXT                                                |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| deleteButtonTooltip         | string | Overwrite default from config.qfq.ini: DELETE_BUTTON_TOOLTIP                                             |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| deleteButtonClass           | string | Overwrite default from config.qfq.ini: DELETE_BUTTON_CLASS                                               |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| deleteButtonGlyphIcon       | string | Overwrite default from config.qfq.ini: DELETE_BUTTON_GLYPH_ICON                                          |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| newButtonText               | string | Overwrite default from config.qfq.ini: NEW_BUTTON_TEXT                                                   |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| newButtonTooltip            | string | Overwrite default from config.qfq.ini: NEW_BUTTON_TOOLTIP                                                |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| newButtonClass              | string | Overwrite default from config.qfq.ini: NEW_BUTTON_CLASS                                                  |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| newButtonGlyphIcon          | string | Overwrite default from config.qfq.ini: NEW_BUTTON_GLYPH_ICON                                             |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| extraButtonInfoClass        | string | Overwrite default from config.qfq.ini: EXTRA_BUTTON_INFO_CLASS                                           |
-+-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-
-* Example:
-
-  * maxVisiblePill = 5
-  * class = container-fluid
-  * classBody = qfq-form-right
-
-submitButtonText
-''''''''''''''''
-
-If specified and non empty, display a regular submit button at the bottom of the page with the given text.
-This gives the form a ordinary HTML-form look'n' feel. With this option, the standard buttons on the top right border
-should be hided to not confuse the user.
-
-* Optional.
-* Default: Empty
-
-class
-'''''
-
-* Optional.
-* Default: `container`
-* Any CSS class name(s) can be specified.
-* Check `typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css` for predefined classes.
-* Typical use: adjust the floating rules of the form.
-  * See: http://getbootstrap.com/css/#overview-container
-  * Expand the form over the whole area: `container-fluid`
-
-classPill
-'''''''''
-
-* Optional.
-* Default: `qfq-color-grey-1`
-* Any CSS class name(s) can be specified.
-* Check `typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css` for predefined classes.
-* Typical use: adjust the background color of the `pill title` area.
-* Predefined background colors: `qfq-color-white`, `qfq-color-grey-1` (dark), `qfq-color-grey-2` (light),
-  `qfq-color-blue-1` (dark), `qfq-color-blue-2`. (light)
-* `classPill` is only visible on forms with container elemants of type 'Pill'.
-
-classBody
-'''''''''
-
-* Optional.
-* Default: `qfq-color-grey-2`
-* Any CSS class name(s) can be specified.
-* Check `typo3conf/ext/qfq/Resources/Public/Css/qfq-bs.css` for predefined classes.
-* Typical use:
-
-  * adjust the background color of the *FormElement* area.
-  * make all form labels right align: `qfq-form-right`.
-
-* Predefined background colors: `qfq-color-white`, `qfq-color-grey-1` (dark), `qfq-color-grey-2` (light),
-  `qfq-color-blue-1` (dark), `qfq-color-blue-2`. (light)
-
-extraDeleteForm
-'''''''''''''''
-
-Depending on the database definition, it might be necessary to delete the primary record *and* corresponding slave records.
-To not repeat such 'slave record delete definition', an 'extraDeleteForm' can be specified. If the user opens a record
-in a form and clicks on the 'delete' button, a defined 'extraDeleteForm'-form will be used to delete primary and slave
-records instead of using the current form.
-E.g. if there are multiple different forms to work on the same table, all of theses forms might reference to the same
-'extraDeleteForm'-form. This simplifies the maintenance.
-
-The 'extraDeleteForm' parameter might be specified for a 'form' and/or for 'subrecords'
-
-See also: `delete-record`_.
-
-.. _form-mode-global:
-
-Form mode global
-''''''''''''''''
-
-The Form global mode `mode` is given by default with `{{formModeGlobal:SE:alnumx}}`.
-
-Optional it might be defined via *Form.parameter* ::
-
-    mode=readonly|requiredOff
-
-
-* `readonly`: all `FormElement` of the whole form are temporarily in `readonly` mode. This is a fast way to use an
-  existing *Form* just to display the form data, without a possibility for the user to change any data of the form.
-
-* `requiredOff`: all `FormElement` of the whole, with `mode=required`, will temporarily switch to `mode=show`. In this
-  mode, the user might save the form without providing all necessary data. Later on, when application logic requires a
-  final submit, this mode is not used any longer (call the form as regular without the 'formModeGlobal' parameter) and
-  the form can only be saved with all data given.
-  Than, e.g. an action-FormElement 'afterSave' can be used to detect the final submit situation and do some extra stuff,
-  necessary for the final submit.
-
-The following shows the same *Form* in the `regular`, `readonly` and `requiredOff` mode::
-
-	10.sql = SELECT CONCAT('from&form=person&r=', p.id, '|Regular') as _Pagee,
-	                CONCAT('from&form=person&formModeGlobal=readonly&r=', p.id, '|Readonly') as _Pagee,
-	                CONCAT('from&form=person&formModeGlobal=requiredOff&r=', p.id, '|Required off') as _Pagee
-	                FROM Person AS p
-
-..
-
-FormElements
-------------
-
-* Each *form* contains one or more *FormElement*.
-* The *FormElements* are divided in three categories:
-
-  * `class-container`_
-  * `class-native`_
-  * `class-action`_
-
-* Ordering and grouping: Native *FormElements* and Container-Elements (both with feIdContainer=0) will be ordered by 'ord'.
-* Inside of a container, all nested elements will be displayed.
-* Technical, it's *not* necessary to configure a FormElement for the primary index column `id`.
-* Additional options to a *FormElement* will be configured via the *FormElement.parameter* field (analog to *Form.parameter*
-  for *Forms* ).
-
-  * See also: `comment-space-character`_
-
-.. _class-container:
-
-Class: Container
-----------------
-
-* Pills are containers for 'fieldset' *and* / *or* 'native' *FormElements*.
-* Fieldsets are containers for 'native' *FormElements*.
-* TemplateGroups are containers for 'fieldset' *and* / *or* 'native' *FormElements*.
-
-Type: fieldset
-^^^^^^^^^^^^^^
-
-* Native *FormElements* can be assigned to a fieldset.
-* FormElement settings:
-
-  * *name*: technical name, used as HTML identifier.
-  * *label*: Shown title of the fieldset.
-
-Type: pill
-^^^^^^^^^^
-
-* Pill is synonymous for a tab. A pill looks like a tab.
-* Pills are only available with mode render='bootstrap'.
-* If there is at least one pill defined, every native *FormElement* needs to be assigned to a pill or to a fieldset.
-* If there is at least one pill defined, every *fieldset* needs to be assigned to a pill.
-* Pills are not 'dynamicUpdate' aware (at the moment). At least during form load, *modeSql* can be dynamically computed to
-  switch the pill in show / readonly (disabled) / hidden state.
-
-* FormElement settings:
-
-  * *name*: technical name, used as HTML identifier.
-  * *label*: Label shown on the corresponding pill button or inside the drop-down menu.
-  * *mode*:
-
-    * *show*, *required*: regular mode. The pill will be shown.
-    * *readonly*: the pill and it's name is visible, but not clickable.
-    * *hidden*: the pill is not shown at all.
-
-  * *modeSql*:
-  * *type*: *pill*
-  * *feIdContainer*: `0`  - Pill's can't be nested.
-  * *parameter*:
-
-    * *maxVisiblePill*: `<nr>` - Number of Pill-Buttons shown. Undefined means unlimited. Excess Pill buttons will be
-      displayed as a drop-down menu.
-
-Type: templateGroup
-^^^^^^^^^^^^^^^^^^^
-
-*TemplateGroups* will be used to create a series of grouped (by the given *templateGroup*) *FormElements*.
-
-*FormElements* can be assigned to a *templateGroup*. These *templateGroup* will be rendered upto *n*-times. On 'form load'
-only a single (=first) copy of the *templateGroup* will be shown. Below the last copy of the *templateGroup* an 'add'-button is
-shown. If the user click on it, an additional copy of the *templateGroup* is displayed. This can be repeated up to
-*templateGroup.maxLength* times. Also, the user can 'remove' previously created copies by clicking on a remove button near
-beside every *templateGroup*. The first copy of a templateGroup can't be removed.
-
-* FormElement settings:
-
-  * *label*: Shown in the FormElement-editor *container* field.
-  * *maxLength*: Maximum number of copies of the current *templateGroup*. Default: 5.
-  * *bsLabelColumn*, *bsInputColumn*, *bsNoteColumn*: column widths for row with the 'Add' button.
-  * *parameter*:
-
-    * *tgAddClass*: Class of the 'add' button. Default: `btn btn-default`.
-    * *tgAddText*: Text shown on the button. Default: `Add`.
-    * *tgRemoveClass*: Class of the 'remove' button. Default: `btn btn-default`.
-    * *tgRemoveText*: Text shown on the button. Default: `Remove`.
-    * *tgClass*: Class wrapped around every copy of the *templateGroup*.
-      E.g. the class `qfq-child-margin-top` adds a margin between two copies of the *templateGroup*. Default: empty
-
-Multiple *templateGroups* per form are allowed.
-
-The name of the native FormElements, inside the templateGroup, which represents the effective table columns, uses the placeholder
-`%d`. E.g. the columns `grade1`, `grade2`, `grade3` needs a *FormElement.name* = `grade%d`. The counting will always start with 1.
-The placeholder `%d` can also be used in the *FormElement.label*
-
-Example of styling the Add/ Delete Button: :ref:`example_class_template_group`
-
-Column: primary record
-''''''''''''''''''''''
-
-If the columns `<name>%d` are real columns on the primary table, saving and delete (=empty string) are done automatically.
-E.g. if there are upto five elements `grade1, ..., grade5` and the user inputs only the first three, the remaining will be set
-to an empty string.
-
-Column: non primary record
-''''''''''''''''''''''''''
-
-Additional logic is required to load, update, insert and/or delete slave records.
-
-Load
-;;;;
-
-On each native *FormElement* of the *templateGroup* define a SQL query in the *FormElement.value* field. The query has to
-select **all** values of all possible existing copies of the *FormElement* - therefore the exclamation mark is necessary.
-Also define the order. E.g. *FormElement.value*::
-
-   {{!SELECT street FROM Address WHERE personId={{id}} ORDER BY id}}
-
-Insert / Update / Delete
-;;;;;;;;;;;;;;;;;;;;;;;;
-
-Add an *action* record, type='afterSave', and assign the record to the given *templateGroup*.
-
-In the parameter field define: ::
-
-		slaveId = {{SELECT id FROM Address WHERE personId={{id}} ORDER BY id LIMIT %D,1}}
-		sqlHonorFormElements = city%d, street%d
-		sqlUpdate = {{UPDATE Address SET city='{{city%d:FE:alnumx:s}}', street='{{street%d:FE:alnumx:s}}'  WHERE id={{slaveId}} LIMIT 1}}
-		sqlInsert = {{INSERT INTO Address (`personId`, `city`, `street`) VALUES ({{id}}, '{{city%d:FE:alnumx:s}}' , '{{street%d:FE:alnumx:s}}') }}
-		sqlDelete = {{DELETE FROM Address WHERE id={{slaveId}} LIMIT 1}}
-
-The `slaveId` needs attention: the placeholder `%d` starts always at 1. The `LIMIT` directive starts at 0 - therefore
-use `%D` instead of `%d`, cause `%D` is always one below `%d` - but can **only** be used on the action element.
-
-.. _class-native:
-
-Class: Native
--------------
-
-Fields:
-
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-| Name                | Type                        | Description                                                                                         |
-+=====================+=============================+=====================================================================================================+
-|Container            | int                         | 0 or *FormElement*.id of container element (pill, fieldSet, templateGroup) part the current *Form*  |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Enabled              | enum('yes'|'no')            | Process the current FormElement                                                                     |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Dynamic Update       | enum('yes'|'no')            | In the browser, *FormElements* with "dynamicUpdate='yes'"  will be updated depending on user        |
-|                     |                             | input. :ref:`dynamic-update`                                                                        |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Name                 | string                      |                                                                                                     |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Label                | string                      | Label of *FormElement*. Depending on layout model, left or on top of the *FormElement*              |
-|                     |                             | Additional label description can be added by wrapping in HTML tag '<small>'                         |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Mode                 | enum('show', 'readonly',    | *Show*: regular user input field. This is the default.                                              |
-|                     | 'required',                 | *Required*: User has to specify a value. Typically, an <empty string> represents 'no value'.        |
-|                     | 'disabled' )                | *Readonly*: user can't change any data. Data not saved.                                             |
-|                     |                             | *Disabled*: *FormElement* is not visible.                                                           |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Mode sql             | `SELECT` statement with     | A value given here overwrites the setting from `mode`. Most usefull with :ref:`dynamic-update`.     |
-|                     | a value like in `mode`      | E.g.: {{SELECT IF( '{{otherFunding:FR:alnumx}}'='yes' ,'show', 'hidden' }}                          |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Class                | enum('native', 'action',    | Details below.                                                                                      |
-|                     | 'container')                |                                                                                                     |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Type                 | enum('checkbox', 'date', 'time', 'datetime',  'dateJQW', 'datetimeJQW', 'extra', 'gridJQW', 'text', 'editor', 'note',             |
-|                     | 'password', 'radio', 'select', 'subrecord', 'upload', 'fieldset', 'pill', 'beforeLoad', 'beforeSave',                             |
-|                     | 'beforeInsert', 'beforeUpdate', 'beforeDelete', 'afterLoad', 'afterSave', 'afterInsert', 'afterUpdate', 'afterDelete',            |
-|                     | 'sendMail')                                                                                                                       |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Encode               | 'none', 'specialchar'       | With 'specialchar' (default) the chars <>"'& will be encoded to their htmlentity. _`field-encode`   |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Check Type           | enum('min|max', 'pattern',  | _`field-checkType`                                                                                  |
-|                     | 'number', 'email')          |                                                                                                     |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Check Pattern        | 'regexp'                    |If $checkType=='pattern': pattern to match                                                           |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Order                | string                      | Display order of *FormElements* ('order' is a reserved keyword)  _`field-ord`                       |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|tabindex             | string                      |HTML tabindex attribute   _`field-tabindex`                                                          |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Size                 | string                      |Visible length of input element. Might be ommited, depending on the choosen form layout.             |
-|                     |                             |Format: <width>,<height> (in characters)   _`field-size`                                             |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|BS Label Columns     | string                      | Number of bootstrap grid columns for label. By default empty, value inherits from the form.         |
-|                     |                             | _`field-bsLabelColumns`                                                                             |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|BS Input Columns     | string                      | Number of bootstrap grid columns for input. By default empty, value inherits from the form.         |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|BS Note Columns      | string                      | Number of bootstrap grid columns for note. By default empty, value inherits from the form.          |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Label / Input / Note | enum(...)                   | Switch on/off opening|closing of bootstrap form classes _`field-rowLabelInputNote`                  |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Maxlength            | string                      |Maximum characters for input. _`field-maxLength`                                                     |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Note                 | string                      |Note of *FormElement*. Depending on layout model, right or below of the *FormElement*. _`field-note` |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Tooltip              | text                        |Display this text as tooltip on mouse over.  _`field-tooltip`                                        |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Placeholder          | string                      |Text, displayed inside the input element in light grey. _`field-placeholder`                         |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|value                | text                        |Default value: See `field-value`_                                                                    |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|sql1                 | text                        |SQL query                                                                                            |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Parameter            | text                        |Might contain misc parameter. See `fe-parameter-attributes`_                                         |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|feGroup              | string                      | Comma-separated list of Typo3 FE Group ID. NOT SURE IF THIS WILL BE IMPLEMENTED. Native             |
-|                     |                             | *FormElements*, fieldsets and pills can be assigned to feGroups. Group status: show, hidden,        |
-|                     |                             | disabled. Group Access: FE-Groups. User will be assigned to FE-Groups and the form definition       |
-|                     |                             | reference such FE-groups. Easy way of granting permission.                                          |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-|Deleted              | string                      | 'yes'|'no'.                                                                                         |
-+---------------------+-----------------------------+-----------------------------------------------------------------------------------------------------+
-
-.. _`field-value`:
-
-FE: Value
-^^^^^^^^^
-
-By default this field is empty: QFQ will fill it with the corresponding existing column value on form load.
-For a customized default value define: ::
-
-   {{SELECT IF('{{column:RE}}'='','custom default',{{column:R}}) }}
-
-
-For non primary records, this is the place to load an existing value. E.g. we're on a 'Person' detail form and would like
-to edit, on the same form, a corresponding person email address (which is in a separate table): ::
-
-  {{SELECT a.email FROM Address AS a WHERE a.pId={{id:R0}} ORDER BY a.id LIMIT 1}}
-
-FE: 'Report' notation
-^^^^^^^^^^^^^^^^^^^^^
-
-The FE fields 'value' and 'note' understand the `Report`_ syntax. Nested SQL queries as well as links with SIP encoding
-are possible. To distinguish between 'Form' and 'Report' syntax, the first line has to be `#!report` ::
-
-    #!report
-
-    10.sql = SELECT ...
-
-    20 {
-      sql = SELECT ...
-      5.sql = SELECT ...
-    }
-
-.. _fe-parameter-attributes:
-
-Attributes defined in the parameter field
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-See also at specific *FormElement* definitions.
-
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| Name                   | Type   | Note                                                                                                     |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| data-pattern-error     | string | Pattern violation: Text for error message used for all FormElements of current form                      |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| data-required-error    | string | Required violation: Text for error message used for all FormElements of current form                     |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| data-match-error       | string | Match violation: Text for error message used for all FormElements of current form                        |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| data-error             | string | If none specific is defined: Text for error message used for all FormElements of current form            |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| htmlBefore             | string | HTML Code wrapped before the complete *FormElement*                                                      |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| htmlAfter              | string | HTML Code wrapped after the complete *FormElement*                                                       |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| wrapRow                | string | If specified, skip default wrapping (`<div class='col-md-?>`). Instead the given string is used.         |
-+------------------------+--------+                                                                                                          |
-| wrapLabel              | string |                                                                                                          |
-+------------------------+--------+                                                                                                          |
-| wrapInput              | string |                                                                                                          |
-+------------------------+--------+                                                                                                          |
-| wrapNote               | string |                                                                                                          |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| extraButtonLock        | none   | No value. Show a 'lock' on the right side of the input element. See `extraButtonLock`_                   |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| extraButtonPassword    | none   | No value. Show an 'eye' on the right side of the input element. See `extraButtonPassword`_               |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| extraButtonInfo        | string | Text. Show an 'i' on the right side of the input element. See `extraButtonInfo`_                         |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| extraButtonInfoClass   | string | By default empty. Specify any class to be assigned to wrap extraButtonInfo                               |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| autofocus              | string | See `input-option-autofocus`_                                                                            |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| checkBoxMode           | string | See `input-checkbox`_, `input-radio`_, `input-select`_                                                   |
-| checked                | string |                                                                                                          |
-| unchecked              | string |                                                                                                          |
-| label2                 | string |                                                                                                          |
-| itemList               | string |                                                                                                          |
-| emptyHide              | string |                                                                                                          |
-| emptyItemAtStart       | string |                                                                                                          |
-| emptyItemAtEnd         | string |                                                                                                          |
-| buttonClass            | string |                                                                                                          |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| dateFormat             | string | yyyy-mm-dd | dd.mm.yyyy                                                                                  |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| showSeconds            | string | 0|1 - Shows the seconds on form load. Default: 0                                                         |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| showZero               | string | 0|1 - Empty timestamp: '0'(default) - nothing shown, '1' - the string '0000-00-00 00:00:00' is displayed |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| retype                 | string | See `input-text`_                                                                                        |
-| retypeLabel            | string |                                                                                                          |
-| retypeNote             | string |                                                                                                          |
-| characterCountWrap     | string |                                                                                                          |
-| hideZero               | string |                                                                                                          |
-| emptyMeansNull         | string |                                                                                                          |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| typeAheadLimit         | string | See `input-typeahead`_                                                                                   |
-| typeAheadMinLength     | string |                                                                                                          |
-| typeAheadSql           | string |                                                                                                          |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| editor-plugins         | string | See `input-editor`_                                                                                      |
-| editor-toolbar         | string |                                                                                                          |
-| editor-statusbar       | string |                                                                                                          |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| form                   | string | See `subrecord-option`_                                                                                  |
-| page                   | string |                                                                                                          |
-| title                  | string |                                                                                                          |
-| extraDeleteForm        | string |                                                                                                          |
-| detail                 | string |                                                                                                          |
-| subrecordTableClass    | string |                                                                                                          |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| capture                | string | See `input-upload`_                                                                                      |
-| accept                 | string |                                                                                                          |
-| maxFileSize            | string |                                                                                                          |
-| fileDestination        | string |                                                                                                          |
-| slaveId                | string |                                                                                                          |
-| fileReplace            | string |                                                                                                          |
-| sqlBefore              | string |                                                                                                          |
-| sqlInsert              | string |                                                                                                          |
-| sqlUpdate              | string |                                                                                                          |
-| sqlDelete              | string |                                                                                                          |
-| sqlAfter               | string |                                                                                                          |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| fileButtonText         | string | Overwrite default 'Choose File'                                                                          |
-+------------------------+--------+----------------------------------------------------------------------------------------------------------+
-
-
-Effect matrix
-^^^^^^^^^^^^^
-
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| Attribute           | checkbox | dateJQW | datetimeJQW |  gridJQW | extra  | text  | note | password | radio | select | subrecord | timeJQW | upload | editor |
-+=====================+==========+=========+=============+==========+========+=======+======+==========+=======+========+===========+=========+========+========+
-|id                   |Internal id                                                                                                                              |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|formId               |Form                                                                                                                            |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|containerId          |Assign the *FormElement* to user defined fieldSet or pill                                                                       |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|enabled              |*FormElement* is active or not                                                                                                  |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|name                 |Name of a column of the primary table. *FormElements* with a corresponding table will be saved automatically.                   |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|label                |Label shown to the user.                                                                                                        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|mode                 |show, readonly, required, lock, disable.                                                                                        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|class                |native                                                                                                                          |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|type                 | checkbox | dateJQW | datetimeJQW |  gridJQW | extra  | text  | note | password | radio | select | subrecord | timeJQW | upload |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|checkType            |          |   -     |   -         |          |        |   -   |      |   -      |       |        |           |   -     |        |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|checkPattern         |          |   -     |   -         |          |        |   -   |      |   -      |       |        |           |   -     |        |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|onChange             |   -      |   -     |   -         |          |        |   -   |      |   -      |   -   |   -    |           |   -     |   -    |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|ord                  |   -      |   -     |   -         |   -      |   -    |   -   |   -  |   -      |   -   |   -    |   -       |   -     |   -    |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|tabindex             |   -      |   -     |   -         |   -      |   -    |   -   |   -  |   -      |   -   |   -    |   -       |   -     |   -    |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|size                 |   -      |         |             |          |        |   -   |      |   -      |   -   |   -  2 |           |   -     |   -  ? |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|maxLength            |   1      |         |             |          |        |   -   |      |   -      |   - 1 |        |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|note                 |   -      |   -     |   -         |          |        |   -   |   -  |   -      |   -   |   -    |   -       |   -     |   -    |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|tooltip              |   -      |   -     |   -         |          |        |   -   |      |   -      |   -   |   -    |           |   -     |   -    |   ?    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|placeholder          |          |   -     |   -         |          |        |   -   |      |          |       |        |           |   -     |   -    |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|clientJs             |          |   -     |   -         |   -      |        |   -   |      |   -      |   -   |   -    |           |   -     |   -    |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|value                |   -      |   -     |   -         |   -      |   -    |   -   |   -  |   -      |   -   |   -    |           |   -     |   -    |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|sql1                 |?                                                                                                                                        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-|*Additional attributes in Field 'parameter'. Typically in key=value format.*                                                                                   |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| type                | checkbox | dateJQW | datetimeJQW | gridJQW  | extra  | text  | note | password | radio | select | subrecord | timeJQW | upload | editor |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| accept              |?                                                                                                                                        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| alt                 |?                                                                                                                               |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| autocomplete        |          |   -     |   -         |          |        |   -   |      |          |       |        |           |   -     |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| autofocus           |   -      |   -     |   -         |          |        |   -   |      |   -      |   -   |   -    |           |   -     |   -    |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| checkBoxMode        |   -      |   -     |             |          |        |       |      |          |       |        |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| checked             |   -      |         |             |          |        |   -   |      |          |   -   |        |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| unchecked           |   -      |         |             |          |        |   -   |      |          |   -   |        |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| label2              |   -      |         |             |          |        |       |      |          |   -   |        |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| itemList            |   -      |         |             |          |        |       |      |          |   -   |   -    |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| emptyItemAtStart    |          |         |             |          |        |       |      |          |       |   -    |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| emptyItemAtEnd      |          |         |             |          |        |       |      |          |       |   -    |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| emptyHide           |          |         |             |          |        |       |      |          |       |   -    |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| retype              |          | -       | -           |          |        | -     |      | -        |       |        |           | -       |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| accept              |          |         |             |          |        |       |      |          |       |        |           |         |   -  3 |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| slaveId             |          |         |             |          |        |       |      |          |       |        |           |         |   -    |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| fileDestination     |          |         |             |          |        |       |      |          |       |        |           |         |   -    |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| sqlBefore           |          |         |             |          |        |       |      |          |       |        |           |         |   -    |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| sqlInsert           |          |         |             |          |        |       |      |          |       |        |           |         |   -    |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| sqlDelete           |          |         |             |          |        |       |      |          |       |        |           |         |   -    |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| sqlAfter            |          |         |             |          |        |       |      |          |       |        |           |         |   -    |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| extraButtonLock     |          |         |             |          |        |  -    |      |    -     |       |   -    |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| extraButtonPassword |          |         |             |          |        |  -    |      |          |       |        |           |         |        |        |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-| extraButtonInfo     |    -     |         |             |          |        |  -    |      |    -     |   -   |   -    |           |         |        |   -    |
-+---------------------+----------+---------+-------------+----------+--------+-------+------+----------+-------+--------+-----------+---------+--------+--------+
-
-* 1: A line break created every <size> elements. Easy way to make checkboxes or radio vertical instead of horizontal.
-* 2: Any number >1 makes the 'select' input 'multiple' ready.
-* 3: Accepted file mime types. See: https://www.w3.org/TR/html5/forms.html#file-upload-state-(type=file)
-
-Native *FormElements*
-'''''''''''''''''''''
-* Like 'input', 'checkbox', ...
-
-.. _`input-option-autofocus`:
-
-autofocus
-;;;;;;;;;
-
-The first *FormElement* with this attribute will get the focus after form load. If there is no such attribute
-given to any *FormElement*, the attribute will be automatically assigned to the first editable *FormElement*.
-
-To disable 'autofocus' on a form, set 'autofocus=0' on the first editable *FormElement*.
-
-Note: If there are multiple pills defined on a form, only the first pill will be set with 'autofocus'.
-
-.. _`extraButtonLock`:
-
-extraButtonLock
-;;;;;;;;;;;;;;;
-
-* The user has to click on the lock, before it's possible to change the value. This will protect data against unwanted modification.
-* After Form load, the value is shown, but not editable.
-* Shows a 'lock' on the right side of an input element of type `text`, `date`, `time` or `datetime`.
-* This option is not available for FormElements with `mode=readonly`.
-* There is no value needed for this parameter.
-
-.. _`extraButtonPassword`:
-
-extraButtonPassword
-;;;;;;;;;;;;;;;;;;;
-
-* The user has to click on the eye (unhide) to see the value.
-* After Form load, the data is hided by asteriks.
-* Shows an 'eye' on the right side of an input element of type `text`, `date`, `time` or `datetime`.
-* There is no value needed for this parameter.
-
-.. _`extraButtonInfo`:
-
-extraButtonInfo
-;;;;;;;;;;;;;;;
-
-* The user has to click on the `info` button/icon to see an additional message.
-* After Form load, the information message is hidden.
-* The value of this parameter is the text shown.
-* Shows an `info` button/icon, depending of EXTRA_BUTTON_INFO_POSITION in `config.qfq.ini`_
-
-  * `auto`, depending on `FormElement` type:
-
-    * on the right side of an input element for type `text`, `date`, `time` or `datetime`,
-    * below the FormElement for all other types.
-
-  * `below`: below the FormElement for all types.
-
-* With display `below`, a defined class in `extraButtonInfoClass` (FE, F, config.qfq.ini) will be applied. E.g. this
-  might be `pull-right` to align the grafic on the right side of the input element.
-
-.. _`input-checkbox`:
-
-Type: checkbox
-^^^^^^^^^^^^^^
-
-Checkboxes can be rendered in mode:
-
-* *single*:
-
-  * One column in a table corresponds to one checkbox.
-  * The value for statuses *checked* and *unchecked* are free to choose.
-  * This mode is selected, if a) *checkBoxMode* = single, or b) *checkBoxMode* is missing **and** the number of fields of the column definition is <3.
-  * *FormElement.parameter*:
-
-    * *checkBoxMode* = single (optional)
-    * *checked* = <value> (optional, the value which represents 'checked')
-
-      * If *checked* is empty or missing: If *type* = 'enum' or 'set', get first item of the definition. If *type* = string, get default.
-
-    * *unchecked* = <value> (optional, the value which represents 'unchecked')
-
-      * If *unchecked* is empty or missing: If *type* = 'enum' or 'set', get second item of checked. If *type* = 'string', get ''.
-
-    * *label2* = <value>       (Text right beside checkbox) (optional)
-
-
-* *multi*:
-
-  * One column in a table represents multiple checkboxes. This is typically useful for the column type *set*.
-  * The value for status *checked* are free to choose, the value for status *unchecked* is always the empty string.
-  * Each field key (or the corresponding value from the key/value pair) will be rendered right beside the checkbox.
-  * *FormElement.parameter*
-
-    * *checkBoxMode* = multi
-    * *itemList* - E.g.:
-
-      * ``itemList=red,blue,orange``
-      * ``itemList=1:red,2:blue,3:orange``
-      * If ':' or ',' are part of key or value, it needs to escaped by '\'. E.g.: `itemList=1:red\:,2:blue\,,3:orange``
-
-  * *FormElement.sql1* = ``{{!SELECT id, value FROM someTable}}``
-  * *FormElement.maxlength* - vertical or horizontal alignment:
-
-     * Value: '', 0, 1 - The check boxes will be aligned vertical.
-     * Value: >1 - The  check boxes will be aligned horizontal, with a linebreak every 'value' elements.
-
-* *FormElement.parameter*:
-
-  * *emptyHide*: Existence of this item hides an entry with an empty string. This is useful for e.g. Enums, which have an empty
-    entry, but the empty value should not be selectable.
-  * *emptyItemAtStart*: Existence of this item inserts an empty entry at the beginning of the selectlist.
-  * *emptyItemAtEnd*: Existence of this item inserts an empty entry at the end of the selectlist.
-  * *buttonClass*: Instead of the plain HTML  checkbox fields, Bootstrap
-    `buttons <http://getbootstrap.com/javascript/#buttons-checkbox-radio>`_. are rendered as `checkbox` elements. Use
-    one of the following `classes <http://getbootstrap.com/css/#buttons-options>`_:
-    * `btn-default` (default, grey),
-    * `btn-primary` (blue),
-    * `btn-success` (green),
-    * `btn-info` (light blue),
-    * `btn-warning` (orange),
-    * `btn-danger` (red).
-    With a given *buttonClass*, all buttons (=radios) are rendered horizontal. A value in *FormElement.maxlength* has no effect.
-
-* *No preselection*:
-
-  * If a form is in 'new' mode and if there is a default value configured on a table column, such a value is shown by default.
-    There might be situations, where the user should be forced to select a value (e.g. specifying the gender). An unwanted
-    default value can be suppressed by specifying an explicit definition on the FormElement field `value`::
-
-      {{<columnname>:RZ}}
-
-    For existing records the shown value is as expected the value of the record. For new records, it's the value `0`,
-    which is typically not one of the ENUM / SET values and therefore nothing is selected.
-
-
-Type: date
-^^^^^^^^^^
-
-* Range datetime: '1000-01-01' to '9999-12-31' or '0000-00-00'. (http://dev.mysql.com/doc/refman/5.5/en/datetime.html)
-* Optional:
-
-  * *FormElement.parameter.dateFormat*: yyyy-mm-dd | dd.mm.yyyy
-
-Type: datetime
-^^^^^^^^^^^^^^
-
-* Range datetime: '1000-01-01 00:00:00' to '9999-12-31 23:59:59' or '0000-00-00 00:00:00'. (http://dev.mysql.com/doc/refman/5.5/en/datetime.html)
-* Optional:
-
-  * *FormElement.parameter*:
-
-    * *dateFormat*: yyyy-mm-dd | dd.mm.yyyy
-    * *showSeconds*: 0|1 - shows the seconds. Independent if the user specifies seconds, they are displayed '1' or not '0'.
-    * *showZero*: 0|1 - For an empty timestamp, With '0' nothing is displayed. With '1' the string '0000-00-00 00:00:00' is displayed.
-
-Type: extra
-^^^^^^^^^^^
-
-* Element is not shown in the browser.
-* The element can be used to define / precalculate values for a column, which do not already exist as a native *FormElement*.
-* The element is build / computed on form load and saved alongside with the SIP parameter of the current form.
-* Access the value without specifying any store (default store priority is sufficient).
-
-.. _`input-text`:
-
-Type: text
-^^^^^^^^^^
-
-* General input for text and number.
-* *FormElement.size*:
-
-  * <number>:  width of input element in characters. Lineheight = 1.
-  * <cols>,<rows>: input element = textarea, width=<cols>, height=<rows>
-
-* *FormElement.parameter*:
-
-  * *retype* = 1 (optional): Current input element will be rendered twice. The form can only submitted if both elements are equal.
-  * *retypeLabel* = <text> (optional): The label of the second element.
-  * *retypeNote* = <text> (optional): The note of the second element.
-  * *characterCountWrap* = <text1>|<text2> (optional). Displays a character counter below the input/textarea element. If
-    `text1` / `text2` is missing, just display `<current>/</max>`. Customization: `characterCountWrap=<div class=qfq-cc-style>Count: |</div>`
-  * Also check the  :ref:`fe-parameter-attributes` *data-...-error* to customize error messages shown by the validator.
-  * *hideZero* = 0|1 (optional): `with hideZero=1` a '0' in the value will be replaced by an empty string.
-  * *emptyMeansNull* = [0|1] (optional): with `emptyMeansNull` or `emptyMeansNull=1` a NULL value will be written if
-    the value is an empty string
-
-.. _`input-typeahead`:
-
-Type Ahead
-''''''''''
-
-Activating `typeahead` functionality offers an instant lookup of data and displaying them to the user, while the user is
-typing, a drop-down box offers the results. As datasource the regular SQL connection or a LDAP query can be used.
-With every keystroke (starting from the *typeAheadMinLength* characters), the already typed value will be transmitted to
-the server, the lookup will be performed and the result, upto *typeAheadLimit* entries, are displayed as a drop-down box.
-
-* *FormElement.parameter*:
-
-  * *typeAheadLimit* = <number>. Max numbers of result records to be shown. Default is 20.
-  * *typeAheadMinLength* = <number>. Minimum length to type before the first lookup starts.
-
-Depending of the `typeahead` setup, the given FormElement will contain the displayed `value` or `id` (if an id/value dict is
-configured).
-
-Configuration via Form / FormElement
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-All of the `typeAhead*` (except `typeAheadLdap`) and `ldap*` parameter can be specified either in
-*Form.parameter* or in *FormElement.parameter*.
-
-SQL
-;;;
-
-* *FormElement.parameter*:
-
-  * *typeAheadSql* = `SELECT ... AS 'id', ... AS 'value' WHERE name LIKE ? OR firstName LIKE ? LIMIT 100`
-
-    * If there is only one column in the SELECT statement, that one will be used and there is no dict (key/value pair).
-    * If there is no column `id` or no column `value`, than the first column becomes `id` and the second column becomes `value`.
-    * The query will be fired as a 'prepared statement'.
-    * The value, typed by the user, will be replaced on all places where a `?` appears.
-    * All `?` will be automatically surrounded by '%'. Therefore wildcard search is implemented: `... LIKE '%<?>%' ...`
-
-LDAP
-;;;;
-
-See :ref:`LDAP_Typeahead`
-
-.. _`input-editor`:
-
-Type: editor
-^^^^^^^^^^^^
-
-* TinyMCE (https://www.tinymce.com, community edition) is used as the QFQ Rich Text Editor.
-* The content will be saved as HTML inside the database.
-* All configuration and plugins will be configured via the 'parameter' field. Just prepend the word 'editor-' in front
-  of each TinyMCE keyword. Check possible options under:
-
-  * https://www.tinymce.com/docs/configure/,
-  * https://www.tinymce.com/docs/plugins/,
-  * https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols
-
-* Bars:
-
-  * Top: *menubar* - by default hidden.
-  * Top: *toolbar* - by default visible.
-  * Bottom: *statusbar* - by default hidden, exception: *min_height* and *max_height* are given via size parameter.
-
-
-* The default setting in *FormElement.parameter* is::
-
-    editor-plugins=code link searchreplace table textcolor textpattern visualchars
-    editor-toolbar=code searchreplace undo redo | styleselect link table | fontselect fontsizeselect | bullist numlist outdent indent | forecolor backcolor bold italic editor-menubar=false
-    editor-statusbar=false
-
-* To deactivate the surrouding `<p>` tag, configure in *FormElement.parameter*::
-
-     editor-forced_root_block=false
-
-  This might have impacts on the editor. See https://www.tinymce.com/docs/configure/content-filtering/#forced_root_block
-
-* *FormElement.size*:
-
-  * <min_height>,<max_height>: in pixels, including top and bottom bars. E.g.: 300,600
-
-
-Type: note
-^^^^^^^^^^
-
-An FormElement without any 'input' functionality -just to show some text. Use the typical fields 'label', 'value' and
-'note' to be displayed in the corresponding three standard columns.
-
-Type: password
-^^^^^^^^^^^^^^
-
-* Like a `text` element, but every character is shown as an asterisk.
-
-.. _`input-radio`:
-
-Type: radio
-^^^^^^^^^^^
-
-* Radio Buttons will be built from one of three sources:
-
-  1. 'sql1': E.g. *{{!SELECT type AS label FROM car }}* or *{{!SELECT type AS label, typeNr AS id FROM car}}* or *{{!SHOW tables}}*.
-
-    * Resultset format 'named': column 'label' and optional a column 'id'.
-    * Resultset format 'index':
-
-      * One column in resultset >> first column represents *label*
-      * Two or more columns in resultset >> first column represents *id* and second column represents *label*.
-
-  2. *FormElement.parameter*:
-
-    * *itemList* = `<attribute>` E.g.: *itemList=red,blue,orange* or *itemList=1:red,2:blue,3:orange*
-    * If ':' or ',' are part of key or value, it needs to escaped by '\'. E.g.: `itemList=1:red\:,2:blue\,,3:orange``
-
-  3. Definition of the *enum* or *set* field (only labels, ids are not possible).
-
-
-* *FormElement.maxlength* = `<value>`
-
-   * Applies only to 'plain' radio elements (not the Bootstrap 'buttonClass' from below)
-   * *vertical* or *horizontal* alignment:
-
-     * `<value>`: '', 0, 1 - The radios will be aligned *vertical*.
-     * `<value>`: >1 - The readios will be aligned *horizontal*, with a linebreak every 'value' elements.
-
-
-* *FormElement.parameter*:
-
-  * *emptyHide*: Existence of this item hides an entry with an empty string. This is useful for e.g. Enums, which have an empty
-    entry, but the empty value should not be selectable.
-  * *emptyItemAtStart*: Existence of this item inserts an empty entry at the beginning of the selectlist.
-  * *emptyItemAtEnd*: Existence of this item inserts an empty entry at the end of the selectlist.
-  * *buttonClass*: Instead of the plain radio fields, Bootstrap
-    `buttons <http://getbootstrap.com/javascript/#buttons-checkbox-radio>`_. are rendered as `radio` elements. Use
-    one of the following `classes <http://getbootstrap.com/css/#buttons-options>`_:
-    * `btn-default` (default, grey),
-    * `btn-primary` (blue),
-    * `btn-success` (green),
-    * `btn-info` (light blue),
-    * `btn-warning` (orange),
-    * `btn-danger` (red).
-    With a given *buttonClass*, all buttons (=radios) are rendered horizontal. A value in *FormElement.maxlength* has no effect.
-
-* *No preselection*:
-
-  * If there is a default configured on a table column, such a value is selected by default. If the user should actively
-    choose an option, the 'preselection' can be omitted by specifying an explicit definition on the FormElement field `value`::
-
-      {{<columnname>:RZ}}
-
-    For existing records the shown value is as expected the value of the record. For new records, it's the value `0`,
-    which is typically not one of the ENUM values and therefore nothing is selected.
-
-.. _`input-select`:
-
-Type: select
-^^^^^^^^^^^^
-
-* Select lists will be built from one of three sources:
-
-  * 'sql1': E.g. *{{!SELECT type AS label FROM car }}* or *{{!SELECT type AS label, typeNr AS id FROM car}}* or *{{!SHOW tables}}*.
-
-    * Resultset format 'named': column 'label' and optional a column 'id'.
-    * Resultset format 'index':
-
-      * One column in resultset >> first column represents *label*
-      * Two or more columns in resultset >> first column represents *id* and second column represents *label*.
-
-  * *FormElement.parameter*:
-
-    * *itemList* = `<attribute>` - E.g.: *itemList=red,blue,orange* or *itemList=1:red,2:blue:3:orange*
-    * If ':' or ',' are part of key or value, it needs to escaped by '\'. E.g.: `itemList=1:red\:,2:blue\,,3:orange``
-
-  * Definition of the *enum* or *set* field (only labels, ids are not possible).
-
-* *FormElement.size*: `<value>`
-
-  * `<value>`: <empty>|0|1: drop-down list.
-  * `<value>`: >1: Select field with *size* rows height. Multiple selection of items is possible.
-
-* *FormElement.parameter*:
-
-  * *emptyItemAtStart*: Existence of this item inserts an empty entry at the beginning of the selectlist.
-  * *emptyItemAtEnd*: Existence of this item inserts an empty entry at the end of the selectlist.
-  * *emptyHide*: Existence of this item hides the empty entry. This is useful for e.g. Enums, which have an empty
-    entry and the empty value should not be an option to be selected.
-
-.. _`subrecord-option`:
-
-Type: subrecord
-^^^^^^^^^^^^^^^
-
-The *FormElement* type 'subrecord' renders a list of records (so called secondary records), typically to show, edit, delete
-or add new records. The list is defined as a SQL query. The number of records shown is not limited. These *FormElement*
-will be rendered inside the form as a HTML table.
-
-* *mode / modeSql*:
-
-  * *show / required*: the regular mode to show the subrecords
-  * *readonly*: New / Edit / Delete Buttons are disabled
-  * *hidden*: The FormElement is rendered, but disabled with `display='none'`.
-
-* *dynamicUpdate*: not supported at the moment.
-
-* *sql1*: SQL query to select records. E.g.::
-
-   {{!SELECT a.id AS id, CONCAT(a.street, a.streetnumber) AS a, a.city AS b, a.zip AS c FROM Address AS a}}
-
-  * Notice the **exclamation mark** after '{{' - this is necessary to return an array of elements, instead of a single string.
-  * Exactly one column **'id'** has to exist; it specifies the primary record for the target form.
-    In case the id should not be visible to the user, it has to be named **'_id'**.
-  * Columnname: *[title=]<title>[|[maxLength=]<number>][|width=<number>][|nostrip][|icon][|link][|url][|mailto][|_rowClass][|_rowTooltip]*
-
-    * If the keyword is used, all parameter are position independent.
-    * Parameter are seperated by '|'.
-    * *[title=]<text>*: Title of the column. The keyword 'title=' is optional. Columns with a title starting with '_' won't be rendered.
-    * *[maxLength=]<number>*: Max. number of characters displayed per cell. The keyword 'maxLength=' is optional. Default
-       maxLength '20'. A value of '0' means no limit. This setting also affects the title of the column.
-    * *nostrip*: by default, html tags will be stripped off the cell content before rendering. This protects the table
-      layout. 'nostrip' deactivates the cleaning to make pure html possible.
-    * *icon*: the cell value contains the name of an icon in *typo3conf/ext/qfq/Resources/Public/icons*. Empty cell values
-      will omit an html image tag (=nothing rendered in the cell).
-    * *link*: value will be rendered as described under :ref:`column-link`
-    * *url*: value will be rendered as a href url.
-    * *mailto*: value will be rendered as a href mailto.
-    * *_rowClass*
-
-      * The value is a CSS class name(s) which will be rendered in the *<tr class="<_rowClass>">* of the subrecord table.
-      * The column itself is not rendered.
-      * By using Bootstrap, the following predefined classes are available:
-
-        * Text color: *text-muted|text-primary|text-success|text-info|text-warning|text-danger* (http://getbootstrap.com/css/#helper-classes)
-        * Row background: *active|success|info|warning|danger* (http://getbootstrap.com/css/#tables-contextual-classes)
-
-    * *_rowTooltip*
-
-      * Defines the title attribute (=tooltip) of a subrecord table row.
-
-    * Examples::
-
-         {{!SELECT id, note1 AS 'Comment', note2 AS 'Comment|50' , note3 AS 'title=Comment|maxLength=100|nostrip', note4 AS '50|Comment',
-         'checked.png' AS 'Status|icon', email AS 'mailto', CONCAT(homepage, '|Homepage') AS 'url',
-         ELT(status,'info','warning','danger') AS '_rowClass', help AS '_rowTooltip' ...}}
-
-* *FormElement.parameter*
-
-  * *form*: Target form, e.g. *form=person*
-  * *page*: Target page with detail form. If none specified, use the current page.
-  * *title*: Title displayed over the table in the current form.
-  * *extraDeleteForm*: Optional. The per row delete Button will reference the form specified here (for deleting) instead of the default (*form*).
-  * *detail*: Mapping of values from a) the primary form, b) the current row, c) any constant or '{{...}}' - to the target form (defined via `form=...`).
-
-    * Syntax::
-
-        <source table column name 1|&constant 1>:<target column name 1>[,<source table column name 2|&constant 2>:<target column name 2>][...]
-
-    * Example: *detail=id:personId,rowId:secId,&12:xId,&{{a}}:personId*  (rowId is a column of the current selected row defined by sql1)
-    * By default, the given value will overwrite values on the target record. In most situations, this is the wished behaviour.
-    * Exceptions of the default behaviour have to be defined on the target form in the corresponding *FormElement* in the
-      field *value* by changing the default Store priority definition. E.g. `{{<columnname>:RS0}}` - For existing records,
-      the store `R` will provide a value. For new records, store `R` is empty and store S will be searched for a value:
-      the value defined in `detail` will be choosen. At last the store '0' is defined as a fallback.
-    * *source table column name*: E.g. A person form is opened with person.id=5 (r=5). The definition `detail=id:personId`
-      and `form=address` maps person.id to address.personId. On the target record, the column personId becomes '5'.
-    * *Constant '&'*: Indicate a 'constant' value. E.g. `&12:xId` or `{{...}}` (all possibilities, incl. further SELECT
-      statements) might be used.
-
-  * *subrecordTableClass*: Optional. Default: 'table table-hover'. If given, the default will be overwritten.
-
-Type: time
-^^^^^^^^^^
-
-* Range time: '00:00:00' to '23:59:59' or '00:00:00'. (http://dev.mysql.com/doc/refman/5.5/en/datetime.html)
-* Optional:
-* *FormElement.parameter*
-  * *showSeconds*: 0|1 - shows the seconds. Independent if the user specifies seconds, they are displayed '1' or not '0'.
-  * *showZero*: 0|1 - For an empty timestamp, With '0' nothing is displayed. With '1' the string '00:00[:00]' is displayed.
-
-.. _`input-upload`:
-
-Type: upload
-^^^^^^^^^^^^
-
-* See: https://www.w3.org/TR/html5/forms.html#file-upload-state-(type=file)
-
-An upload element is based on a 'file browse'-button and a 'trash'-button (=delete). Only one of them is shown at a time.
-The 'file browse'-button is displayed, if there is no file uploaded already.
-The 'trash'-button is displayed, if there is a file uploaded already.
-
-After clicking on the browse brutton, the user select a file from the local filesystem.
-After choosing the file, the upload starts immediately, shown by a turning wheel. When the server received the whole file
-and accepts (see below) the file, the 'file browse'-button disappears and the filename is shown, followed by a 'trash'-button.
-Either the user is satisfied now or the user can delete the uploaded file (and maybe upload another one).
-
-Until this point, the file is cached on the server but not copied to the `fileDestination`. The user have to save the
-current record, either to finalize the upload and/or to delete a previous uploaded file.
-
-The FormElement behaves like a
-
-* 'native FormElement' (showing controls/text on the form) as well as an
-* 'action FormElement' by fireing queries and doing some additional actions during form save.
-
-Inside the *Form editor* it's shown as a 'native FormElement'.
-During saving the current record, it behaves like an action FormElement
-and will be processed after saving the primary record and before any action FormElements are processed.
-
-* *FormElement.value*: By default, the full path of any already uploaded file is shown. To show something different, e.g.
-  only the filename, define: ::
-
-	 {{SELECT SUBSTRING_INDEX(pathFilenamePicture, '/', -1) FROM Note WHERE id={{id:R0}} }}
-
-* *FormElement.parameter*:
-
-  * *capture=camera*: On a smartphone, after pressing the 'open file' button, the camera will be opened and a
-    choosen picture will be uploaded. Automatically set/overwrite `accept=image/*`.
-
-  * *accept*: `<mime type>,image/*,video/*,audio/*,.doc,.docx,.pdf`
-
-    * List of mime types (also known as 'media types'): http://www.iana.org/assignments/media-types/media-types.xhtml
-    * If none is specified, 'application/pdf' is set. This forces that always (!) one type is specified.
-    * One or more media types might be specified, seperated by ','.
-    * Different browser respect the given definitions in different ways. Typically the 'file choose' dialog offer:
-
-      * the specified mime type (some browers only show 'custom', if more than one mime type is given),
-      * the option 'All files' (the user is always free to **try** to upload other filetypes),
-      * the 'file choose' dialog only offers files of the selected (in the dialog) type.
-
-    * If for a specific filetype is no mime type available, the definition of file extension(s) is possible. This is **less
-      secure**, cause there is no *content* check on the server after the upload.
-
-  * *maxFileSize*: max filesize in bytes for an uploaded file. Default: 10485760 (=10MB)
-
-  * *fileDestination*: Destination where to copy the file. A good practice is to specify a relative `fileDestination` -
-    such an installation (filesystem and database) are moveable.
-
-    * If the original filename should be part of `fileDestination`, the variable *{{filename}}* (STORE_VARS) can be used. Example ::
-
-        fileDestination={{SELECT 'fileadmin/user/pictures/', p.name, '-{{filename}}' FROM Person AS p WHERE p.id={{id:R0}} }}
-
-      * The original filename will be sanitized: only '<alnum>', '.' and '_' characters are allowed. German 'umlaut' will
-        be replaced by 'ae', 'ue', 'oe'. All non valid characters will be replaced by '_'.
-
-    * If a file already exist under `fileDestination`, an error message is shown and 'save' is aborted. The user has no
-      possibility to overwrite the already existing file. If the whole workflow is correct, this situation should no
-      arise. Check also *fileReplace* below.
-
-    * All necessary subdirectories in `fileDestination` are automatically created.
-
-    * Using the current record id in the `fileDestination`: Using {{r}} is problematic for a 'new' primary record: that
-      one is still '0' at the time of saving. Use `{{id:R0}}` instead.
-
-    * Uploading of malicious code (e.g. PHP files) is hard to detect. The default mime type check can be easily faked
-      by an attacker. Therefore it's recommended to use a `fileDestination`-directory, which is secured against script
-      execution (even if the file has been uploaded, the webserver won't execute it) - see `SecureDirectFileAccess`_.
-
-  * *slaveId*, *sqlBefore*, *sqlInsert*, *sqlUpdate*, *sqlDelete*, *sqlUpdate*, *sqlAfter*: Only used in :ref:`Upload advanced mode`.
-
-  * *fileReplace=always*: If `fileDestination` exist - replace it by the new one.
-
-Immediately after the upload finished (before the user press save), the file will be checked on the server for it's
-content or file extension (see 'accept').
-
-The maximum size is defined by the minimum of `upload_max_filesize`, `post_max_size` and `memory_limit` (PHP script) in the php.ini.
-
-In case of broken uploads, please also check `max_input_time` in php.ini.
-
-
-Deleting a record and the referenced file
-'''''''''''''''''''''''''''''''''''''''''
-
-If the user deletes a record (e.g. pressing the delete button on a form) which contains reference(s) to files, such files
-are deleted too. Slave records, which might be also deleted through a 'delete'-form, are *not* checked for file references
-and therefore such files are not deleted on the filesystem.
-
-Only columns where the columname contains `pathFileName` are checked for file references. Therefore, always choose a
-columnanme which contains `pathFileName`.
-
-If there are other records, which references the same file, such files are not deleted.
-It's a very basic check: just the current column of the current table is compared. In general it's not a good idea to
-have mutliple references to a single file. Therefore this check is just a fallback.
-
-.. _Upload simple mode:
-
-Upload simple mode
-;;;;;;;;;;;;;;;;;;
-
-Requires: *'upload'-FormElement.name = 'column name'* of an column in the primary table.
-
-After moving the file to `fileDestination`, the current record/column will be updated to `fileDestination`.
-The database definition of the named column has to be a string variant (varchar, text but not numeric or else).
-On form load, the column value will be displayed as path/filename.
-Deleting an uploaded file in the form (by clicking on the trash near beside) will delete
-the file on the filesystem as well. The column will be updated to an empty string.
-
-This happens automatically without any further definiton in the 'upload'-FormElement.
-
-Multiple 'upload'-FormElements per form are possible. Each of it needs an own table column.
-
-.. _Upload advanced mode:
-
-Upload advanced mode
-;;;;;;;;;;;;;;;;;;;;
-
-Requires: *'upload'-FormElement.name* is unknown as a column in the primary table.
-
-This mode will serve further database structure scenarios.
-
-A typical name for such an 'upload'-FormElement, to show that the name does not exist in the table, might start with 'my', e.g. 'myUpload1'.
-
-* *FormElement.value*: The path/filename, shown during 'form load' to indicate a previous uploaded file, has to be queried
-  with this field. E.g.::
-
-      {{SELECT pathFilenamePicture FROM Note WHERE id={{slaveId}} }}
-
-* *FormElement.parameter*:
-
-  * *fileDestination*: determine the path/filename. E.g.::
-
-     fileDestination=fileadmin/person/{{name:R0}}_{{id:R}}/uploads/picture_{{filename}}
-
-  * *slaveId*: Defines the target record where to retrieve and store the path/filename of the uploaded file. Check also :ref:`slave-id`. E.g.::
-
-      slaveId={{SELECT id FROM Note WHERE pId={{id:R0}} AND type='picture' LIMIT 1}}
-
-  * *sqlBefore*: fired during a form save, before the following queries are fired.
-
-  * *sqlInsert*: fired if `slaveId=0` and an upload exist (user has choosen a file)::
-
-      sqlInsert={{INSERT INTO Note (pId, type, pathFileName) VALUE ({{id:R0}}, 'image', '{{fileDestination}}') }}
-
-  * *sqlUpdate*: fired if `slaveId>0` and an upload exist (user has choosen a file). E.g.::
-
-      sqlUpdate={{UPDATE Note SET pathFileName = '{{fileDestination}}' WHERE id={{slaveId}} LIMIT 1}}
-
-  * *sqlDelete*: fired if `slaveId>0` and no upload exist (user has not choosen a file). E.g.::
-
-      sqlDelete={{DELETE FROM Note WHERE id={{slaveId:V}}  LIMIT 1}}
-
-  * *sqlAfter*: fired after all previous queries have been fired. Might update the new created id to a primary record. E.g.::
-
-      sqlAfter={{UPDATE Person SET noteIdPicture = {{slaveId}} WHERE id={{id:R0}} LIMIT 1 }}
-
-
-
-.. _class-action:
-
-Class: Action
--------------
-
-Type: before... | after...
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-These type of 'action' *FormElements* will be used to implement data validation or creating/updating additional records.
-
-Types:
-
-  * beforeLoad (e.g. good to check access permission)
-  * afterLoad
-  * beforeSave (e.g. to prohibit creating of duplicate records)
-  * afterSave (e.g. to to create & update additional records)
-  * beforeInsert
-  * afterInsert
-  * beforeUpdate
-  * afterUpdate
-  * beforeDelete (e.g. to delete slave records)
-  * afterDelete
-  * paste (configure copy/paste forms)
-
-Parameter: sqlValidate
-''''''''''''''''''''''
-
-  Perform checks by fireing a SQL query and expecting a predefined number of selected records.
-
-  * OK: the `expectRecords` number of records has been selected. Continue processing the next *FormElement*.
-  * Fail: the `expectRecords` number of records has not been selected (less or more): Display the error message
-    `messageFail` and abort the whole (!) current form load or save.
-
-  *FormElement.parameter*:
-
-  * *requiredList* - List of `native`-*FormElement* names: only if all of those elements are filled (!=0 and !=''), the *current*
-    `action`-*FormElement* will be processed. This will enable or disable the check, based on the user input! If no
-    `native`-*FormElement* names are given, the specified check will always be performed.
-  * *sqlValidate* - validation query. E.g.: `sqlValidate={{!SELECT id FROM Person AS p WHERE p.name LIKE {{name:F:all}} AND p.firstname LIKE {{firstname:F:all}} }}`
-
-    * Pay attention to `{{!...` after the equal sign.
-
-  * *expectRecords* - number of expected records.
-
-    * *expectRecords* = `0` or *expectRecords* = `0,1` or *expectRecords* = `{{SELECT COUNT(id) FROM Person}}`
-    * Separate multiple valid record numbers by ','. If at least one of those matches, the check will pass successfully.
-
-  * *messageFail* - Message to show. E.g.: *messageFail* = `There is already a person called {{firstname:F:all}} {{name:F:all}}`
-
-
-.. _slave-id:
-
-Parameter: slaveId
-''''''''''''''''''
-
-*FormElement.parameter*:
-
-  * *slaveId*:
-
-    * Auto fill: name the action `action`-*FormElement* equal to an existing column (table from the current form definition).
-      *slaveId* will be automatically filled with the value of the named column.
-
-      * If there is no such named columnname, set *slaveId* = `0`.
-
-    * Explicit definition: *slaveId* = `123` or *slaveId* = `{{SELECT id ...}}`
-
-Note:
-
-  * `{{slaveId}}` can be used in any query of the current *FormElement*.
-  * If the `action`-*FormElement* name exist as a column in the master record: Update that column *automatically* with the
-    recent slaveId
-  * After an INSERT the `last_insert_id()` becomes the *slaveId*).
-
-Parameter: sqlBefore / sqlInsert / sqlUpdate / sqlDelete / sqlAfter
-'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
-
-  * Save values of a form to different record(s), optionally on different table(s).
-  * Typically useful on 'afterSave' - be careful when using it earlier, e.g. beforeLoad.
-
-*FormElement.parameter*:
-
-  * *requiredList* - List of `native`-*FormElement*: only if all of those elements are filled, the current
-    `action`-*FormElement* will be processed.
-
-  * *sqlBefore*: always fired (before any *sqlInsert*, *sqlUpdate*, ..)
-  * *sqlInsert*: fired if *slaveId* == `0` or *slaveId* == `''`.
-  * *sqlUpdate*: fired if *slaveId* > `0`.
-  * *sqlDelete*: fired if *slaveId* > `0`, after *sqlInsert* or *sqlUpdate*. Be carefull not to delete filled records!
-    Always add a check, if values given, not to delete the record! *sqlHonorFormElements* helps to skip such checks.
-  * *sqlAfter*: always fired (after *sqlInsert*, *sqlUpdate* or *sqlDelete*).
-  * *sqlHonorFormElements*: list of *FormElement* names (this parameter is optional).
-
-    * If one of the named *FormElements* is not empty:
-
-      * fire *sqlInsert* if *slaveId* == `0`,
-      * fire *sqlUpdate* if *slaveId* > `0`
-
-    * If all of the named *FormElements* are empty:
-
-      * fire *sqlDelete* if *slaveId* > `0`
-
-
-Example
-'''''''
-
-Situation 1: master.xId=slave.id (1:1)
-
- * Name the action element 'xId': than {{slaveId}} will be automatically set to the value of 'master.xId'
-
-   * {{slaveId}} == 0 ? 'sqlInsert' will be fired.
-   * {{slaveId}} != 0 ? 'sqlUpdate' will be fired.
-
- * In case of fireing 'sqlInsert', the 'slave.id' of the new created record are copied to master.xId (the database will
-   be updated automatically).
-
- * If the automatic update of the master record is not suitable, the action element should have no name or a name
-   which does not exist as a column of the master record. Define  `slaveId={{SELECT id ...}}`
-
- * Two *FormElements*  `myStreet` and `myCity`:
-
-    * Without *sqlHonorFormElements*. Parameter: ::
-
-       sqlInsert = {{INSERT INTO address (`street`, `city`) VALUES ('{{myStreet:FE:alnumx:s}}', '{{myCity:FE:alnumx:s}}') }}
-       sqlUpdate = {{UPDATE address SET `street` = '{{myStreet:FE:alnumx:s}}', `city` = '{{myCity:FE:alnumx:s}}'  WHERE id={{slaveId}} LIMIT 1 }}
-       sqlDelete = {{DELETE FROM address WHERE id={{slaveId}} AND '{{myStreet:FE:alnumx:s}}'='' AND '{{myCity:FE:alnumx:s}}'='' LIMIT 1 }}
-
-    * With *sqlHonorFormElements*. Parameter: ::
-
-       sqlHonorFormElements = myStreet, myCity     # Non Templategroup
-       sqlInsert = {{INSERT INTO address (`street`, `city`) VALUES ('{{myStreet:FE:alnumx:s}}', '{{myCity:FE:alnumx:s}}') }}
-       sqlUpdate = {{UPDATE address SET `street` = '{{myStreet:FE:alnumx:s}}', `city` = '{{myCity:FE:alnumx:s}}'  WHERE id={{slaveId}} LIMIT 1 }}
-       sqlDelete = {{DELETE FROM address WHERE id={{slaveId}} LIMIT 1 }}
-
-       # For Templategroups: sqlHonorFormElements = myStreet%d, myCity%d
-
-Situation 2: master.id=slave.xId (1:n)
-
- * Name the action element *different* to any columnname of the master record (or no name).
- * Determine the slaveId: `slaveId={{SELECT id FROM slave WHERE slave.xxx={{...}} LIMIT 1}}`
-
-   * {{slaveId}} == 0 ? 'sqlInsert' will be fired.
-   * {{slaveId}} != 0 ? 'sqlUpdate' will be fired.
-
- * Two *FormElements*  `myStreet` and `myCity`. The `person` is the master record, `address` is the slave:
-
-    * Without *sqlHonorFormElements*. Parameter: ::
-
-       slaveId = {{SELECT id FROM address WHERE personId={{id}} ORDER BY id LIMIT 1 }}
-       sqlInsert = {{INSERT INTO address (`personId`, `street`, `city`) VALUES ({{id}}, '{{myStreet:FE:alnumx:s}}', '{{myCity:FE:alnumx:s}}') }}
-       sqlUpdate = {{UPDATE address SET `street` = '{{myStreet:FE:alnumx:s}}', `city` = '{{myCity:FE:alnumx:s}}'  WHERE id={{slaveId}} LIMIT 1 }}
-       sqlDelete = {{DELETE FROM address WHERE id={{slaveId}} AND '{{myStreet:FE:alnumx:s}}'='' AND '{{myCity:FE:alnumx:s}}'='' LIMIT 1 }}
-
-    * With *sqlHonorFormElements*. Parameter: ::
-
-       slaveId = {{SELECT id FROM address WHERE personId={{id}} ORDER BY id LIMIT 1 }}
-       sqlHonorFormElements = myStreet, myCity       # Non Templategroup
-       sqlInsert = {{INSERT INTO address (`personId`, `street`, `city`) VALUES ({{id}}, '{{myStreet:FE:alnumx:s}}', '{{myCity:FE:alnumx:s}}') }}
-       sqlUpdate = {{UPDATE address SET `street` = '{{myStreet:FE:alnumx:s}}', `city` = '{{myCity:FE:alnumx:s}}'  WHERE id={{slaveId}} LIMIT 1 }}
-       sqlDelete = {{DELETE FROM address WHERE id={{slaveId}} LIMIT 1 }}
-
-       # For Templategroups: sqlHonorFormElements = myStreet%d, myCity%d
-
-Type: sendmail
-^^^^^^^^^^^^^^
-
-* Send mail(s) will be processed after:
-
-   * saving the record ,
-   * processing all uploads,
-   * processing `afterSave` action `FormElements`.
-
-
-* *FormElement.value*: Body of the email.
-
-* *FormElement.parameter*:
-
-  * *sendMailTo* - Comma-separated list of receiver email addresses. Optional: 'realname <john@doe.com>. If there
-    is no recipient email address, *no* mail will be sent.
-  * *sendMailCc* - Comma-separated list of receiver email addresses. Optional: 'realname <john@doe.com>.
-  * *sendMailBcc* - Comma-separated list of receiver email addresses. Optional: 'realname <john@doe.com>.
-  * *sendMailFrom* - Sender of the email. Optional: 'realname <john@doe.com>'. **Mandatory**.
-  * *sendMailSubject* - Subject of the email.
-  * *sendMailReplyTo* - Reply this email address. Optional: 'realname <john@doe.com>'.
-  * *sendMailFlagAutoSubmit* - **on|off** - If 'on' (default), the mail contains the header
-    'Auto-Submitted: auto-send' - this suppress a) OoO replies, b) forwarding of emails.
-  * *sendMailGrId* - Will be copied to the mailLog record. Helps to setup specific logfile queries.
-  * *sendMailXId* - Will be copied to the mailLog record. Helps to setup specific logfile queries.
-
-* To use values of the submitted form, use the STORE_FORM. E.g. `{{name:F:allbut}}`
-* To use the `id` of a new created or already existing one, use the STORE_RECORD. E.g. `{{id:R}}`
-
-* For debugging, please check `REDIRECT_ALL_MAIL_TO`_.
-
-Type: paste
-'''''''''''
-
-See also `copy-form`_.
-
-* *sql1*: e.g. `{{!SELECT {{id:P}} AS id, '{{myNewName:FE:allbut}}' AS name}}` (only one record) or `{{!SELECT i.id AS id, {{basketId:P}} AS basketId FROM Item AS i WHERE i.basketId={{id:P}} }}` (multiple records)
-
-  * Pay attention to '!'.
-  * For every row, a new record is created in `recordDestinationTable`.
-  * Column 'id' is not copied.
-  * The `recordSourceTable` together with columne `id` will identify the source record.
-  * Columns not specified, will be copied 1:1 from source to destination.
-  * Columns specified, will overwrite the source value.
-
-* *FormElement.parameter*:
-
-  * *recordSourceTable* - Optional: table from where the records will be copied. Default: <recordDestinationTable>
-  * *recordDestinationTable* - table where the new records will be copied to.
-  * *translateIdColumn* - columnname to update references of newly created id's.
-
-.. _multi-language-form:
-
-Multi Language Form
--------------------
-
-QFQ Forms might be configured for up to 5 different languages. Per language there is one extra field in the *Form editor*.
-Which field represents which language is configured in `config.qfq.ini`_.
-
-* The Typo3 installation needs to be configured to handle different languages - this is independet of QFQ and not covered
-  here. QFQ will use the Typo3 internal variable 'pageLanguage', which typically correlates to the URL parameter 'L' in the URL.
-* In `config.qfq.ini`_ the Typo3 language index (value of 'L') and a language label have to be configured for each language.
-  Only than, the additional language fields in the *Form editor* will be shown.
-
-Example
-^^^^^^^
-
-Assuming the Typo3 page has the
-
-* default language, L=0
-* english, L=1
-* spain, L=2
-
-Configuration in `config.qfq.ini`: ::
-
-		FORM_LANGUAGE_A_ID = 1
-		FORM_LANGUAGE_A_LABEL = english
-
-		FORM_LANGUAGE_B_ID = 2
-		FORM_LANGUAGE_B_LABEL = spain
-
-The default language is not covered in config.qfq.ini.
-
-The *Form editor* now shows on the pill 'Basic' (Form und FormEditor) for both languages each an additional parameter
-input field. Any input field in the *Form editor* can be redeclared in the correspondig language parameter field. Any
-missing definition means 'take the default'. E.g.:
-
-* Form: 'person'
-	+--------------------+--------------------------+
-	| Column             | Value                    |
-	+====================+==========================+
-	| title              | Eingabe Person           |
-	+--------------------+--------------------------+
-	| languageParameterA | title=Input Person       |
-	+--------------------+--------------------------+
-	| languageParameterB | title=Persona de entrada |
-	+--------------------+--------------------------+
-
-* FormElement 'firstname' in Form 'person':
-	+--------------------+------------------------------------------------+
-	| Column             | Value                                          |
-	+====================+================================================+
-	| title              | Vorname                                        |
-	+--------------------+------------------------------------------------+
-	| note               | Bitte alle Vornamen erfassen                   |
-	+--------------------+------------------------------------------------+
-	| languageParameterA | | title=Firstname                              |
-	|                    | | note=Please give all firstnames              |
-	+--------------------+------------------------------------------------+
-	| languageParameterB | | title=Persona de entrada                     |
-	|                    | | note=Por favor, introduzca todos los nombres |
-	+--------------------+------------------------------------------------+
-
-
-The following fields are possible:
-
-* Form: *title, showButton, forwardMode, forwardPage, bsLabelColumns, bsInputColumns, bsNoteColumns, recordLockTimeoutSeconds*
-* FormElement: *label, mode, modeSql, class, type, subrecordOption, encode, checkType, ord, tabindex, size, maxLength,*
-  *bsLabelColumns, bsInputColumns, bsNoteColumns,rowLabelInputNote, note, tooltip, placeholder, value, sql1, feGroup*
-
-.. _dynamic-update:
-
-Dynamic Update
---------------
-
-The 'Dynamic Update' feature makes a form more interactive. If a user changes a *FormElement* who is tagged with
-'dynamicUpdate', *all* elements who are tagged with 'dynamicUpdate', will be recalculated and rerendered.
-
-The following fields will be recalculated during 'Dynamic Update'
-
-* 'modeSql' - Possible values: 'show', 'required', 'readonly', 'hidden'
-* 'label'
-* 'value'
-* 'note'
-* 'parameter.*' - especially 'itemList'
-
-To make a form dynamic:
-
-* Mark all *FormElements* with `dynamic update`=`enabled`, which should **initiate** or **receive** updates.
-
-See #3426 / Dynamic Update: Inputs loose the new content and shows the old value:
-
-* On **all** `dynamic update` *FormElements* an explicit definition of `value`, including a sanitize class, is necessary
-  (except the field is numeric). **A missing definition let's the content overwrite all the time with the old value**.
-  A typical definition for `value` looks like (default store priority is: FSRVD)::
-
-     {{<FormElement name>::alnumx}}
-
-* Define the receiving *FormElements* in a way, that they will interpret the recent user change! The form variable of the
-  specific sender *FormElement* `{{<sender element>:F:<sanitize>}}` should be part of one of the above fields to get an
-  impact. E.g.:
-  ::
-
-    [receiving *FormElement*].parameter: itemList={{ SELECT IF({{carPriceRange:FE:alnumx}}='expensive','Ferrari,Tesla,Jaguar','General Motors,Honda,Seat,Fiat') }}
-
-  Remember to specify a 'sanitize' class - a missing sanitize class means 'digit', every content, which is not numeric,
-  violates the sanitize class and becomes therefore an empty string!
-
-* If the dynamic update should work on existing and *new* records, it's important to guarantee that the query result is not empty!
-  even if the primary record does not exist! E.g. use a `LEFT JOIN`. The following query is ok for `new` and `edit`. ::
-
-    {{SELECT IF( IFNULL(adr.type,'') LIKE '%token%','show','hidden') FROM (SELECT 1) AS fake LEFT JOIN Address AS adr ON adr.type='{{type:FR0}}' LIMIT 1}}
-
-Examples
-^^^^^^^^
-
-* Master FormElement 'music' is a radio/enum of 'classic', 'jazz', 'pop'.
-
-Content of a select list
-''''''''''''''''''''''''
-
-* Slave FormElement 'interpret' is 'select'-list, depending of 'music'
-
-::
-
-   sql={{!SELECT name FROM interpret WHERE music={{music:FE:alnumx}} ORDER BY name}}
-
-Show / Hide a *FormElement*
-'''''''''''''''''''''''''''
-
-* Slave 'interpret' is displayed only for 'pop'. Field 'modeSql':
-
-::
-
-    {{SELECT IF( '{{music:FR:alnumx}}'='pop' ,'show', 'hidden' ) }}
-
-.. _form-layout:
-
-Form Layout
------------
-
-The forms will be rendered with Bootstrap CSS classes, based on the 12 column grid model (Bootstrap 3.x).
-Generally a 3 column layout for *label* columns on the left side, an *input* field column in the middle and a *note*
-column on the right side will be rendered.
-
-The used default column (=bootstrap grid) width is *3,6,3* for *label, input, note*.
-
-* The system wide default can be changed via `config-qfq-ini`_ - the new settings are the default
-  settings for all forms.
-* Per *Form* settings can be done in the *Form* parameter field. They overwrite the system wide default.
-* Per *FormElement* settings can be done in the *FormElement* parameter field. They overwrite the *Form* setting.
-
-A column will be switched off (no wrapping via `<div class='col-md-?>`) by setting a `0` on the respective column.
-
-Custom field width
-^^^^^^^^^^^^^^^^^^
-
-Per *FormElement* set `BS Label Columns`, `BS Input Columns` or `BS Note Columns` to customize an individual width.
-The sum of these three columns should always be 12.
-
-Multiple Elements per row
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Every row is by default wrapped in a `<div class='form-group'>` and every column is wrapped in a `<div class='col-md-?'>`.
-To display multiple input elements in one row, the wrapping of the *FormElement* row and of the three columns can be
-customized via the checkboxes of `Label / Input / Note`. Every open and every close tag can be individually switched on
-or off.
-
-E.g. to display 2 *FormElements* in a row with one label (first *FormElement*) and one note (last *FormElement*) we need
-the following (switch off all non named):
-
-* First *FormElement*
-
-  * open row tag: `row` ,
-  * open and close label tag: `label`, `/label`,
-  * open and close field tag: `input`, `/input`,
-
-* Second *FormElement*
-
-  * open and close field tag: `input`, `/input`,
-  * open and close note tag: `note`, `/note`,
-  * close row tag: `/row` ,
-
-.. _`copy-form`:
-
-Copy Form
----------
-
-Records (=master) and child records can be duplicated (=copied) by a regular `Form`, extended by `FormElemens` of type 'paste'.
-A 'copy form' works either in:
-
-* 'copy and paste now' mode: the 'select' and 'paste' `Form` is merged in one form, only one master record is possible,
-* 'copy now, paste later' mode: the 'select' `Form` selects master record(s), the 'paste' Form paste's them later.
-
-Concept
-^^^^^^^
-
-A 'select action' (e.g. a `Form` or a button click) creates record(s) in the table `Clipboard`. Each clipboard record contains:
-
-* the 'id(s)' of the record(s) to duplicate,
-* the 'paste' form id (that `Form` defines, to which table the master records belongs to, as well as rules of how to
-  duplicate any slave records) and where to copy the new records
-* user identifier (QFQ cookie) to separate clipboard records of different users inside the Clipboard table.
-
-The 'select action' is also responsible to delete old clipboard records of the current user, before new clipboard records are
-created.
-
-The 'paste form' iterates over all master record id(s) in the `Clipboard` table. For each master record id, all FormElements
-of type `paste` are fired (incl. the creating of slave records).
-
-E.g. if there is a basket with different items and you want to duplicate the whole basket including new items, create a
-form with the following parameter
-
- * Form
-
-   * Name: `copyBasket`
-   * Table: `Clipboard`
-   * Show Button: only `close` and `save`
-
- * FormElement 1: Record id of the source record.
-
-   * Name: `idSrc`
-   * Lable: `Source Form`
-   * Class: `native`
-   * Type: `select`
-   * sql1: `{{! SELECT id, title FROM Basket }}`
-
- * FormElement 2: New name of the copied record.
-
-   * Name: `myNewName`
-   * Class: `native`
-   * Type: `text`
-
- * FormElement 3: a) Check that there is no name conflict. b)Purge any old clipboard content of the current user.
-
-   * Name: `clearClipboard`
-   * Class: `action`
-   * Type: `beforeSave`
-   * Parameter:
-
-     * `sqlValidate={{!SELECT f.id FROM Form AS f WHERE f.name LIKE '{{myName:FE:alnumx}}' LIMIT 1}}`
-     * `expectRecords = 0`
-     * `messageFail = There is already a form with this name`
-     * `sqlAfter={{DELETE FROM Clipboard WHERE cookie='{{cookieQfq:C0:alnumx}}' }}`
-
- * FormElement 4: Update the clipboard source reference, with current {{cookieQfq:C}} identifier.
-
-   * Name: `updateClipboardRecord`
-   * Class: `action`
-   * Type: `afterSave`
-   * Parameter: `sqlAfter={{UPDATE Clipboard SET cookie='{{cookieQfq:C0:alnumx}}', formIdPaste={{formId:S0}} /* PasteForm */  WHERE id={{id:R}} LIMIT 1 }}`
-
- * FormElement 5: Copy basket identifier.
-
-   * Name: `basketId`
-   * Class: `action`
-   * Type: `paste`
-   * sql1: `{{!SELECT {{id:P}} AS id,  '{{myNewName:FE:allbut}}' AS name}}`
-   * Parameter: `recordDestinationTable=Basket`
-
- * FormElement 6: Copy items of basket.
-
-   * Name: `itemId`
-   * Class: `action`
-   * Type: `paste`
-   * sql1: `{{!SELECT i.id AS id, {{basketId:P}} AS basketId FROM Item AS i WHERE i.basketId={{id:P}} }}`
-   * Parameter: `recordDestinationTable=Item`
-
-
-Table self referencing records
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Records might contain references to other recrods in the same table. E.g. native FormElements might assigned to a fieldSet,
-templateGroup or pill, a fieldSet might assigned to other fieldsets or pills and so on. When duplicating a `Form` and the
-corresponding `FormElements` all internal references needs to be updated as well.
-
-On each FormElement.type=`paste` record, the column to be updated is defined via:
-
- * parameter: translateIdColumn = <columnname>
-
-For the 'copyForm' this would be 'feIdContainer'.
-
-The update of the records is started after all records have been copied (of the specific FormElement.type=`paste` record).
-
-.. _delete-record:
-
-Delete Record
--------------
-
-Deleting record(s) via QFQ might be solved by either:
-
-* using the `delete` button on a form on the top right corner.
-* by letting `report`_ creating a special link (see below). The link contains the record id and:
-
-  * a form name, or
-  * a table name.
-
-Deleting a record just by specifying a table name, will only delete the defined record (no slave records).
-
-* By using a delete button via `report` or in a `subrecord` row, a ajax request is send.
-* By using a delete button on the top right corner of the form, the form will be closed after deleting the record.
-
-Example for report::
-
-   SELECT p.name, CONCAT('form=person&r=', p.id) AS _Paged FROM Person AS p
-   SELECT p.name, CONCAT('table=Person&r=', p.id) AS _Paged FROM Person AS p
-
-To automatically delete slave records, use a form and create `beforeDelete` FormElement(s) on the form:
-
-  * class: action
-  * type: beforeDelete
-  * parameter: sqlAfter={{DELETE FROM <slaveTable> WHERE <slaveTable>.<masteId>={{id:R}} }}
-
-You might also check the form 'form' how the slave records 'FormElement' will be deleted.
-
-.. _locking-record:
-
-Locking Record / Form
----------------------
-
-Support for record locking is given with mode:
-
-* *exclusive*: user can't force a write.
-
-  * Including a timeout (default 15 mins: DIRTY_RECORD_TIMEOUT_SECONDS in `config.qfq.ini`_) for maximum lock time.
-
-* *advisory*: user is only warned, but allowed to overwrite.
-* *none*: no bookeeping about locks.
-
-For 'new' records (r=0) there is no locking at all.
-
-The record locking protection is based on the `tablename` and the `record id`. Different `Forms`, with the same primary table,
-will be protected by record locking. On the other side, action-`FormElements` updating non primary table records are not
-protected by 'record locking': the QFQ record locking is *NOT 100%*.
-
-The 'record locking' mode will be specified per `Form`. If there are multiple Forms with different modes, and there is
-already a lock for a `tablename` / `record id` pair, the most restrictive will be applied.
-
-
-Best practice
--------------
-
-Custom default value only for 'new records'
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-In the specific `FormElement` set `value={{columnName:RSE}}`. The link to the form should be rendered with
-'"...&columnName=<data>&..." AS _page'. The trick is that the STORE_RECORD is empty for new records, and therefore the
-corresponding value from STORE_SIP will be returned. Existing records will use the already saved value.
-
-Central configured values
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Any variable in *config.qfq.ini* can be used by *{{<varname>:Y}}* in form or report statements.
-
-E.g.
-
-  TECHNICAL_CONTACT = jane.doe@example.net
-
-Could be used in an *FormElement.type* = sendmail with *parameter*  setting *sendMailFrom={{TECHNICAL_CONTACT:Y}}*.
-
-Debug Report
-^^^^^^^^^^^^
-
-Writing "report's" in the nested notation or long queries broken over several lines, might not interpreted as wished.
-Best for debugging is to specify in the tt-content record::
-
-  debugShowBodyText = 1
-
-Note: Debug information is only display if it's enabled in  *config.qfq.ini* by
-
- * *SHOW_DEBUG_INFO=yes* or
- * *SHOW_DEBUG_INFO=auto* and logged in in the same Browser as a Typo3 backend user.
-
-More detailed error messages
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-If *SHOW_DEBUG_INFO* is enabled, a full stacktrace and variable contents are displayed in case of an error.
-
-Person search form
-^^^^^^^^^^^^^^^^^^
-
-QFQ content record::
-
-  # Creates a small form that redirects back to this page
-  10 {
-    sql = SELECT '_'
-    head = <form action='#' method='get'><input type='hidden' name='id' value='{{pageId:T}}'>Search: <input type='text' name='search' value='{{search:CE:all}}'><input type='submit' value='Submit'></form>
-  }
-
-  # SQL statement will find and list all the relevant forms
-  20 {
-    sql = SELECT CONCAT('?detail&form=form&r=', f.id) AS _Pagee, f.id, f.name, f.title
-              FROM Form AS f
-              WHERE f.name LIKE  '%{{search:CE:all}}%'
-    head = <table class='table'>
-    tail = </table>
-    rbeg = <tr>
-    rend = </tr>
-    fbeg = <td>
-    fend = </td>
-  }
-
-
-Form: compute next free 'ord' automatically
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Requirement: new records should automatically get the highest number plus 10 for their 'ord' value. Existing records
-should not be altered.
-
-Version 1
-'''''''''
-
-Compute the next 'ord' in advance in the subrecord field of the primary form. Submit that value to the new record
-via SIP parameter to the secondary form.
-
-On the secondary form: for 'new' records choose the computed value, for existing records leave the value
-unchanged.
-
-* Master form, `subrecord` *FormElement*, field `parameter`: set ::
-
-    detail=id:formId,{{SELECT '&', IFNULL(fe.ord,0)+10 FROM Form AS f LEFT JOIN *FormElement* AS fe ON fe.formId=f.id WHERE
-    f.id={{r:S0}} ORDER BY fe.ord DESC LIMIT 1}}:ord
-
-
-* Slave form, `ord` *FormElement*, field `value`: set
-
-  ::
-
-   `{{ord:RS0}}`.
-
-Version 2
-'''''''''
-
-Compute the next 'ord' as default value direct inside the secondary form. No change is needed for the primary form.
-
-* Secondary form, `ord` *FormElement*, field `value`: set `{{SELECT IF({{ord:R0}}=0,  MAX(IFNULL(fe.ord,0))+10,{{ord:R0}})  FROM (SELECT 1) AS a LEFT JOIN FormElement AS fe ON fe.formId={{formId:S0}} GROUP BY fe.formId}}`.
-
-Form: Person Wizard - firstname, city
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Requirement: A form that displays the column 'firstname' from table 'Person' and 'city' from table 'Address'. If the
-records not exist, the form should create it.
-
-Form primary table: Person
-
-Form slave table: Address
-
-Relation: `Person.id = Address.personId`
-
-* Form: wizard
-
-  * Name: wizard
-  * Title: Person Wizard
-  * Table: Person
-  * Render: bootstrap
-
-* *FormElement*: firstname
-
-  * Class: **native**
-  * Type: **text**
-  * Name: firstname
-  * Label: Firstname
-
-* *FormElement*: email, text, 20
-
-  * Class: **native**
-  * Type: **text**
-  * Name: city
-  * Label: City
-  * Value: `{{SELECT city FROM Address WHERE personId={{r}} ORDER BY id LIMIT 1}}`
-
-* *FormElement*: insert/update address record
-
-  * Class: **action**
-  * Type: **afterSave**
-  * Label: Manage Address
-  * Parameter:
-
-    * `slaveId={{SELECT id FROM Address WHERE personId={{r}} ORDER BY id LIMIT 1}}`
-    * `sqlInsert={{INSERT INTO Address (personId, city) VALUES ({{r}}, '{{city:F:allbut:s}}') }}`
-    * `sqlUpdate={{UPDATE Address SET city='{{city:F:allbut:s}}' WHERE id={{slaveId:V}} }}`
-    * `sqlDelete={{DELETE FROM Address WHERE id={{slaveId:V}} AND ''='{{city:F:allbut:s}}' LIMIT 1}}`
-
-Form: Person Wizard - firstname, single note
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Requirement: A form that displays the column 'firstname' from table 'Person' and 'note' from table 'Note'.
-If the records don't exist, the form should create it.
-Column Person.noteId points to Note.id
-
-Form primary table: Person
-
-Form slave table: Address
-
-Relation: `Person.id = Address.personId`
-
-* Form: wizard
-
-  * Name: wizard
-  * Title: Person Wizard
-  * Table: Person
-  * Render: bootstrap
-
-* *FormElement*: firstname
-
-  * Class: **native**
-  * Type: **text**
-  * Name: firstname
-  * Label: Firstname
-
-* *FormElement*: email, text, 20
-
-  * Class: **native**
-  * Type: **text**
-  * Name: note
-  * Label: Note
-  * Value: `{{SELECT Note FROM Note AS n, Person AS p WHERE p.id={{r}} AND p.noteId=n.id ORDER BY id }}`
-
-* *FormElement*: insert/update address record
-
-  * Class: **action**
-  * Type: **afterSave**
-  * Name: noteId
-  * Label: Manage Note
-  * Parameter:
-
-    * `sqlInsert={{INSERT INTO Note (note) VALUES ('{{note:F:allbut:s}}') }}`
-    * `sqlUpdate={{UPDATE Note SET note='{{note:F:allbut:s}}' WHERE id={{slaveId:V}} }}`
-
-.. _example_class_template_group:
-
-Icons Template Group
-^^^^^^^^^^^^^^^^^^^^
-
-This example will display grafics instead of text 'add' and 'remove'. Also there is a distance between the templateGroups.
-
- * FormElement.parameter::
-
-     tgClass = qfq-child-margin-top
-     tgAddClass = btn alert-success
-     tgAddText = <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
-     tgRemoveClass = btn btn-danger alert-danger
-     tgRemoveText = <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
-
-Chart
-^^^^^
-
-* QFQ delivers a chart JavaScript lib: https://github.com/nnnick/Chart.js.git. Docs: http://www.chartjs.org/docs/
-* The library is not sourced in the HTML page automatically. To do it, either include the lib
-  `typo3conf/ext/qfq/Resources/Public/JavaScript/Chart.min.js`:
-
-  * in the specific tt_content record (shown below in the example) or
-  * system wide via Typo3 Template record.
-
-* By splitting HTML and JavaScript code over several lines, take care not accidently to create a 'nesting'-end token.
-  Check the line after `10.tail =`. It's '}' alone on one line. This is a valid 'nesting'-end token!. There are two options
-  to circumvent this:
-
-  * Don't nest the HTML & JavaScript code - bad workaround, this is not human readable.
-  * Select different nesting token, e.g. '<' / '>' (check the first line on the following example).
-
-::
-
-     # <
-
-     10.sql = SELECT '_'
-     10.head =
-       <div style="height: 1024px; width: 640px;">
-         <h3>Distribution of FormElement types over all forms</h3>
-         <canvas id="barchart" width="1240" height="640"></canvas>
-       </div>
-       <script src="typo3conf/ext/qfq/Resources/Public/JavaScript/Chart.min.js"></script>
-       <script>
-         $(function () {
-           var ctx = document.getElementById("barchart");
-           var barChart = new Chart(ctx, {
-             type: 'bar',
-               data: {
-
-     10.tail =
-               }
-           });
-         });
-       </script>
-
-     # Labels
-     10.10 <
-       sql = SELECT "'", fe.type, "'" FROM FormElement AS fe GROUP BY fe.type ORDER BY fe.type
-       head = labels: [
-       tail = ],
-       rsep = ,
-     >
-
-     # Data
-     10.20 <
-       sql = SELECT COUNT(fe.id) FROM FormElement AS fe GROUP BY fe.type ORDER BY fe.type
-       head = datasets: [ {   data: [
-       tail = ],  backgroundColor: "steelblue", label: "FormElements" } ]
-       rsep = ,
-     >
-
-Upload Form Simple
-^^^^^^^^^^^^^^^^^^
-
-Table Person
-
-+---------------------+--------------+
-| Name                | Type         |
-+=====================+==============+
-| id                  | int          |
-+---------------------+--------------+
-| name                | varchar(255) |
-+---------------------+--------------+
-| pathFileNamePicture | varchar(255) |
-+---------------------+--------------+
-| pathFileNameAvatar  | varchar(255) |
-+---------------------+--------------+
-
-* Form:
-
-  * Name: UploadSimple
-  * Table: Person
-
-* FormElements:
-
-  * Name: name
-
-    * Type: text
-    * Label: Name
-
-  * Name: pathFileNamePicture
-
-    * Type: upload
-    * Label: Picture
-    * Parameter::
-
-        fileDestination=fileadmin/user/{{id:R0}}-picture-{{filename}}
-
-  * Name: pathFileNameAvatar
-
-    * Type: upload
-    * Label: Avatar
-    * Parameter::
-
-        fileDestination=fileadmin/user/{{id:R0}}-avatar-{{filename}}
-
-
-Upload Form Advanced 1
-^^^^^^^^^^^^^^^^^^^^^^
-
-Table: Person
-
- +---------------------+--------------+
- | Name                | Type         |
- +=====================+==============+
- | id                  | int          |
- +---------------------+--------------+
- | name                | varchar(255) |
- +---------------------+--------------+
-
-Table: Note
-
- +---------------------+--------------+
- | Name                | Type         |
- +=====================+==============+
- | id                  | int          |
- +---------------------+--------------+
- | pId                 | int          |
- +---------------------+--------------+
- | type                | varchar(255) |
- +---------------------+--------------+
- | pathFileName        | varchar(255) |
- +---------------------+--------------+
-
-* Form:
-
-  * Name: UploadAdvanced1
-  * Table: Person
-
-* FormElements
-
-  * Name: name
-
-    * Type: text
-    * Label: Name
-
-  * Name: mypathFileNamePicture
-
-    * Type: upload
-    * Label: Picture
-    * Value: {{SELECT pathFileName FROM Note WHERE id={{slaveId}} }}
-    * Parameter::
-
-        fileDestination=fileadmin/user/{{id:R0}}-picture-{{filename}}
-        slaveId={{SELECT id FROM Note WHERE pId={{id:R0}} AND type='picture' LIMIT 1}}
-        sqlInsert={{INSERT INTO Note (pathFileName, type, pId) VALUE ('{{fileDestination}}', 'picture', {{id:R0}}) }}
-        sqlUpdate={{UPDATE Note SET pathFileName = '{{fileDestination}}' WHERE id={{slaveId}} LIMIT 1}}
-        sqlDelete={{DELETE FROM Note WHERE id={{slaveId}}  LIMIT 1}}
-
-  * Name: mypathFileNameAvatar
-
-    * Type: upload
-    * Label: Avatar
-    * Value: {{SELECT pathFileName FROM Note WHERE id={{slaveId}} }}
-    * Parameter::
-
-        fileDestination=fileadmin/user/{{id:R0}}-avatar-{{filename}}
-        slaveId={{SELECT id FROM Note WHERE pId={{id:R0}} AND type='avatar' LIMIT 1}}
-        sqlInsert={{INSERT INTO Note (pathFileName, type, pId) VALUE ('{{fileDestination}}', 'avatar', {{id:R0}}) }}
-        sqlUpdate={{UPDATE Note SET pathFileName = '{{fileDestination}}' WHERE id={{slaveId}} LIMIT 1}}
-        sqlDelete={{DELETE FROM Note WHERE id={{slaveId}}  LIMIT 1}}
-
-Upload Form Advanced 2
-^^^^^^^^^^^^^^^^^^^^^^
-
-Table: Person
-
- +---------------------+--------------+
- | Name                | Type         |
- +=====================+==============+
- | id                  | int          |
- +---------------------+--------------+
- | name                | varchar(255) |
- +---------------------+--------------+
- | noteIdPicture       | int          |
- +---------------------+--------------+
- | noteIdAvatar        | int          |
- +---------------------+--------------+
-
-Table: Note
-
- +---------------------+--------------+
- | Name                | Type         |
- +=====================+==============+
- | id                  | int          |
- +---------------------+--------------+
- | pathFileName        | varchar(255) |
- +---------------------+--------------+
-
-* Form:
-
-  * Name: UploadAdvanced2
-  * Table: Person
-
-* FormElements
-
-  * Name: name
-
-    * Type: text
-    * Label: Name
-
-  * Name: mypathFileNamePicture
-
-    * Type: upload
-    * Label: Picture
-    * Value: {{SELECT pathFileName FROM Note WHERE id={{slaveId}} }}
-    * Parameter::
-
-        fileDestination=fileadmin/user/{{id:R0}}-picture-{{filename}}
-        slaveId={{SELECT id FROM Note WHERE id={{noteIdPicture}} LIMIT 1}}
-        sqlInsert={{INSERT INTO Note (pathFileName) VALUE ('{{fileDestination}}') }}
-        sqlUpdate={{UPDATE Note SET pathFileName = '{{fileDestination}}' WHERE id={{slaveId}} LIMIT 1}}
-        sqlDelete={{DELETE FROM Note WHERE id={{slaveId}}  LIMIT 1}}
-        sqlAfter={{UPDATE Person SET noteIdPicture={{slaveId}} WHERE id={{id:R0}} LIMIT 1
-
-  * Name: mypathFileNameAvatar
-
-    * Type: upload
-    * Label: Avatar
-    * Value: {{SELECT pathFileName FROM Note WHERE id={{slaveId}} }}
-    * Parameter::
-
-        fileDestination=fileadmin/user/{{id:R0}}-avatar-{{filename}}
-        slaveId={{SELECT id FROM Note WHERE id={{noteIdAvatar}} LIMIT 1}}
-        sqlInsert={{INSERT INTO Note (pathFileName) VALUE ('{{fileDestination}}') }}
-        sqlUpdate={{UPDATE Note SET pathFileName = '{{fileDestination}}' WHERE id={{slaveId}} LIMIT 1}}
-        sqlDelete={{DELETE FROM Note WHERE id={{slaveId}}  LIMIT 1}}
-        sqlAfter={{UPDATE Person SET noteIdAvatar={{slaveId}} WHERE id={{id:R0}} LIMIT 1
-
-Typeahead: SQL
-^^^^^^^^^^^^^^
-
-Table: Person
-
- +---------------------+--------------+
- | Name                | Type         |
- +=====================+==============+
- | id                  | int          |
- +---------------------+--------------+
- | name                | varchar(255) |
- +---------------------+--------------+
-
-* Form:
-
-  * Name: PersonNameTypeahead
-  * Table: Person
-
-* FormElements
-
-  * Name: name
-
-    * Type: text
-    * Label: Name
-    * Parameter::
-
-       typeAheadSql = SELECT name FROM Person WHERE name LIKE ? OR firstName LIKE ? LIMIT 100
-
-Typeahead: LDAP with additional values
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Table: Person
-
- +---------------------+--------------+
- | Name                | Type         |
- +=====================+==============+
- | id                  | int          |
- +---------------------+--------------+
- | name                | varchar(255) |
- +---------------------+--------------+
- | firstname           | varchar(255) |
- +---------------------+--------------+
- | email               | varchar(255) |
- +---------------------+--------------+
-
-* Form:
-
-  * Name: PersonNameTypeaheadSetNames
-  * Table: Person
-  * Parameter::
-
-      ldapServer = directory.example.com
-      ldapBaseDn = ou=Addressbook,dc=example,dc=com
-
-* FormElements
-
-  * Name: email
-
-    * Class: native
-    * Type: text
-    * Label: Email
-    * Note: Name: {{cn:LE}}<br>Email: {{mail:LE}}
-    * dynamicUpdate: checked
-    * Parameter::
-
-       # Typeahead
-       typeAheadLdapSearch = (|(cn=*?*)(mail=*?*))
-       typeAheadLdapValuePrintf	‘%s / %s’, cn, email
-       typeAheadLdapIdPrintf	‘%s’, email
-
-       # dynamicUpdate: show note
-       fillStoreLdap
-       ldapSearch = (mail={{email::alnumx}})
-       ldapAttributes = cn, email
-
-  * Name: fillLdapValues
-
-    * Class: action
-    * Type: afterSave
-    * Parameter::
-
-       fillStoreLdap
-       ldapSearch = (mail={{email::alnumx}})
-       ldapAttributes = cn, email
-
-       slaveId={{id:R0}}
-       sqlUpdate={{ UPDATE Person AS p SET p.name='{{cn:L:alnumx:s}}' WHERE p.id={{slaveId}} LIMIT 1 }}
-
-FAQ
----
-
- * Q: A variable {{<var>}} is shown as empty string, but there should be a value.
-
-   * A: The sanitize rule is violeted and therefore the value has been removed. Set {{<var>:<store>:all}} as a test.
-     Only STORE_CLIENT and STORE_FORM will be sanitized.
-
-.. _`report`:
-
-Report
-======
-
-The QFQ extension is activated through tt-content records. One or more tt-content records per page are necessary to render
-*forms* and *reports*.
-
-QFQ content element
--------------------
-
-QFQ is used by configuring Typo3 content elements. Insert one or more QFQ content elements on a Typo3 page.
-Specify column and language per content record as wished.
-
-The title of the QFQ content element will not be rendered. It's only visible in the backend for orientation.
-
-General
--------
-
-To display a report on any given TYPO3 page, create a content element of type 'QFQ Element' (plugin) on that page.
-
-A simple example
-^^^^^^^^^^^^^^^^
-
-Assume that the database has a table person with columns firstName and lastName. To create a simple list of all persons, we can do the following:
-::
-
-    10.sql = SELECT id AS pId, CONCAT(firstName, " ", lastName, " ") AS name FROM person
-
-10 Stands for a *root level* of the report (see section `Structure`_). 10.sql defines a SQL query for this specific level. When the query is executed it will return a result having one single column name containing first and last name
-separated by a space character.
-
-The HTML output displayed on the page resulting from only this definition could look as follows:
-::
-
-    John DoeJane MillerFrank Star
-
-..
-
-
-
-I.e., QFQ will simply output the content of the SQL result row after row for each single level.
-
-However, we can modify (wrap) the output by setting the values of various keys for each level: 10.rsep=<br/> for example tells QFQ to seperate the rows of the result by a HTML-line break. The final result in this case is:
-
-::
-
-    10.sql = SELECT id AS personId, CONCAT(firstName, " ", lastName, " ") AS name FROM person
-    10.sep = <br>
-
-HTML output:
-::
-
-    John Doe<br>Jane Miller<br>Frank Star
-
-..
-
-.. _`syntax-of-report`:
-
-Syntax of `report`
-------------------
-
-    All **root level queries** will be fired in the order specified by 'level' (Integer value).
-
-    For **each** row of a query (this means *all* queries), all subqueries will be fired once.
-
-    *   E.g. if the outer query selects 5 rows, and a nested query always select 3 rows, than the total number of rows are 5 x 3 = 15 rows.
-
-    There is a set of **variables** that will get replaced before the SQL-Query gets executed:
-
-        Column values of the recent rows: {{<level>.<columnname>}}
-
-        Global variables: {{global.<name>}}
-
-        Variables from specific stores: {{<name>[:<store/s>[:<sanitize class>]]}}
-
-        Current row index: {{<level>.line.count}}
-
-        Total rows (num_rows for SELECT and SHOW, affected_rows for UPDATE and INSERT): {{<level>.line.total}}
-
-        Last insert id for INSERT: {{<level>.line.insertId}}
-
-        See :ref:`variables` for a full list of all available variables.
-
-    Be aware that line.count / line.total have to be known before the query is fired. E.g. `10.sql = SELECT {{10.line.count}}, ... WHERE {{10.line.count}} = ...`
-    won't work as expected. `{{10.line.count}}` can't be replaced before the query is fired, but will be replaced during processing the result!
-
-
-    Different types of SQL queries are possible: SELECT, INSERT, UPDATE, DELETE, SHOW
-
-    Only SELECT and SHOW queries will fire subqueries.
-
-    *   Processing of the resulting rows and columns:
-
-    *   In general, all columns of all rows will be printed out sequentially.
-
-        On a per column base, printing of columns can be suppressed. This might be useful to select values which will be
-        accessed later on in another query via the {{level.columnname}} variable. To suppress printing of a column, use a
-        underscore as column name prefix.
-
-        Reserved column names have a special meaning and will be processed in a special way. See `Processing of columns in the SQL result`_ for details.
-
-        There are extensive ways to wrap columns and rows automatically. See :ref:`wrapping-rows-and-columns`
-
-Debug the bodytext
-------------------
-The parsed bodytext could be displayed by activating 'SHOW_DEBUG_INFO ' (:ref:`debug`) and specifying
-
-::
-
-    debugShowBodyText = 1
-
-A small symbol with a tooltip will be shown, where the content record will be displayed on the webpage.
-Note: :ref:`debug` information will only be shown with *SHOW_DEBUG_INFO = yes* in config.qfq.ini .
-
-Structure
----------
-
-A report can be divided into several levels. This can make report definitions more readable because it allows for
-splitting of otherwise excessively long SQL queries. For example, if your SQL query on the root level selects a number
-of person records from your person table, you can use the SQL query on the second level to look up the city where each person lives.
-
-See the example below:
-
-::
-
-    10.sql = SELECT id AS _pId, CONCAT(firstName, " ", lastName, " ") AS name FROM person
-    10.rsep = <br />
-
-    10.10.sql = SELECT CONCAT(postal_code, " ", city) FROM address WHERE pId = {{10.pId}}
-    10.10.rbeg = (
-    10.10.rend = )
-
-..
-
-This would result in
-
-::
-
-    John Doe (3004 Bern)
-    Jane Miller (8008 Zürich)
-    Frank Star (3012 Bern)
-
-..
-
-Text across several lines
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-To make SQL queries, or QFQ records in general, more readable, it's possible to split a line across several lines. Lines
-with keywords are on their own (`QFQ Keywords (Bodytext)`_ start a new line). If a line is not a 'keyword' line, it will
-be appended to the last keyword line. 'Keyword' lines are detected on:
-
- * <level>.<keyword> =
- * {
- * <level>[.<level] {
-
-Example::
-
-    10.sql = SELECT 'hello world'
-             FROM mastertable
-    10.tail = End
-
-    20.sql = SELECT 'a warm welcome'
-               'some additional', 'columns'
-               FROM smartTable
-               WHERE id>100
-
-    20.head = <h3>
-    20.tail = </h3>
-
-Nesting of levels
-^^^^^^^^^^^^^^^^^
-
-Levels can be nested. E.g.: ::
-
-  10 {
-    sql = SELECT ...
-    5 {
-        sql = SELECT ...
-        head = ...
-    }
-  }
-
-This is equal to: ::
-
-  10.sql = SELECT ...
-  10.5.sql = SELECT ...
-  10.5.head = ...
-
-By default, curly braces '{}' are used for nesting. Alternatively angle braces '<>', round braces '()' or square
-braces '[]' are also possible. To define the braces to use, the **first line** of the bodytext has to be a comment line and the
-last character of that line must be one of '{}[]()<>'. The corresponding braces are used for that QFQ record. E.g.: ::
-
-    # Specific code. >
-    10 <
-      sql = SELECT
-      head = <script>
-             data = [
-               {
-                 10, 20
-               }
-             ]
-             </script>
-    >
-
-
-Per QFQ tt-content record, only one type of nesting braces can be used.
-
-Be careful to:
-
-* write nothing else than whitespaces/newline behind an **open brace**
-* the **closing brace** has to be alone on a line. ::
-
-   10.sql = SELECT 'Yearly Report'
-
-   20 {
-         sql = SELECT companyName FORM Company LIMIT 1
-         head = <h1>
-         tail = </h1>
-   }
-
-   30 {
-         sql = SELECT depName FROM Department
-         head = <p>
-         tail = </p>
-         5 {
-               sql = SELECT 'detailed information for department'
-               1.sql = SELECT name FROM Person LIMIT 7
-               1.head = Employees:
-         }
-   }
-
-   30.5.tail = More will follow
-
-   50
-
-   {
-          sql = SELECT 'A query with braces on their own'
-   }
-
-.. _`access-column-values`:
-
-Access column values
-^^^^^^^^^^^^^^^^^^^^
-
-Columns of the upper / outer level result can be accessed via variables, eg. {{10.pId}} will be replaced by the value in the pId column.
-
-+-------------+------------------------------------------------------------------------------------------------------------------------+
-| Levels      |A report is divided into levels. The Example has levels *10*, *20*, *30*, *30.5*, *30.5.1*, *50*                        |
-+-------------+------------------------------------------------------------------------------------------------------------------------+
-| Qualifier   |A level is divided into qualifiers *30.5.1* has 3 qualifiers *30*, *5*, *1*                                             |
-+-------------+------------------------------------------------------------------------------------------------------------------------+
-| Root levels |Is a level with one qualifier. E.g.: 10                                                                                 |
-+-------------+------------------------------------------------------------------------------------------------------------------------+
-| Sub levels  |Is a level with more than one qualifier. E.g. levels *30.5* or *30.5.1*                                                 |
-+-------------+------------------------------------------------------------------------------------------------------------------------+
-| Child       |The level *30* has one child and child child: *30.5* and *30.5.1*                                                       |
-+-------------+------------------------------------------------------------------------------------------------------------------------+
-| Example     | *10*, *20*, *30*, *50** are root level and will be completely processed one after each other.                          |
-|             | *30.5* will be executed as many times as *30* has row numbers.                                                         |
-|             | *30.5.1*  will be executed as many times as *30.5* has row numbers.                                                    |
-+-------------+------------------------------------------------------------------------------------------------------------------------+
-
-Report Example 1: ::
-
-    # Displays current date
-    10.sql = SELECT CURDATE()
-
-    # Show all students from the person table
-    20.sql = SELECT p.id AS pId, p.firstName, " - ", p.lastName FROM person AS p WHERE p.typ LIKE "student"
-
-    # Show all the marks from the current student ordered chronological
-    20.25.sql = SELECT e.mark FROM exam AS e WHERE e.pId={{20.pId}} ORDER BY e.date
-
-    # This query will never be fired, cause there is no direct parent called 20.30.
-    20.30.10.sql = SELECT 'never fired'
-
-.. _wrapping-rows-and-columns:
-
-Wrapping rows and columns: Level keys
--------------------------------------
-
-Order and nesting of queries, will be defined with a typoscript-like syntax: level.sublevel1.subsublevel2. ...
-Each 'level' directive needs a final key, e.g: 20.30.10. **sql**. A key **sql** is necessary in order to process a level.
-All `QFQ Keywords (Bodytext)`_.
-
-Processing of columns in the SQL result
----------------------------------------
-
-* The content of all columns of all rows will be printed sequentially, without separator.
-* Rows with `Special column names`_  will be processed in a special way.
-
-Special column names
---------------------
-
-* Special column names always start with '_'.
-* Column names, which start with a '_' and which are not reserved (=special column name), will not be printed. Nevertheless,
-  access to it via the {{<level>.<column>}} variable (without '_') are possible.
-* The input parameters for the processing function are stored as column values.
-* Single parameters are delimited by the '|' character.
-* Parameters are identified by the function either
-
-  * by their **order**
-  * or by a **one character qualifier** followed by the ':' character, placed in front of the actual parameter value.
-
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Reserved column name   | Purpose                                                                                                                                                                                     |
-+========================+=============================================================================================================================================================================================+
-| _link                  |Easily create links with different features.                                                                                                                                                 |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _mailto                |Quickly create email links. A click on the link will open the default mailer. The address is encrypted via JS against email bots.                                                            |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _pageX or _PageX       |Shortcut version of the link interface for fast creation of internal links. The column name is composed of the string *page*/*Page* and a optional character to specify the type of the link.|
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _pdf, _file, _zip      |Shortcut version of the link interface for fast creation of `download`_ links. Used to offer single file download or to concatenate several PDFs and printout of websites to one PDF file.   |
-| _Pdf, _File, _Zip      |                                                                                                                                                                                             |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _sendmail              |Send emails.                                                                                                                                                                                 |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _exec                  |Run batch files or executables on the webserver.                                                                                                                                             |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _vertical              |Render Text vertically. This is useful for tables with limited column width.                                                                                                                 |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _img                   |Display images.                                                                                                                                                                              |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _bullet                |Display a blue/gray/green/pink/red/yellow bullet. If none color specified, show nothing.                                                                                                     |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _check                 |Display a blue/gray/green/pink/red/yellow checked sign. If none color specified, show nothing.                                                                                               |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _nl2br                 |All newline characters will be converted to `<br>`.                                                                                                                                          |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _striptags             |HTML Tags will be stripped.                                                                                                                                                                  |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _htmlentities          |Characters will be encoded to their HTML entity representation.                                                                                                                              |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| _+???                  |The content will be wrapped in the tag '???'. Example: SELECT 'example' AS '_+a href="http://example.com"' creates '<a href="http://example.com">example</a>'                                |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-|_<nonReservedName>      |Suppress output. Column names with leading underscore are used to select data from the database and make it available in other parts of the report without generating any output.            |
-+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _column-link:
-
-Column: _link
-^^^^^^^^^^^^^
-
-{{url | display | **i (internal)**, e(external) | **- (same)**,n (new), p (parent), t(top) | **-**, (e(edit), c(copy), n(new), d(delete), i(insert) , f(file)) }}
-
-* Most URLs will be rendered via class link.
-* Column names like `_pagee`, `_mailto`, ... are wrapper to class link.
-* The parameters for link contains a prefix to make them position-independet.
-
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|URL|IMG|Meaning       |Qualifier                          |Example                    |Description                                                                                                                             |
-+===+===+==============+===================================+===========================+========================================================================================================================================+
-|x  |   |URL           |u:<url>                            |u:http://www.example.com   |If an image is specified, it will be rendered inside the link, default link class: external                                             |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|x  |   |Mail          |m:<email>                          |m:info@example.com         |Default link class: email                                                                                                               |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|x  |   |Page          |p:<pageId>                         |p:impressum                |Prepend '?' or '?id=', no hostname qualifier (automatically set by browser), default link class: internal, default value: {{pageId}}    |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|x  |   |Download      |d:[<exportFilename>]               |d:complete.pdf             |Link points to `api/download.php`. Additonal parameter are encoded into a SIP. 'Download' needs an enabled SIP.  See `download`_.       |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Text          |t:<text>                           |t:Firstname Lastname       |-                                                                                                                                       |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Render        |r:<mode>                           |r:[0-5]                    |See: `render-mode`_, Default: 0                                                                                                         |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Button        |b[:0|1|<btn class>]                | b:0, b:1, b:success       |'b', 'b:1': a bootstrap button is created. 'b:0' disable the button. <btn class>: default, primary, success, info, warning,danger       |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |x  |Picture       |P:<filename>                       |P:bullet-red.gif           |Picture '<img src="bullet-red.gif"alt="....">', default link class: internal.                                                           |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |x  |Edit          |E                                  |E                          |Show 'edit' icon as image                                                                                                               |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |x  |New           |N                                  |N                          |Show 'new' icon as image                                                                                                                |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |x  |Delete        |D                                  |D                          |Show 'delete' icon as image (only the icon, no database record 'delete' functionality)                                                  |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |x  |Help          |H                                  |H                          |Show 'help' icon as image                                                                                                               |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |x  |Info          |I                                  |I                          |Show 'information' icon as image                                                                                                        |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |x  |Show          |S                                  |S                          |Show 'show' icon as image                                                                                                               |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |x  |Glyph         |G:<glyphname>                      |G:glyphicon-envelope       |Show <glyphname>. Check: http://getbootstrap.com/components/                                                                            |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |x  |Bullet        |B:[<color>]                        |B:green                    |Show bullet with '<color>'. Colors: blue, gray, green, pink, red, yellow. Default Color: green.                                         |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |x  |Check         |C:[<color>]                        |C:green                    |Show checked with '<color>'. Colors: blue, gray, green, pink, red, yellow. Default Color: green.                                        |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |URL Params    |U:<key1>=<value1>[&<keyN>=<valueN>]|U:a=value1&b=value2&c=...  |Any number of additional Params. Links to forms: U:form=Person&r=1234                                                                   |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Tooltip       |o:<text>                           |o:More information here    |Tooltip text                                                                                                                            |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Alttext       |a:<text>                           |a:Name of person           |a) Alttext for images, b) Message text for `download`_ popup window.                                                                    |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Class         |c:[n|i|e|<text>]                   |c:i                        |CSS class for link. n:no class attribut, i:internal (ext_localconf.php)(default), e:external (ext_localconf.php), <text>: explicit named|
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Target        |g:<text>                           |g:_blank                   |target=_blank,_self,_parent,<custom>. Default: no target                                                                                |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Question      |q:<text>                           |q:please confirm           |See: `question`_. Link will be executed only if user clicks ok/cancel, default: 'Please confirm'                                        |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Encryption    |e:0|1|...                          |e:1                        |Encryption of the e-mail: 0: no encryption, 1:via Javascript (default)                                                                  |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Right         |R                                  |R                          |Defines picture position: Default is 'left' (no definition) of the 'text'. 'R' means 'right' of the 'text'                              |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |SIP           |s[:0|1]                            |s, s:0, s:1                |If 's' or 's:1' a SIP entry is generated with all non Typo 3 Parameters. The URL contains only parameter 's' and Typo 3 parameter       |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Mode          |M:file|pdf|zip                     |M:file, M:pdf, M:zip       |Mode. Used to specify type of download. One or more element sources needs to be configured. See `download`_.                            |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |File          |f:<filename>                       |f:fileadmin/file.pdf       |Element source for download mode file|pdf|zip. See `download`_.                                                                         |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-|   |   |Delete record | x[:a|r|c]                         |x, x:r, x:c                |a: ajax (only QFQ internal used), r: report (default), c: close (current page, open last page)                                          |
-+---+---+--------------+-----------------------------------+---------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _render-mode:
-
-Render mode
-^^^^^^^^^^^
-
-+-----------+--------------------+-------------------+----------+-------------------------------------------------------------------+
-|Mode       |Both: url & text    |Only: url          |Only: text|Description                                                        |
-+===========+====================+===================+==========+===================================================================+
-|0 (default)|<a href=url>text</a>|<a href=url>url</a>|          |text or image will be shown, only if there is a url, page or mailto|
-+-----------+--------------------+-------------------+----------+-------------------------------------------------------------------+
-|1          |<a href=url>text</a>|<a href=url>url</a>|text      |Text or image will be shown, independet of there is a url          |
-+-----------+--------------------+-------------------+----------+-------------------------------------------------------------------+
-|2          |<a href=url>text</a>|                   |          |no link if text is empty                                           |
-+-----------+--------------------+-------------------+----------+-------------------------------------------------------------------+
-|3          |text                |url                |text      |no link, only text or image                                        |
-+-----------+--------------------+-------------------+----------+-------------------------------------------------------------------+
-|4          |url                 |url                |text      |no link, show text, if text is empty, show url                     |
-+-----------+--------------------+-------------------+----------+-------------------------------------------------------------------+
-|5          |                    |                   |          |nothing at all                                                     |
-+-----------+--------------------+-------------------+----------+-------------------------------------------------------------------+
-
-
-Link Examples
-^^^^^^^^^^^^^
-
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-|SQL-Query                                                              | Result                                                                                                                                  |
-+=======================================================================+=========================================================================================================================================+
-| SELECT "m:info@example.com" AS _link                                  | info@example.com as linked text, encrypted with javascript, class=external                                                              |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "m:info@example.com|c:0" AS _link                              | info@example.com as linked text, not encrypted, class=external                                                                          |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "m:info@example.com|P:mail.gif" AS _link                       | info@example.com as linked image mail.gif, encrypted with javascript, class=external                                                    |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "m:info@example.com|P:mail.gif|o:Email" AS _link               | *info@example.com* as linked image mail.gif, encrypted with javascript, class=external, tooltip: "sendmail"                             |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "m:info@example.com|t:mailto:info@example.com|o:Email" AS link | 'mail to *info@example.com*' as linked text, encrypted with javascript, class=external                                                  |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "u:www.example.com" AS _link                                   | www.example as link, class=external                                                                                                     |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "u:http://www.example.com" AS _link                            | *http://www.example* as link, class=external                                                                                            |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "u:www.example.com|q:Please confirm" AS _link                  | www.example as link, class=external, See: `question`_                                                                                   |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "u:www.example.com|c:i" AS _link                               | *http://www.example* as link, class=internal                                                                                            |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "u:www.example.com|c:nicelink" AS _link                        | *http://www.example* as link, class=nicelink                                                                                            |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "p:form_person|c:e" AS _link                                   | <a class="external" href="?form_person">Text</a>                                                                                        |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "p:form_person&note=Text|t:Person" AS _link                    | <a class="internal" href="?form_person&note=Text">Person</a>                                                                            |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "p:form_person|E" AS _link                                     | <a class="internal" href="?form_person"><img alttext="Edit" src="typo3conf/ext/qfq/Resources/Public/icons/edit.gif"></a>                |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "p:form_person|E|g:_blank" AS _link                            | <a target="_blank" class="internal" href="?form_person"><img alttext="Edit" src="typo3conf/ext/qfq/Resources/Public/icons/edit.gif"></a>|
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "p:form_person|C" AS _link                                     | <a class="internal" href="?form_person"><img alttext="Check" src="typo3conf/ext/qfq/Resources/Public/icons/checked-green.gif"></a>      |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "p:form_person|C:green" AS _link                               | <a class="internal" href="?form_person"><img alttext="Check" src="typo3conf/ext/qfq/Resources/Public/icons/checked-green.gif"></a>      |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "U:form=Person&r=123|x|D" as _link                             | <a href="typo3conf/ext/qfq/qfq/api/delete.php?s=badcaffee1234"><span class="glyphicon glyphicon-trash" ></span>"></a>                   |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "U:form=Person&r=123|x|t:Delete" as _link                      | <a href="typo3conf/ext/qfq/qfq/api/delete.php?s=badcaffee1234">Delete</a>                                                               |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-| SELECT "s:1|d:full.pdf|M:pdf|U:id=det1&r=12|U:id=det2|f:cv.pdf|       | <a href="typo3conf/ext/qfq/qfq/api/download.php?s=badcaffee1234">Download</a>                                                           |
-|         t:Download|a:Create complete PDF - please wait" as _link      |                                                                                                                                         |
-+-----------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
-
-.. _question:
-
-Question
-^^^^^^^^
-
-**Syntax**
-
-::
-
-    q[:<alert text>[:<level>[:<positive button text>[:<negative button text>[:<timeout>[:<flag modal>]]]]]]
-
-
-* If a user clicks on a link, an alert is shown. If the user answers the alert by clicking on the 'positive button', the browser opens the specified link.
-  If the user click on the negative answer (or waits for timout), the alert is closed and the browser does nothing.
-* All parameter are optional.
-* Parameter are seperated by ':'
-* To use ':' inside the text, the colon has to be escaped by '\\'. E.g. 'ok\\: I understand'.
-
-+----------------------+--------------------------------------------------------------------------------------------------------------------------+
-|   Parameter          |   Description                                                                                                            |
-+======================+==========================================================================================================================+
-| Text                 | The text shown by the alert. HTML is allowed to format the text. Any ':' needs to be escaped. Default: 'Please confirm'. |
-+----------------------+--------------------------------------------------------------------------------------------------------------------------+
-| Level                | success, info, warning, danger                                                                                           |
-+----------------------+--------------------------------------------------------------------------------------------------------------------------+
-| Positive button text | Default: 'Ok'                                                                                                            |
-+----------------------+--------------------------------------------------------------------------------------------------------------------------+
-| Negative button text | Default: 'Cancel'                                                                                                        |
-+----------------------+--------------------------------------------------------------------------------------------------------------------------+
-| Timeout in seconds   | 0: no timeout, >0: after the specified time in seconds, the alert will dissapear and behaves like 'negative answer'      |
-+----------------------+--------------------------------------------------------------------------------------------------------------------------+
-| Flag modal           | 0: Alert behaves not modal. 1: (default) Alert behaves modal.                                                            |
-+----------------------+--------------------------------------------------------------------------------------------------------------------------+
-
-Examples:
-
-+------------------------------------------------------------+---------------------------------------------------------------------------+
-|   SQL-Query                                                |   Result                                                                  |
-+============================================================+===========================================================================+
-| SELECT "p:form_person|q:Edit Person:warn" AS _link         | Shows alert with level 'warn'                                             |
-+------------------------------------------------------------+---------------------------------------------------------------------------+
-| SELECT "p:form_person|q:Edit Person::I do:No way" AS _link | Instead of 'Ok' and 'Cancel', the button text will be 'I do' and 'No way' |
-+------------------------------------------------------------+---------------------------------------------------------------------------+
-| SELECT "p:form_person|q:Edit Person:::10" AS _link         | The Alert will be shown 10 seconds                                        |
-+------------------------------------------------------------+---------------------------------------------------------------------------+
-| SELECT "p:form_person|q:Edit Person:::10:0" AS _link       | The Alert will be shown 10 seconds and is not modal.                      |
-+------------------------------------------------------------+---------------------------------------------------------------------------+
-
-.. _download:
-
-Download
-^^^^^^^^
-
-Download offers:
-
-* download a single file (any type),
-* concatenate several files (uploaded) and/or web pages (=HTML to PDF) into one PDF output file,
-* create a ZIP archive, filled with several files ('uploaded' or 'HTML to PDF'-converted).
-
-The downloads are SIP protected. Only the current user can use the link to download files.
-
-By using the `_link` columnname:
-
-* the option `d:...` initiate creating the download link and optional specifies an export filename,
-* the optional `M:...` (Mode) specifies the export type (file, pdf, zip),
-* setting `s:1` is mandatory for the download function,
-* the alttext `a:...` specifies a message in the download popup.
-
-By using `_pdf`,  `_Pdf`, `_file`, `_File`, `_zip`, `_Zip` as columnname, the options `d`, `m` and `s`
-will be set by automatically.
-
-All files will be read by PHP - therefore the directory might be protected against direct web access. This way is the
-preferred way to offer secure downloads via QFQ.
-
-In case the download needs a persistant URL (no SIP, no user session), a regular
-link, pointing directly to a file, have to be used - the download functionality described here is not appropriate for
-such a scenario.
-
-.. _download-parameter-files:
-
-Parameter and (element) sources
-'''''''''''''''''''''''''''''''
-
-* *download*: `d[:<exportFilename>]`
-
-  * *exportFilename* = <filename for save as> - Name, offered in the 'File save as' browser dialog. Default: 'output.<ext>'.
-
-    If there is no `exportFilename` defined and `mode=file`, than the original filename is taken.
-
-    If the mime type is different from the `exportFilename` extension, then the mime type extension will be added to
-    `exportFilename`. This guarantees that a filemanager will open the file with the correct application.
-
-    The user typically expect meaningful and distinct filenames for different download links.
-
-* *popupMessage*: `a:<text>` - will be displayed in the popup window during download. If the creating/download is fast, the window might disappear quickly.
-
-* *mode*: `m:<mode>`
-
-  * *mode* = <file | pdf | zip> - This parameter is optional and can be skipped in most situations. Mandatory
-    for 'zip'.
-
-      * If `m:file`, the mime type is derived dynamically from the specified file. In this mode, only one element source
-        is allowed per download link (no concatenation).
-
-      * In case of multiple element sources, only `pdf` or `zip` is supported.
-      * If `m:zip` is used together with `U:...` oder `u:..`, those HTML pages will be converted to PDF. Those files
-        get generic filenames inside the archive.
-      * If not specified, the **default** 'Mode' depends on the number of specified element sources (=file or web page):
-
-        * If only one `file` is specifed, the default is `file`.
-        * If there is a) a page defined or b) multiple elements, the default is `pdf`.
-
-* *element sources* - for `m:pdf` or `m:zip`, all of the following three element sources might be specified multiple times. Any combination and order of the three options are allowed.
-
-  * *file*: `f:<pathFilename>` - relative or absolute pathFilename offered for a) download (single), or to be concatenated
-    in a PDF or ZIP.
-  * *urlParam*: `U:id=<t3 page>&<key 1>=<value 1>&<key 2>=<value 2>&...&<key n>=<value n>`.
-
-    * By default, the options given to wkhtml will *not* be encoded by a SIP!
-    * To encode the parameter via SIP: Add '_sip=1' to the URL GET parameter.
-
-      E.g. `U:id=form&_sip=1&form=Person&r=1`.
-
-      In that way, specific sources for the `download` might be SIP encrypted.
-
-    * Any current HTML cookies will be forwarded to/via `wkhtml`. This includes the current FE Login as well as any
-      QFQ session. Also the current User-Agent are faked via the `wkhtml` page request.
-
-    * If there are trouble with accessing FE_GROUP protected content, please check `wkhtmltopdf`_.
-
-  * *url*: `u:<url>` - any URL, pointing to an internal or external destination.
-
-  * *WKHTML Options* for `urlParam` or `url`:
-
-    * The 'HTML to PDF' will be done via `wkhtmltopdf`.
-    * All possible options, suitable for `wkhtmltopdf`, can be submitted in the `u:...` or `U:...` element source.
-      Check `wkhtmltopdf.txt <https://wkhtmltopdf.org/usage/wkhtmltopdf.txt>`_ for possible options. Be aware that
-      key/value tuple in the  documentation is separated by a space, but to respect the QFQ key/value notation of URLs,
-      the key/value tuple in `u:...` or `U:...` has to be separated by '='. Please see last example below.
-
-	Most of the other Link-Class attributes can be used to customize the link as well.
-
-Example `_link`: ::
-
-	# single `file`. Specifying a popup message window text is not necessary, cause a file directly accessed is fast.
-	SELECT "d:file.pdf|s|t:Download|f:fileadmin/pdf/test.pdf" AS _link
-
-	# single `file`, with mode
-	SELECT "d:file.pdf|m:pdf|s|t:Download|f:fileadmin/pdf/test.pdf" AS _link
-
-	# three sources: two pages and one file
-	SELECT "d:complete.pdf|s|t:Complete PDF|U:id=detail&r=1|U:id=detail2&r=1|f:fileadmin/pdf/test.pdf" AS _link
-
-	# three sources: two pages and one file
-	SELECT "d:complete.pdf|s|t:Complete PDF|U:id=detail&r=1|U:id=detail2&r=1|f:fileadmin/pdf/test.pdf" AS _link
-
-	# three sources: two pages and one file, parameter to wkhtml will be SIP encoded
-	SELECT "d:complete.pdf|s|t:Complete PDF|U:id=detail&r=1&_sip=1|U:id=detail2&r=1&_sip=1|f:fileadmin/pdf/test.pdf" AS _link
-
-	# three sources: two pages and one file, the second page will be in landscape and pagesize A3
-	SELECT "d:complete.pdf|s|t:Complete PDF|U:id=detail&r=1|U:id=detail2&r=1&--orientation=Landscape&--page-size=A3|f:fileadmin/pdf/test.pdf" AS _link
-
-..
-
-Example `_pdf`, `_zip`: ::
-
-	# File 1: U:id=1&--orientation=Landscape&--page-size=A3
-	# File 2: U:id=form
-	# File 3: f:fileadmin/file.pdf
-	SELECT 't:PDF|a:Creating a new PDF|U:id=1&--orientation=Landscape&--page-size=A3|U:id=form|f:fileadmin/file.pdf' AS _pdf
-
-	# File 1: U:id=1
-	# File 2: u:http://www.example.com
-	# File 3: f:fileadmin/file.pdf
-	SELECT 't:PDF - 3 Files|a:Please be patient|U:id=1|u:http://www.example.com|f:fileadmin/file.pdf' AS _pdf
-
-	# File 1: U:id=1
-	# File 2: U:id=form
-	# File 3: f:fileadmin/file.pdf
-	SELECT CONCAT('t:ZIP - 3 Pages|a:Please be patient|U:id=1|U:id=form|f:', p.pathFilename) AS _zip
-
-..
-
-Use the `--print-media-type` as wkthml option to access the page with media type 'printer'. Depending on the website
-configuration this switches off navigation and background images.
-
-Export area
-'''''''''''
-
-To offer protected pages, e.g. referenced in download links, the regular FE_GROUPs can't be used, cause the download does
-not have the current user privileges (it's a separate process, started as the webserver user).
-
-Create a separated export tree in Typo3 Backend, which is IP access restricted. Only localhost or the FE_GROUP 'admin'
-is allowed to access: ::
-
-   [IP = {$tmp.restrictedIPRange} ][usergroup = admin]
-      page.10 < styles.content.get
-   [else]
-      page.10 = TEXT
-      page.10.value = Please access from localhost or log in as 'admin' user.
-   [global]
-
-..
-
-Columns: _page[X]
-^^^^^^^^^^^^^^^^^
-
-The colum name is composed of the string *page* and a trailing character to specify the type of the link.
-
-
-**Syntax**
-
-::
-
-    SELECT "[options]" AS _page[<link type>]
-
-    with: [options] = [p:<page & param>]|[t:<text>]|[o:<tooltip>]|[q:<question parameter>]|[c:<class>]|[g:<target>]|[r:<render mode>]
-
-    <link type> = c,d,e,h,i,n,s
-
-..
-
-+---------------+-----------------------------------------------+-------------------------------------+----------------------------------------------+
-|  column name  |  Purpose                                      |default value of question parameter  |  Mandatory parameters                        |
-+===============+===============================================+=====================================+==============================================+
-|_page          |Internal link without a grafic                 |empty                                |p:<pageId>[&param]                            |
-+---------------+-----------------------------------------------+-------------------------------------+----------------------------------------------+
-|_pagec         |Internal link without a grafic, with question  |*Please confirm!*                    |p:<pageId>[&param]                            |
-+---------------+-----------------------------------------------+-------------------------------------+----------------------------------------------+
-|_paged         |Internal link with delete icon (trash)         |*Delete record ?*                    |U:form=<formname>&r=<record id> *or*          |
-|               |                                               |                                     |U:table=<tablename>&r=<record id>             |
-+---------------+-----------------------------------------------+-------------------------------------+----------------------------------------------+
-|_pagee         |Internal link with edit icon (pencil)          |empty                                |p:<pageId>[&param]                            |
-+---------------+-----------------------------------------------+-------------------------------------+----------------------------------------------+
-|_pageh         |Internal link with help icon (question mark)   |empty                                |p:<pageId>[&param]                            |
-+---------------+-----------------------------------------------+-------------------------------------+----------------------------------------------+
-|_pagei         |Internal link with information icon (i)        |empty                                |p:<pageId>[&param]                            |
-+---------------+-----------------------------------------------+-------------------------------------+----------------------------------------------+
-|_pagen         |Internal link with new icon (sheet)            |empty                                |p:<pageId>[&param]                            |
-+---------------+-----------------------------------------------+-------------------------------------+----------------------------------------------+
-|_pages         |Internal link with show icon (magnifier)       |empty                                |p:<pageId>[&param]                            |
-+---------------+-----------------------------------------------+-------------------------------------+----------------------------------------------+
-
-
-* All parameter are optional.
-* Optional set of predefined icons.
-* Optional set of dialog boxes.
-
-+-------------+-------------------------------------------------------------------------------------------------+----------------------------------------------------------+---------------------------------------------------------------+
-|  Parameter  |  Description                                                                                    |  Default value                                           |Example                                                        |
-+=============+=================================================================================================+==========================================================+===============================================================+
-|<page>       |TYPO3 page id or page alias.                                                                     |The current page: *{{pageId}}*                            |45 application application&N_param1=1045                       |
-+-------------+-------------------------------------------------------------------------------------------------+----------------------------------------------------------+---------------------------------------------------------------+
-|<text>       |Text, wrapped by the link. If there is an icon, text will be displayed to the right of it.       |empty string                                              |                                                               |
-+-------------+-------------------------------------------------------------------------------------------------+----------------------------------------------------------+---------------------------------------------------------------+
-|<tooltip>    |Text to appear as a ToolTip                                                                      |empty string                                              |                                                               |
-+-------------+-------------------------------------------------------------------------------------------------+----------------------------------------------------------+---------------------------------------------------------------+
-|<question>   |If there is a question text given, an alert will be opened. Only if the user clicks on 'ok',     |**Expected "=" to follow "see"**                          |                                                               |
-|             |the link will be called                                                                          |                                                          |                                                               |
-+-------------+-------------------------------------------------------------------------------------------------+----------------------------------------------------------+---------------------------------------------------------------+
-|<class>      |CSS Class for the <a> tag                                                                        |The default class defined for internal links in           |                                                               |
-|             |                                                                                                 |ext_localconf.php (see ...)                               |                                                               |
-+-------------+-------------------------------------------------------------------------------------------------+----------------------------------------------------------+---------------------------------------------------------------+
-|<target>     |Parameter for HTML 'target='. F.e.: Opens a new window                                           |empty                                                     |P                                                              |
-+-------------+-------------------------------------------------------------------------------------------------+----------------------------------------------------------+---------------------------------------------------------------+
-|<rendermode> |Show/render a link at all or not. See `render-mode`_ 0-5                                         |                                                          |                                                               |
-+-------------+-------------------------------------------------------------------------------------------------+----------------------------------------------------------+---------------------------------------------------------------+
-|<create sip> |s                                                                                                |                                                          |'s': create a SIP                                              |
-+-------------+-------------------------------------------------------------------------------------------------+----------------------------------------------------------+---------------------------------------------------------------+
-
-Column: _paged
-^^^^^^^^^^^^^^
-
-These column offers a link, with a confirmation question, to delete one record (mode 'table') or a bunch of records
-(mode 'form'). After deleting the record(s), the current page will be reloaded in the browser.
-
-**Syntax**
-
-::
-
-    SELECT "U:table=<tablename>&r=<record id>|q:<question>|..." AS _paged
-    SELECT "U:form=<formname>&r=<record id>|q:<question>|..." AS _paged
-
-..
-
-If the record to delete contains column(s), whose columnname match on `%pathFileName%` and such a
-column points to a real existing file, such a file will be deleted too. If the table contains records where the specific
-file is multiple times referenced, than the file is not deleted (it would break the still existing references). Multiple
-references are not found, if they use different colummnnames or tablenames.
-
-Mode: table
-'''''''''''
-
-* `table=<table name>`
-* `r=<record id>`
-
-Deletes the record with id '<record id>' from table '<table name>'.
-
-Mode: form
-''''''''''
-
-* `form=<form name>`
-* `r=<record id>`
-
-Deletes the record with id '<record id>' from the table specified in form '<form name>' as primary table.
-Additional action *FormElement* of type *beforeDelete* or *afterDelete* will be fired too.
-
-Examples:
-'''''''''
-
-::
-
-    SELECT 'U:table=Person&r=123|q:Do you want delete John Doe?' AS _paged
-    SELECT 'U:form=person-main&r=123|q:Do you want delete John Doe?' AS _paged
-
-Columns: _Page[X]
-^^^^^^^^^^^^^^^^^
-
-* Similar to `_page[X]`
-* Parameter are position dependent and therefore without a qualifier!
-
-::
-
-    "[<page id|alias>[&param=value&...]] | [text] | [tooltip] | [question parameter] | [class] | [target] | [render mode]" as _Pagee.
-
-..
-
-Column: _Paged
-^^^^^^^^^^^^^^
-
-* Similar to `_paged`
-* Parameter are position dependent and therefore without a qualifier!
-
-::
-
-    "[table=<table name>&r-<record id>[&param=value&...] | [text] | [tooltip] | [question parameter] | [class] | [render mode]" as _Paged.
-    "[form=<form name>&r-<record id>[&param=value&...] | [text] | [tooltip] | [question parameter] | [class] | [render mode]" as _Paged.
-
-..
-
-Column: _vertical
-^^^^^^^^^^^^^^^^^
-
-Render text vertically. This is useful for tables with limited column width. The vertical rendering is achieved via CSS tranformations (rotation) defined in the style attribute of the wrapping tag. You can optionally specify the rotation
-angle.
-
-**Syntax**
-
-::
-
-    SELECT "<text>|[<angle>]|[<width>]|[<height>]|[<wrap tag>]" AS _vertical
-
-..
-
-+-------------+-------------------------------------------------------------------------------------------------------+-----------------+
-|**Parameter**|**Description**                                                                                        |**Default value**|
-+=============+=======================================================================================================+=================+
-|<text>       |The string that should be rendered vertically.                                                         |none             |
-+-------------+-------------------------------------------------------------------------------------------------------+-----------------+
-|<angle>      |How many degrees should the text be rotated? The angle is measured clockwise from baseline of the text.|*270*            |
-+-------------+-------------------------------------------------------------------------------------------------------+-----------------+
-|<width>      |Width (of what?). Needs to have a CSS_unit (e.g. px, em) specified. (Implemented?)                     |*1em*            |
-+-------------+-------------------------------------------------------------------------------------------------------+-----------------+
-|<height>     |Height (of what?). Needs to have a CSS-unit (e.g. px, em) specified. (Implemented?)                    |none             |
-+-------------+-------------------------------------------------------------------------------------------------------+-----------------+
-|<wraptag>    |What tag should be used to wrap the vertical text? Possible options are *div*, *span*, etc.            |*div*            |
-+-------------+-------------------------------------------------------------------------------------------------------+-----------------+
-
-
-**Minimal Example**
-
-::
-
-
-    10.sql = SELECT "Hallo" AS _vertical
-
-..
-
-
-
-**Advanced Examples**
-
-::
-
-
-    10.sql = SELECT "Hallo|90" AS _vertical
-    20.sql = SELECT "Hallo|90|3em|7em|span" AS _vertical
-
-..
-
-
-
-Column: _mailto
-^^^^^^^^^^^^^^^
-
-Easily create Email links.
-
-**Syntax**
-
-::
-
-
-    SELECT "<email address>|[<link text>]" AS _mailto
-
-..
-
-
-
-+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
-|**Parameter** |**Description**                                                                                                                                                                                               |**Default    |
-|              |                                                                                                                                                                                                              |value**      |
-+==============+==============================================================================================================================================================================================================+=============+
-|<emailaddress>|The email address where the link should point to.                                                                                                                                                             |none         |
-+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
-|<linktext>    |The text that should be displayed on the website and be linked to the email address. This will typically be the name of the recipient. If this parameter is omitted, the email address will be displayed as   |none         |
-|              |link text.                                                                                                                                                                                                    |             |
-+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
-
-
-**Minimal Example**
-
-::
-
-
-    10.sql = SELECT "john.doe@example.com" AS _mailto
-
-..
-
-
-
-**Advanced Example**
-
-::
-
-
-    10.sql = SELECT "john.doe@example.com|John Doe" AS _mailto
-
-..
-
-
-Column: _sendmail
-^^^^^^^^^^^^^^^^^
-
-<TO:email[,email]>|<FROM:email>|<subject>|<body>|[<REPLY-TO:email>]|[<flag autosubmit: on /off>]|[<grid>]|[xId]|<CC:email[,email]>|<BCC:email[,email]>
-
-
-Send text emails. Every mail will be logged in the table `mailLog`.
-
-**Syntax**
-
-::
-
-    SELECT "john@doe.com|jane@doe.com|Reminder tomorrow|Please dont miss the meeting tomorrow" AS _sendmail
-
-..
-
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-|**Parameter**                                               |**Description**                                                                           |**Required**|
-+============================================================+==========================================================================================+============+
-|TO:email[,email]                                            |Comma-separated list of receiver email addresses. Optional: `realname <john@doe.com>`     |    yes     |
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-|FROM:email                                                  |Sender of the email. Optional: 'realname <john@doe.com>'                                  |    yes     |
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-|subject                                                     |Subject of the email                                                                      |    yes     |
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-|body                                                        |Message                                                                                   |    yes     |
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-|REPLY-TO:email                                              |Email address to reply to (if different from sender)                                      |            |
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-|flagAutoSubmit  'on' / 'off'                                |If 'on' (default), add mail header 'Auto-Submitted: auto-send' - suppress OoO replies     |            |
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-|grId                                                        |Will be copied to the mailLog record. Helps to setup specific logfile queries             |            |
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-|xId                                                         |Will be copied to the mailLog record. Helps to setup specific logfile queries             |            |
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-|CC:email[,email]                                            |Comma-separated list of receiver email addresses. Optional: 'realname <john@doe.com>'     |            |
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-|BCC:email[,email]                                           |Comma-separated list of receiver email addresses. Optional: 'realname <john@doe.com>'     |            |
-+------------------------------------------------------------+------------------------------------------------------------------------------------------+------------+
-
-
-**Minimal Example**
-
-::
-
-
-    10.sql = SELECT "john.doe@example.com|company@example.com|Latest News|The new version is now available." AS _sendmail
-
-..
-
-
-
-This will send an email with subject *Latest News* from company@example.com to john.doe@example.com.
-
-**Advanced Examples**
-
-::
-
-
-    10.sql = SELECT "customer1@example.com,Firstname Lastname <customer2@example.com>, Firstname Lastname <customer3@example.com>|company@example.com|Latest News|The new version is now available.|sales@example.com|on|101|222|ceo@example.com|backup@example.com" AS _sendmail
-
-..
-
-This will send an email with subject *Latest News* from company@example.com to customer1, customer2 and customer3 by
-using a realname for customer2 and customer3 and suppress generating of OoO answer if any receiver is on vacation.
-Additional the CEO as well as backup will receive the mail via CC and BCC.
-
-For debugging, please check `REDIRECT_ALL_MAIL_TO`_.
-
-
-Column: _img
-^^^^^^^^^^^^
-
-Renders images. Allows to define an alternative text and a title attribute for the image. Alternative text and title text are optional.
-
-*   If no alternative text is defined, an empty alt attribute is rendered in the img tag (since this attribute is mandatory in HTML).
-*   If no title text is defined, the title attribute will not be rendered at all.
-
-**Syntax**
-
-::
-
-
-    SELECT "<path to image>|[<alt text>]|[<title text>]" AS _img
-
-..
-
-
-
-+-------------+-------------------------------------------------------------------------------------------+---------------------------+
-|**Parameter**|**Description**                                                                            |**Default value/behaviour**|
-+=============+===========================================================================================+===========================+
-|<pathtoimage>|The path to the image file.                                                                |none                       |
-+-------------+-------------------------------------------------------------------------------------------+---------------------------+
-|<alttext>    |Alternative text. Will be displayed if image can't be loaded (alt attribute of img tag).   |empty string               |
-+-------------+-------------------------------------------------------------------------------------------+---------------------------+
-|<titletext>  |Text that will be set as image title in the title attribute of the img tag.                |no title attribute rendered|
-+-------------+-------------------------------------------------------------------------------------------+---------------------------+
-
-
-**Minimal Example**
-
-::
-
-
-    10.sql = SELECT "fileadmin/img/img.jpg" AS _img
-
-..
-
-
-
-**Advanced Examples**
-
-::
-
-
-    10.sql = SELECT "fileadmin/img/img.jpg|Aternative Text" AS _img            # alt="Alternative Text, no title
-    20.sql = SELECT "fileadmin/img/img.jpg|Aternative Text|" AS _img           # alt="Alternative Text, no title
-    30.sql = SELECT "fileadmin/img/img.jpg|Aternative Text|Title Text" AS _img # alt="Alternative Text, title="Title Text"
-    40.sql = SELECT "fileadmin/img/img.jpg|Alternative Text" AS _img           # alt="Alternative Text", no title
-    50.sql = SELECT "fileadmin/img/img.jpg" AS _img                            # empty alt, no title
-    60.sql = SELECT "fileadmin/img/img.jpg|" AS _img                           # empty alt, no title
-    70.sql = SELECT "fileadmin/img/img.jpg||Title Text" AS _img                # empty alt, title="Title Text"
-    80.sql = SELECT "fileadmin/img/img.jpg||" AS _img                          # empty alt, no title
-
-..
-
-
-
-Column: _exec
-^^^^^^^^^^^^^
-
-Runs batch files or executables on the webserver. In case of an error, returncode and errormessage will be returned.
-
-**Syntax**
-
-::
-
-
-    <command>
-
-..
-
-
-
-+-------------+--------------------------------------------------+-----------------+
-|**Parameter**|**Description**                                   |**Default value**|
-+=============+==================================================+=================+
-|<command>    |The command that should be executed on the server.|none             |
-+-------------+--------------------------------------------------+-----------------+
-
-
-**Minimal Examples**
-
-::
-
-
-    10.sql = SELECT "ls -s" AS _exec
-    20.sql = SELECT "./batchfile.sh" AS _exec
-
-..
-
-
-Column: _pdf | _file | _zip
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Most of the other Link-Class attributes can be used to customize the link.
-::
-
-    SELECT "[options]" AS _pdf, "[options]" AS _file, "[options]" AS _zip
-
-    with: [options] = [d:<exportFilename]|[U:<params>]|[u:<url>]|[f:file]|[t:<text>]|[a:<message>]|[o:<tooltip>]|[c:<class>]|[r:<render mode>]
-
-
-* Parameter are position independent.
-* *<params>*: see `download-parameter-files`_
-* For column `_pdf` and `_zip`, the element sources `U:...`, `u:...`, `f:...` might repeated multiple times.
-* Example: ::
-
-		SELECT "f:fileadmin/test.pdf" as _pdf,  "f:fileadmin/test.pdf" as _file,  "f:fileadmin/test.pdf" as _zip
-		SELECT "U:id=export&r=1" as _pdf,  "U:id=export&r=1" as _file,  "U:id=export&r=1" as _zip
-
-		SELECT "t:Download PDF|f:fileadmin/test.pdf" as _pdf,  "t:Download PDF|f:fileadmin/test.pdf" as _file,  "t:Download ZIP|f:fileadmin/test.pdf" as _zip
-		SELECT "t:Download PDF|U:id=export&r=1" as _pdf,  "t:Download PDF|U:id=export&r=1" as _file,  "t:Download ZIP|U:id=export&r=1" as _zip
-
-		SELECT "d:complete.pdf|t:Download PDF|f:fileadmin/test1.pdf|f:fileadmin/test2.pdf" as _pdf, "d:complete.zip|t:Download ZIP|f:fileadmin/test1.pdf|f:fileadmin/test2.pdf" as _zip
-
-		SELECT "d:complete.pdf|t:Download PDF|f:fileadmin/test.pdf|U:id=export&r=1|u:www.w3c.org" AS _pdf
-
-..
-
-Column: _Pdf | _File | _Zip
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-A limited set of attributes is supported: ::
-
-    SELECT "[options]" AS _Pdf, "[options]" AS _File, "[options]" AS _Zip
-
-    with: [options] = [<exportFilename>]|[<text>]|[<1: urlparam|file>]|[<2: urlparam|file>]| ... |[<n: urlparam|file>]
-
-* Parameter are position dependent and therefore without a qualifier!
-* `<urlparam>` or `<file>` might be given.
-* If there is more than one `<urlparam|file>`, only `_Pdf` or `_Zip` is possible.
-* Example: ::
-
-		SELECT "||fileadmin/test.pdf" AS _File, "||fileadmin/test.pdf" AS _Pdf, "||fileadmin/test.pdf" AS _Zip
-		SELECT "output.pdf|Download PDF|fileadmin/test.pdf" AS _File, "output.pdf|Download PDF|fileadmin/test.pdf" AS _Pdf, "output.zip|Download ZIP|fileadmin/test.pdf" AS _Zip
-
-		SELECT "complete.pdf|Download PDF|fileadmin/test1.pdf|fileadmin/test2.pdf|id=export&r=1" AS _Pdf
-
-..
-
-
-Column: _F
-^^^^^^^^^^
-
-Challenge 1
-'''''''''''
-
-Due to the limitations of MySQL, reserved column names can't be further concatenated. Assume you want to display an image:
-
-::
-
-
-    # This is valid:
-    10.sql = SELECT concat("/static/directory/", p.foto) AS _img FROM person AS p WHERE ...
-
-    # Returns:
-    <img src=...>
-
-..
-
-
-
-Now assume you want to wrap the image in a div tag:
-
-::
-
-
-    # This is valid:
-    10.sql = SELECT "<div>", CONCAT("/static/directory/", p.foto) AS _img, "</div>" FROM person AS p WHERE ...
-
-    # Returns:
-    <div><img src=...></div>
-
-..
-
-
-
-The example above works fine - however, as soon as you want to use *field wrappers*, things get messy:
-
-::
-
-
-    # This is valid:
-    10.sql = SELECT "<div>", CONCAT("/static/directory/", p.foto) AS _img, "</div>" FROM person AS p WHERE ...
-    10.fbeg = <td>
-    10.fend = </td>
-
-    # Returns:
-    <td><div></td><td><img src=...></td><td></div></td>
-
-..
-
-
-
-To achieve the desired result, one might want to try something like this:
-
-::
-
-
-    # This is NOT valid:
-    10.sql = SELECT CONCAT("<div>", concat("/static/directory/", p.foto) AS _img, "</div>") FROM person AS p WHERE ...
-    10.fbeg = <td>
-    10.fend = </td>
-
-    # Returns a MySQL error because nesting concat() -functions is not allowed
-
-..
-
-
-
-Challenge 2
-'''''''''''
-
-Assume you have multiple columns with reserved names in the same query and want to use one of them in a later query:
-
-::
-
-
-    10.sql = SELECT CONCAT("/static/directory/", g.picture) AS _img, CONCAT("/static/preview/", g.thumbnail) AS _img FROM gallery AS g WHERE ...
-
-    20.sql = SELECT "{{10.img}}", d.text FROM description AS d ...
-
-..
-
-
-
-The example above will fail because there are two img columns which can not be distinguished.
-
-Solution
-''''''''
-
-The reserved column 'F'(=Format) can be used to
-
-*   further wrap columns with a reserved name
-
-*   assign an arbitrary name to a column built through a reserved name to make it accessible in later queries.
-
-Solution for *#Challenge_1*:
-
-::
-
-
-    10.sql = SELECT CONCAT("Q:img|T:div") AS wrappedImg FROM person AS p WHERE ...
-    10.fbeg = <td>
-    10.fend = </td>
-
-    # Returns:
-    <td><div><img src=...></div></td>
-
-..
-
-
-
-Solution for *#Challenge_2*:
-
-::
-
-
-    10.sql = SELECT CONCAT("Q:img|V:mypic") AS wrappedImg FROM person AS p WHERE ...
-
-    20.sql = SELECT "{{10.mypic}}" ...
-
-..
-
-
-
-+-------------+--------------------------------------------------------------------+--------+
-|**Parameter**|**Description**                                                     |Required|
-+=============+====================================================================+========+
-|Q            |Any of the *reserved column names*                                  |        |
-+-------------+--------------------------------------------------------------------+--------+
-|Z            |Process the column but don't display it                             |        |
-+-------------+--------------------------------------------------------------------+--------+
-|X            |Strip tags / Remove all tags                                        |        |
-+-------------+--------------------------------------------------------------------+--------+
-|T            |Wrap the column with the defined tag. F.e.: T:tdcolspan="2"         |        |
-+-------------+--------------------------------------------------------------------+--------+
-|V            |Define an unambiguous variable name for this colum. F.e.: V:someName|        |
-+-------------+--------------------------------------------------------------------+--------+
-|*            |Add all the parameters required for the column defined with Q:      |        |
-+-------------+--------------------------------------------------------------------+--------+
-
-
-The above example builds a link to pageB - refer to the :ref:`column-link`-manual for details. The link tells page B to
-render the form with name formname and load the record with id id for editing.
-
-QFQ CSS Classes
----------------
-
-* `qfq-table-50`, `qfq-table-80` - release the default width of 100% and specify minwidth=50% resp. 80%.
-
-* Background Color: `qfq-color-grey-1`, `qfq-color-grey-2`  (table, row, cell)
-* Table: `table`
-* Table > hover: `table-hover`
-* Table > condensed: `table-condensed`
-
-E.g.::
-
-  10.sql = SELECT id, name, firstName, ...
-  10.head = <table class='table table-condensed qfq-table-50'>
-
-Examples
---------
-
-The following section gives some examples of typical reports
-
-Basic Queries
-^^^^^^^^^^^^^
-
-*   One simple query
-
-::
-
-
-    10.sql = SELECT "Hello World"
-
-..
-
-
-
-Result:
-
-::
-
-
-    Hello World
-
-..
-
-
-
-    Two simple queries
-
-::
-
-
-    10.sql = SELECT "Hello World"
-    20.sql = SELECT "Say hello"
-
-..
-
-
-
-    Result:
-
-::
-
-
-    Hello WorldSay hello
-
-..
-
-
-
-    Two simple queries, with break
-
-::
-
-
-    10.sql = SELECT "Hello World<br />"
-    20.sql = SELECT "Say hello"
-
-..
-
-
-
-    Result:
-
-::
-
-
-    Hello World
-    Say hello
-
-..
-
-
-
-Accessing the database
-^^^^^^^^^^^^^^^^^^^^^^
-
-    Real data, one single column
-
-::
-
-
-    10.sql = SELECT p.firstName FROM exp_person AS p
-
-..
-
-
-
-    Result:
-
-::
-
-
-    BillieElvisLouisDiana
-
-..
-
-
-
-    Real data, two columns
-
-::
-
-
-    10.sql = SELECT p.firstName, p.lastName FROM exp_person AS p
-
-..
-
-
-
-    Result:
-
-::
-
-
-    BillieHolidayElvisPresleyLouisArmstrongDianaRoss
-
-..
-
-
-
-The result of the SQL query is an output, row by row and column by column, without adding any formatting information.
-See `Formatting Examples`_ for examples of how the output can be formatted.
-
-Formatting Examples
-^^^^^^^^^^^^^^^^^^^
-
-Formating (i.e. wrapping of data with HTML tags etc.) can be achieved in two different ways:
-
-One can add formatting output directly into the SQL by either putting it in a separate column of the output or by using
-concat to concatenate data and formatting output in a single column.
-
-One can use ?level keys to define formatting information that will be put before/after/between all rows/columns of the
-actual levels result.
-
-Two columns
-
-::
-
-
-    # Add the formating information as a coloum
-    10.sql = SELECT p.firstName, " " , p.lastName, "'<br /'>" FROM exp_person AS p
-
-..
-
-
-
-Result:
-
-::
-
-
-    Billie Holiday
-    Elvis Presley
-    Louis Armstrong
-    Diana Ross
-
-..
-
-
-
-One column 'rend'
-
-::
-
-
-    10.sql = SELECT p.name FROM exp_person AS p
-    10.rend = <br />
-
-..
-
-Result:
-
-::
-
-
-    Billie Holiday
-    Elvis Presley
-    Louis Armstrong
-    Diana Ross
-
-..
-
-More HTML
-
-::
-
-
-    10.sql = SELECT p.name FROM exp_person AS p
-    10.head = <ul>
-    10.tail = </ul>
-    10.rbeg = <li>
-    10.rend = </li>
-
-..
-
-Result:
-
-::
-
-
-    o Billie Holiday
-    o Elvis Presley
-    o Louis Armstrong
-    o Diana Ross
-
-The same as above, but with braces::
-
-  10 {
-    sql = SELECT p.name FROM exp_person AS p
-    head = <ul>
-    tail = </ul>
-    rbeg = <li>
-    rend = </li>
-  }
-
-Two queries: ::
-
-    10.sql = SELECT p.name FROM exp_person AS p
-    10.rend = <br />
-    20.sql = SELECT a.street FROM exp_address AS a
-    20.rend = <br />
-
-Two queries: nested ::
-
-    # outer query
-    10.sql = SELECT p.name FROM exp_person AS p
-    10.rend = <br />
-
-    # inner query
-    10.10.sql = SELECT a.street FROM exp_address AS a
-    10.10.rend = <br />
-
-* For every record of '10', all records of 10.10 will be printed.
-
-Two queries: nested with variables ::
-
-    # outer query
-    10.sql = SELECT p.id, p.name FROM exp_person AS p
-    10.rend = <br />
-
-    # inner query
-    10.10.sql = SELECT a.street FROM exp_address AS a WHERE a.pId='{{10.id}}'
-    10.10.rend = <br />
-
-* For every record of '10', all assigned records of 10.10 will be printed.
-
-Two queries: nested with hidden variables in a table ::
-
-    10.sql = SELECT p.id AS _pId, p.name FROM exp_person AS p
-    10.rend = <br />
-
-    # inner query
-    10.10.sql = SELECT a.street FROM exp_address AS a WHERE a.pId='{{10.pId}}'
-    10.10.rend = <br />
-
-Same as above, but written in the nested notation ::
-
-  10 {
-    sql = SELECT p.id AS _pId, p.name FROM exp_person AS p
-    rend = <br />
-
-    10 {
-    # inner query
-      sql = SELECT a.street FROM exp_address AS a WHERE a.pId='{{10.pId}}'
-      rend = <br />
-    }
-  }
-
-* Columns starting with a '_' won't be printed but can be accessed as regular columns.
-
-Help
-====
-
-* Does the error happens on every *page* or only on specific one?
-* Does the error happens on every *form* or only on specific one?
-
-Tips:
-
-* On general errors:
-
-	* Always check the Javascript console of your browser, see `javascriptProblem`_.
-	* Always check the Webserver logfiles, see `webserverErrorLog`_.
-
-
-Error Messages
---------------
-
-Internal Server Error
-^^^^^^^^^^^^^^^^^^^^^
-
-The browser shows a red popup with 'Internal Server Error'. The message is generated in the browser. Happens e.g. an AJAX
-request response of QFQ (=Server) is broken. This might happen e.g. if PHP can't start successfully or PHP fails to run
-due to  a missing php module or broken configuration.
-
-
-
-.. _`javascriptProblem`:
-
-Javascript problem
-------------------
-
-Open the 'Webdeveloper Tools' (FF: F12, Chrome/Opera: Right mouse click > Inspect Element) in your browser, switch to
-'console' and reload the page. Inspect the messages.
-
-
-.. _`webserverErrorLog`:
-
-Webserver error log
--------------------
-
-For apache: /var/log/apache2/error_log
-
-
-Call to undefined function qfq\\mb_internal_encoding()
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Check that all required php modules are installed. See `preparation`_.
-
-QFQ specific
-------------
-
-Variable empty: {{...}}
-^^^^^^^^^^^^^^^^^^^^^^^
-
-Specify the required sanitize class. Remember: for STORE_FORM and STORE_CLIENT the default is `digit`. This means if
-the variable content is a string, this violates the sanitize class and the replaced content will be an empty string!
\ No newline at end of file
diff --git a/extension/Documentation/html/_sources/OnlineRecuitingTool.rst.txt b/extension/Documentation/html/_sources/OnlineRecuitingTool.rst.txt
deleted file mode 100644
index 33ce8cf57..000000000
--- a/extension/Documentation/html/_sources/OnlineRecuitingTool.rst.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-.. ==================================================
-.. Header hierachy
-.. ==
-..  --
-..   ^^
-..    ''
-..     ;;
-..      ,,
-..
-.. --------------------------------------------------
-.. Best Practice T3 reST  https://docs.typo3.org/typo3cms/drafts/github/xperseguers/RstPrimer/
-.. External Links: `Bootstrap <http://getbootstrap.com/>`_:
-.. Add Images: https://wiki.typo3.org/ReST_Syntax#Images
-..
-.. -*- coding: utf-8 -*- with BOM.
-
-
-.. include:: Includes.txt
-
-.. _OnlineRecruitingTool:
-
-Online Recruiting Tool
-======================
-
-The ORT will show a typical QFQ application with some best practices tips.
-
-Play the SQL file 'onlineRecruitingTool.sql' on a fresh installation. Otherwise some `Form` and `FormElement` id's might be
-used and playing the file will fail.
diff --git a/extension/Documentation/html/_sources/README.rst.txt b/extension/Documentation/html/_sources/README.rst.txt
deleted file mode 100644
index 272306710..000000000
--- a/extension/Documentation/html/_sources/README.rst.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-
-=========================================
-TYPO3 Documentation Starter "Public Info"
-=========================================
-
-:Repository:      https://github.com/T3DocumentationStarter/Public-Info-053
-:Published at:    https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/
-:Writing here:    Carsten Rose
-
diff --git a/extension/Documentation/html/_sources/Release.rst.txt b/extension/Documentation/html/_sources/Release.rst.txt
deleted file mode 100644
index 9e2373ef7..000000000
--- a/extension/Documentation/html/_sources/Release.rst.txt
+++ /dev/null
@@ -1,957 +0,0 @@
-.. ==================================================
-.. Header hierachy
-.. ==
-..  --
-..   ^^
-..    ''
-..     ;;
-..      ,,
-..
-.. --------------------------------------------------
-.. Best Practice T3 reST  https://docs.typo3.org/typo3cms/drafts/github/xperseguers/RstPrimer/
-.. External Links: `Bootstrap <http://getbootstrap.com/>`_:
-.. Add Images: https://wiki.typo3.org/ReST_Syntax#Images
-..
-.. -*- coding: utf-8 -*- with BOM.
-
-
-.. include:: Includes.txt
-
-.. _release:
-
-Release
-=======
-
-Version 0.future
-----------------
-
-Date: <date>
-
-Notes
-^^^^^
-
-Features
-^^^^^^^^
-
-Bug Fixes
-^^^^^^^^^
-
-Version 0.25.0
---------------
-
-Date: 10.10.2017
-
-Notes
-^^^^^
-
-* The config.qfq.ini directives DB_USER, DB_NAME, DB_HOST, DB_PASSWORD are replaced by DB_1_USER, DB_1_NAME, DB_1_HOST,
-  DB_1_PASSWORD. The old directives are still used, as long as the new directives does not exist.
-
-* New config.qfq.ini directives: DB_INDEX_DATA, DB_INDEX_QFQ
-
-Features
-^^^^^^^^
-* #4720 - Separate database handles for QFQ 'form' and QFQ 'data' - 'Form' might  now load/save from forign database/host/user.
-
-
-Version 0.24.0
---------------
-
-Date: 09.10.2017
-
-Notes
-^^^^^
-
-* Change Remove SYSTEM_SECURITY_ABSOLUTE_GET_MAX_LENGTH - makes no sense to hardcode an upper limit.
-
-Features
-^^^^^^^^
-
-* Feature Manual.rst: Doc updated for latest subrecord column special names
-* Feature AbstractBuildForm.php: new function subrecordHead(). Replaced several hard coded subrecord column names against constants.
-* Feature #4456 / formModeGlobal=requiredOff - update Manual.rst
-* Feature #4606 / _link: qualifier to render bootstrap button - fix unit tests for tooltip. Add tooltip to button/text, even if there is no link. Implement token  'b:...' for link class. Manual is updated. Open: `pageX` should be recoded to use the new 'b:' instead of hardcoed behaviour to render a button.
-* Feature: Upload Button - wrapped with Bootstrap Button. New option 'fileButtonText' to specify a button text.
-* Feature #3752 / Pills auf mode|modeSql=hidden|readonly setzen - implemented during 'form load' (not dynamic update)
-* Feature: Neu wird nach dem Speichern das Formular nochmal komplett geladen. Das ist wichtig um die durch aftersave geaenderten Records in die Formularelemente zu bekommen.
-* Feature #4511 / Form: URL Forward - mode dynamic computed - more generic implementation.
-
-Bug Fixes
-^^^^^^^^^
-
-* Bug #4731 / Dynamic Update: load(post) triggers 'check required' - makes no sense during filling a form - fixed
-* Bug #4730 / InvalidDate-00-00-2000 FE.type=date - detection of empty date was broken for '00.00.0000'.
-* Bug Fixed problem in subrecord when no record is selected.
-* Bug #4620 / Easy Fix: saveButtonText / closeButtonText Formatierung
-
-Release
-=======
-
-Version 0.23.1
---------------
-
-Date: 23.9.2017
-
-Bug Fixes
-^^^^^^^^^
-
-* #4620 / Easy Fix: saveButtonText / closeButtonText Formatierung
-
-
-Version 0.23.0
---------------
-
-Date: 17.09.2017
-
-Features
-^^^^^^^^
-
-* #3752 / Pills auf mode|modeSql=hidden|readonly setzen - implemented during 'form load' (not dynamic update)
-
-Bug Fixes
-^^^^^^^^^
-
-* #4548 /Template Group: 'form-update' broken - Broken Redirect after Save - Broken same HTML ID for FE copies in a template group.
-* #4548 /Template Group: 'form-update' broken - max tg element value/index shown after save instead of last user supplied value, but save is ok. Neu wird nach dem Speichern das Formular nochmal komplett geladen. Das ist wichtig um die durch aftersave geaenderten Records in die Formularelemente zu bekommen.
-
-Release
-=======
-
-Version 0.22
-------------
-
-Date: 14.09.2017
-
-Notes
-^^^^^
-
-* Form Editor: element 'forwardPage' is static again (no dynamic update) - see features in #4511.
-
-Features
-^^^^^^^^
-
-* #4511 / Form: URL Forward - mode dynamic computed
-
-Bug Fixes
-^^^^^^^^^
-
-* #4512 | SIP URL does not respect anker token '#'- fixed PLUS: L and type _GET Params included in links which contain a SIP (regular links still open).
-* #4508 / Form: during Save with FE with 'report'-Note/Values an exception is thrown - report does not expect, to be called without typo3 - but this is the case during save and generating the JSON.
-* #4021 / "required" asterik does not handle multi column labels correctly
-* #4423 / Date inputs with readonly: label is grey.
-* Empty date might create '2001-00-00'
-* #4504 / Upload Button: required asterik missing after save - seems to be a problem for every element - should be fixed now.
-
-Version 0.21.0
---------------
-
-Date: 10.09.2017
-
-Notes
-^^^^^
-
-* The Form-Editor now has two 'requiredParamter' fields: one for 'New' record and one 'Edit'. Existing settings will be
-  automatically copied to both.
-* The FormElement-Editor field 'Note' is not anymore a TinyMCE Editor. Instead a regular 'textarea' is used. Main reason
-  are incompatibilities between TinyMCE HTML mode and the neede CR/LF linebreaks needed for 'Report' Syntax in the 'note'
-  column.
-
-Features
-^^^^^^^^
-
-* #4431 / FE.type=note: QFQ Report Syntax in 'FE.value' and 'FE.note'
-* #4456 / formModeGlobal=requiredOff - Switches FormElement.mode=required to 'show' for all FE of the current Form.
-* Feature #4356 / Form: required parameter - split between 'New' & 'Edit'
-
-Version 0.20.0
---------------
-
-Changes
-^^^^^^^
-
-* New configuration value EXTRA_BUTTON_INFO_POSITION in config.qfq.ini
-
-Features
-^^^^^^^^
-
-* #4386 Fuer GRC: Optional Info Button bei 'input' wie bei 'textarea' - EXTRA_BUTTON_INFO_POSITION=below
-* #4429 / subrecord: new FE parameter 'subrecordTableCass' - a custom class for the subrecord table might be specified.
-* #4428 / subrecord: mode=readonly
-* #4421 / subrecord: column of the sql1 row should go into the edit link - implemented
-* #4399 / Do not render '_pdf' when r:5 or empty string
-
-Bug Fixes
-^^^^^^^^^
-
-* #4396 / FE: Justify DATE and TIME in case it's DATETIME on a non primary table.
-* #2414 / Deaktivieren von Option 'new' bei subrecord hat keine Folge
-* #4426 / Subrecord: mode=hidden - still shown
-* #4425/ Subrecords: Table head is not wrapped in <thead>
-* #4331 / SQL Statement 'REPLACE' not fired - Keyword missing in list of SQL Keywords
-
-
-Version 0.19.7
---------------
-
-Changes
-^^^^^^^
-
-* #4306 / Update Text Subrecord: Please save this record first
-
-Features
-^^^^^^^^
-
-Bug Fixes
-^^^^^^^^^
-
-* #4278 / Language: Check that language settings are respectet inside of container / pill / fieldset / templateGroup.
-* #4310 / Fixed error where custom values wouldn't be saved, nor not found for non pedantic.
-* #4311 / Record Lock: expired lock wird nicht geloescht bei form reload.
-* #4309 / typeahead: allow free entry
-
-Version 0.19.6
---------------
-
-Features
-^^^^^^^^
-
-* #4299 / HTML Element 'Select': Placeholder
-* Changes to the alert generation and added btn-group for multiple buttons.
-* Should only show reload button and be modal when the conflict is mandatory.
-* #4144 / Close/New: bei acquireLock=false anschliessend keine Nachfrage ob gespeichert werden soll
-* #4120 / Removed Timeout from Dirty Alert Message
-* #4283 / FE.parameter=emptyMeansNull
-
-Bug Fixes
-^^^^^^^^^
-
-* #4281 Prevent save from being clicked multiple times. Save no turns orange when saving.
-
-Version 0.19.5
---------------
-
-Features
-^^^^^^^^
-
-* #3790 / Multilanguage: German/ English/ ...
-
-Bug Fixes
-^^^^^^^^^
-* #4274 / ItemList: escape ',' ':'
-
-
-Version 0.19.4
---------------
-
-Features
-^^^^^^^^
-
-* Feature: Form Paste Records - skip columns during copy if they do not exist on the source side.
-
-Bug Fixes
-^^^^^^^^^
-
-* #4266 / FormElement Type=Editor: value not saved - fixed
-* #4253 / Record Lock not deleted, when window closes without save.
-
-Version 0.19.3
---------------
-
-Changes
-^^^^^^^
-
-* Changing buttons for the dirty Events depending on status
-
-Bug Fixes
-^^^^^^^^^
-
-* #4257 / Dynamic update broken - after changing JSON data structure, update load.php has been missed.
-
-Open
-^^^^
-
-* #4253 / Record Lock not deleted when window closes without save
-
-Version 0.19.2
---------------
-
-Features
-^^^^^^^^
-
-* #4250 / autocron: sending mails
-* #4248 / FormElement: TypeAhead fuer den Spaltennamen - Implemented
-* #4144 / Close/New: bei acquireLock=false anschliessend keine Nachfrage ob gespeichert werden soll
-* #4120: Removed Timeout from Dirty Alert Message
-
-Version 0.19.1
---------------
-
-Features
-^^^^^^^^
-
- * #4172 /record locking: Bob tries to delete a record and get 'status=error': Client should disable 'delete' button
- * #4185 / Detect modified record
- * #4143 / New alert removes old alert(s)
- * #4173 / Form: User open's a new tab and press close - alert to inform user that he has to close the tab
- * #1930, #3980 /  Client: Bei Form Submit den Status 'submit_reason=save|save,close' mitsenden
- * Implemented: New > Close (save) now closes correctly the current page. Addtional, #1930 has been solved implizit.
-
-Bug Fixes
-^^^^^^^^^
-
- * Bug #4174 / record locking: error message if delete fails due to record locking
- * Bug: SQL 'CREATE' implemented as a valid command.
-
-Version 0.19.0
---------------
-
-Changes
-^^^^^^^
-
-* bower.json: change bootstrap version number from micro to minor.
-* Sip.php: Guarantee that uniqid() is unique at least for the current user.
-* Makefile: change installation of phpDocumentor to --alldeps and remove 'phpdoc/'.
-
-Features
-^^^^^^^^
-
-* #3881 / Variables: Ex 'keySemId', New 'periodId' (System Store)
-* AbstractBuildForm.php: if a datetime / timestamp has the string 'CURRENT_TIMESTAMP' it will be replaced by the current date/time.
-* Add new STORE_TYPO3 vars: pageAlias, pageTitle
-* Config.php: cleanup of checking GET variables.
-* #3981 / Record Locking
-* Manual.rst: add documentation for record locking
-* Manual.rst: more details about QFQ variables.
-* plantuml: sequence diagrams for record locking
-
-Bug Fixes
-^^^^^^^^^
-
-* Bug #4158 / Delete Button im Form fehlen die SIP Parameter.
-* Bug #4159 / missing htmlspecialchar_decode() for FE.value supplied content.
-* Bug Makefile: fixed unwanted removing of whole 'doc' by 'maintainer-clean' - doc nowadays contains QFQ related manually created documentation.
-* Bug typeahead.php: An exception catched in typeahead.php has been assigned as array element, instead of a whole array. Fixed.
-
-
-
-
-Version 0.18.7
---------------
-
-Changes
-^^^^^^^
-
-* Makefile: 'make bootstrap' udpates all JS Lib packages. Double npm install removed.
-
-Features
-^^^^^^^^
-
-* #3947 / Attack detectect: logout current user (only QFQ, FE User still logged in).
-* #3959 / Class _link: implement 'any' Bootstrap glyphicons. New token 'G:' for '_link'.
-
-Bug Fixes
-^^^^^^^^^
-
-* #3953 / Radio buttons: Auswahl nicht angezeigt, wenn per itemList definiert
-* Feature #3982 / Filename Sanatize: remove spaces. Filename not properbly enclosed by double ticks.
-
-Version 0.18.6
---------------
-
-Features
-^^^^^^^^
-
-* Feature #3460 / Report: new column types '_striptags, '_htmlentities', '_+Tag'
-
-Version 0.18.5
---------------
-
-Features
-^^^^^^^^
-
-* QuickFormQuery.php: added function to check if there are copyForm paste records
-* Manual.rst, formEditor.sql: add several links in Form 'FormEditor' to the online documentation. The FormEditor now
-  contains links to the Online Documentation. Add missing explanations: Required Parameter, Forward.
-
-Bug Fixes
-^^^^^^^^^
-
-* Bug #3912 / templateGroup: max. 5 instances are saved.
-* Manual.rst: Fixed missing '{{' and '%' in examples.
-* Bug #3925 / templateGroup / non primary / delete records: only one at a time
-* Makefile: Artifactory builds fails at chromedriver - temporary remove npm install of chromedriver
-
-Version 0.18.4
---------------
-
-Bug Fixes
-^^^^^^^^^
-* Bug #3910 / 'submitButtonText' not shown
-
-Version 0.18.3b
----------------
-
-Features
-^^^^^^^^
-
-* Feature #3906 / Mark required inputs with an asterik
-
-Bug Fixes
-^^^^^^^^^
-
-* Bug #3903 / Copy/Paste form: references inside a record are not updated at all
-
-Version 0.18.3a
----------------
-
-Changes
-^^^^^^^
-
-* Copy / Paste form: take care that there is now Form.id=3. This is now the reserved formId for the 'copyForm'.
-
-      UPDATE `FormElement` SET formId=100 WHERE formId=3
-      UPDATE `Form` SET `id` = '100' WHERE `Form`.`id` = 3;
-
-Bug Fixes
-^^^^^^^^^
-
-Version 0.18.3
---------------
-
-Features
-^^^^^^^^
-
-* #3899 / Copy/Paste
-
-  * DatabaseUpdate.php: New table Clipboard, New FE.type='paste', New Form.forwardMode='url-sip' - will be applied for 0.18.3.
-  * Store.php: New member in STORE_CLIENT 'CLIENT_COOKIE_QFQ' - might be used to identify current user.
-  * formEditor.sql: New form 'copyForm'. New table 'Clipboard'
-
-
-Version 0.18.2
---------------
-
-Changes
-^^^^^^^
-
-* Feature #3891 / Dynamic Update: Multiple Elements in a row - single show/hide - First implementation: Show / Hide via dynamicUpdate for a second element, wrapped in an own 'col-md' div.
-
-Bug Fixes
-^^^^^^^^^
-
-* Bug #3875 / FormElement 'extra': Fehler bei neuen Records.
-* Bug #3647 / Dynamic Update: Multiple Elements in a row not updated properly.
-* Bug #3890 / upload-FormElement: mode 'hide' without effect
-* Bug #3876 / upload-FormElement: verschwindet bei dynamicUpdate.
-
-Version 0.18.1
---------------
-
-* Update unit tests
-
-Version 0.18.0
---------------
-
-Changes
-^^^^^^^
-*  New defaults to FormElement.type=`file` (=Upload).
-
-  * `access` = `application/pdf`
-  * `maxFileSize` = `10485760` (10MB)
-
-Features
-^^^^^^^^
-
-* Make the image shown for ExtraButtonInfo configureable. Manual.rst: added documentation for new config.qfq.ini
-  variables GFX_EXTRA_BUTTON_INFO_INLINE, GFX_EXTRA_BUTTON_INFO_BELOW.
-* Manual.rst: description added for `extraButtonLock` ,`extraButtonPassword`, `extraButtonInfo`. Example on how to reuse
-  custom vars defined in `config.qfq.ini`. Add three more examples to _pdf. How to access local online documentation.
-  Add note about wkhtml only on linux boxes. More wkhtml explanations.
-* #3773 / Button: Info / Unlock / ShowPassword: FE_PARAMETER: extraButtonLock / extraButtonPassword / extraButtopnInfo.
-* #3769 / Allow specific GET variables longer than SECURITY_GET_MAX_LENGTH. config.php: implemented special handling of
-  GET vars, named with '..._<num>'.
-* #3766 / SQL_LOG per tt_content record einstellbar machen. Add `sqlLog` and `sqlLogMode` to QFQ tt-content records.
-  Add mode 'error' and `none` to sqlLogMode. Manual.rst: Added explanations for SQL_LOG, SQL_LOG_MODE, and tt-content
-  pendants sqlLog, sqlLogMode. Update config.qfq.ini to latest attributes.
-* Config.php: Set defaults for config.qfq.ini SQL_LOG and SQL_LOG_MODE
-* Manual.rst:
-* config.qfq.example.ini: Remove DB_NAME_TEST, Add some details about SQL_LOG, add example for TECHNICAL_CONTACT
-* Session.php: Activate cookie_httponly for QFQ cookies.
-* Html2Pdf.php:  recode setting of $this->logFile.
-* config.qfq.ini: new syntax for SHOW_DEBUG_INFO - [yes,no,auto][,download]
-* #3711 / Upload Button opens the camera on a smartphone. New attribute 'capture'.
-* Database.php: Add SQL keyword 'DROP'.
-* #3706 / Check File Upload: a) mime type, b) max file size. Implemented: file upload check for mime type and max file size.
-* New 'pageForward'-Mode: 'url-skip-history'.
-* FormEditor:
-
-  * Most radio FEs changed from HTML standard to Bootstrap Design.
-  * FE 'feIdContainer' will only be shown if there is at least one FE container element.
-  * Use dynamicUpdate to hide/show FE 'forwardPage'.
-  * FE 'subrecordOption' shown only for FE.type==subrecord.
-  * FE 'checkPattern' shown only for FE.checkType=='pattern|min%'.
-  * In form 'FormElement' the FE 'formId' removed - not necessary.
-
-* #3568 / Form: fuer alle Buttons (save, close, new, delete) eine optionale class & text konfigurierbar.
-* #3569 / Input Optional '0' unterdruecken.
-* #3863: New config var 'DB_UPDATE' in config.qfq.ini.
-
-Bug Fixes
-^^^^^^^^^
-
-* #3770 / Attack Delay: merge processing to one codeplace. Config.php: new function attackDetectedExitNow(). Sip.php:
-  replace local sleep(PENALTY_TIME_BROKEN_SIP) with central function attackDetectedExitNow().
-* #3768 / log to sql.log: ip, formname, feuser
-* Store.php: Fix problem that an empty SQL_LOG will be added to SYSTEM_PATH_EXT. Logger.php: do nothing if there is no
-  file defined.
-* #3751 / download FE_GROUP protected pages failed. Implement additional 'SHOW_DEBUG_INFO = download' to track down
-  problems with 'session forwarding'.
-* Allow spaces in value when selection <radio> and <select> tags.
-* #3812 / extraButtonInfo (extraButtonLock, extraButtonPassword) - Problems in TemplateGroups.
-* #3832 / Dynamic Update und Radio buttons - leerer value ( '' ) kann nicht angewählt werden
-* #3612 / Konflikt typeAheadLdap mit dynamic modesql: inputs with typeahead lacks 'dynamicUpdate' via 'modeSql'.
-* #3853 / New > Save: Reload des Forms mit neuer SIP und neu erstellter recordId.
-* #3854 / Wrong final page: a) New > Save > Close, b) New > Save > Delete, c) New > New
-  formEditor.sql: update table 'Form.forwardMode' to ('client', 'no', 'url', 'url-skip-history').
-* #2337 / Checkbox: checked/unchecked parameters genügen nicht.
-* #2542 / FormElement-Typ 'note' funktioniert nicht mit dynamic update
-* #3863 / DB Update Fails: Expected no record, got 2 rows: SHOW TABLE STATUS WHERE Name='Form'
-
-Version 0.17.0
---------------
-
-Changes
-^^^^^^^
-
-* ALTER TABLE  `FormElement` ADD  `encode` ENUM(  'none',  'specialchar' ) NOT NULL DEFAULT  'specialchar' AFTER  `subrecordOption` ;
-* UPDATE `FormElement` SET encode='none' WHERE class='native' AND type='editor'
-
-* ALTER TABLE  `Form` ADD  `escapeTypeDefault` ENUM(  '',  's',  'd',  'l',  'L',  'm',  '-' ) NOT NULL DEFAULT  '' AFTER  `permitEdit` ;
-
-* In order to not break functionality of existing forms, it might be necessary (bad for security, good for stability) to
-  leave existing forms untouched: `UPDATE Form SET escapeTypeDefault='-'`
-
-* Play formEditor.sql
-
-Features
-^^^^^^^^
-
-* New security option `escapeTypeDefault`: will be defined 1) sytem wide in config.qfq.ini, or 2) more specific per
-  Form or 3) individually per variable. The later has priority.
-* #3544 / Form: view current form - It's now possible to direct view a form, which is currently loaded/edited in the
-   FormEditor: Button 'eye' near left of button 'save'.
-* #3552 / typeAheadLdapSearchPerToken - webpass kann nicht gleichzeitig nach Vornamen und Nachnamen suchen. Added option
-  typeAheadLdapSearchPerToken to split search value in token and OR-combine every search with the individual tokens.
-* Download latest QFQ builds and releases: https://w3.math.uzh.ch/qfq/.
-* #3218, #3600 / download.php / export: QFQ is now able to create PDFs and ZIPs on the fly. The sources might be
-  uploaded PDFs or Websites (local or remote) which will be converted to PDFs.
-* Implement 'encode=specialchar' - new option per FormElement which is now the default for every FormElement.
-* Sanatize.php: New function urlDecodeArr(). Decode all _GET vars.
-* Implemented max GET parameter lenght. Default: 50.
-* Implemented new escape class 'mysql' (realEscapeString).
-* LICENSE.txt: Add GPLv3
-* Html2Pdf.php: Add SIP support wkhtmltopdf URLs. Move cookies for wkhtmltopdf from commandline arguments to filebased.
-* SessionCookie.php: New class to save current cookies in a file.
-* Html2Pdf.php: implemented session forwarding to wkhtmltopdf.
-* Session.php: introduced close(). This will unlock the current session. Take care on subsequent calls to reopen primary session again.
-* Database.php: Set charset to real_escape_string() functions properly. Proxy for mysqli::real_escape_string()
-* Implement honeypot variables to detect bots.
-* HTML special char encode all URL GET parameter. This can't be skipped.
-
-Bug Fixes
-^^^^^^^^^
-
-* Sip.php: Parameter XDEBUG_SESSUIB_START excluded from GET parameter copied to SIP.
-* Manual.rst: add libxrender1 to install by using wkhtmltopdf.
-* Download.php: Skip 'pdftk' if there is only one PDF file to concatenate.
-* #3615 / download.php: Das Popup schliesst nicht automatisch bei ZIP, im FF, Warnung in der Console, hourglass wobbles.
-* Split PHP 'print.php' in a pure API file 'print.php' and a class 'Html2Pdf.php' - the class will be reused by Download.php
-* #3573 / TypeaheadLdap: Prefetch funktioniert nicht
-* #3547 / FE of type 'note' causes writing of empty fields.
-* #3546 / Throw of a UserFormException with wrong parameter. Fixed.
-* #3545 / Errormessages via API/JSON not displayed
-* #3536 / a) Datum (datetime / timestamp) werden nicht angezeigt, b) Angezeigte Datumsformat String und aktzeptierte Eingabe matchen nicht.
-* #3533 / afterSave: sqlUpdate auf child-record ändert xId von Hauptrecord auf 0
-
-Version 0.16
-------------
-
-Changes
-^^^^^^^
-
-* Play:
-
-    ALTER TABLE `FormElement` ADD INDEX `feIdContainer` (`feIdContainer`);
-    ALTER TABLE `FormElement` ADD INDEX `ord` (`ord`);
-    ALTER TABLE `FormElement` ADD INDEX `feGroup` (`feGroup`);
-
-    ALTER TABLE `FormElement` ADD `adminNote` TEXT NOT NULL AFTER `note`;
-
-* Play formEditor.sql
-
-Features
-^^^^^^^^
-
-* formEditor.sql:
-
-  * Added 'on update current timestamp'.
-  * Add three indexes to formEditor.sql.
-  * Column FormElement.adminNote added.
-  * Change default width on Form for subrecord FormElement.name
-  * Changed input height of 'parameter of FormEditor and FormElementEditor to 8 lines.
-
-* Enlarge placeholder value in FormElement. Old 512, New 2048.
-* #3466 / Input Typeahead: optional only allow specified input. Mode: typeAheadPedantic
-* #3465 / Save button: optional 'active after form load': `Form.parameter.saveButtonActive` - if this attribute is set,
-  the save button will be enabled directly on form load.
-* #3463 / form.mode=readonly. Make a form complete `readonly`. This can be done statically or dynamically via variable (e.g. SIP).
-* #3447 / Icons das man im FrontEnd direkt das gewaehlte FormElement im Formulareditor bearbeiten kann. Add checkbox left
-  to the 'EditForm'-Button, to toogle the 'FormElemnt'-Icons. Like the  'Form Edit'-Pencil, the 'FormElement Checkbox'
-  is only displayed if the user is logged in BE.
-* #3456 / LDAP: with Credentials (e.g. to access 'webpass'). Updated doc for a) config.qfq.ini: LDAP_1_RDN, LDAP_1_PASSWORD,
-  b) Form.parameter|FormElement.parameter: ldapUseBindCredentials
-
-  * ErrorHandler.php: removed details - the end user should not too many details.
-  * FormAction.php, Ldap.php, QuickFormQuery.php: implement 'ldapUseBindCredentials'
-  * Ldap.php: set_error_handler() to catch ldap_bind() problems. Always set LDAP_OPT_PROTOCOL_VERSION=3 - this might cause problems with som LDAP Servers - we will see.
-
-
-Bug Fixes
-^^^^^^^^^
-
-* 3509 / SELECT Element: value wird nicht selektiert
-* 3502 / TemplateGroups: Checkboxen werden beim ersten Speichern (insert) nicht geschrieben - ein anschliessendes Update
-  ist ok
-* 3385 / templateGroup: insert/update/delete non primary records
-
-  * Non primary record leads to a problem that the default values, given as an array, are not replaced by scalar values. fixed.
-  * Update doc how to insert/update/delete non primary templateGroup records.
-  * Removed $templateGroupIndex - solved implicit by defining a LIMIT on 'slaveId' . Implemented '%D' (one below %d). Implemented FE_SQL_HONOR_FORM_ELEMENTS - reduces unecassary SQL queries.
-  * Fill STORE_RECORD during Formload - to read templateGroup records very early. Local copy of `getNativeFormElements()`, new `explodeTemplateGroupElements()`
-
-* TypeAhead.js: Handle <ENTER> key properly.
-* #3462 / FormElement.parameter: requiredList not ok for non numeric content. STORE_FORM had been called without 'sanatize class'.
-   Therefore, all non numeric values has been sanatized by default. New: SANATIZE_ALLOW_ALL.
-* Corrected error message to use 'itemList' instead of 'itemValues'. Renamed constant too.
-* #2542 / FormElement-Typ 'note' funktioniert nicht mit dynamic update. 'Label' and 'note' are fixed - 'value' is still not updated, open.
-
-Version 0.15
-------------
-
-Changes
-^^^^^^^
-
- * Play formEditor.sql.
-
-   * Form 'FormElement' failed to display the formtitle of the current form in case of a new FE.
-   * Updated subrecord in 'Form' for 'FormElements' - columns 'size' and 'sql1' removed and 'dyn' inserted. Play formEditor.sql.
-
-   *  #3431, Parameter keyword 'typeAheadLdapKeyPrintf' changed to 'typeAheadLdapIdPrintf'.::
-
-        UPDATE FormElement SET parameter = REPLACE(parameter, 'typeAheadLdapKeyPrintf', 'typeAheadLdapIdPrintf')
-
-   * Size 'placeholder' increased::
-
-        ALTER TABLE  `FormElement` CHANGE  `placeholder`  `placeholder` VARCHAR( 2048 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT  '';
-
-Features
-^^^^^^^^
-
- * Introduce new config.qfq.ini setting 'EDIT_FORM_PAGE' - by default set to 'form' - the wrench symbol on every Form
-   will direct to that page. Fix #3420 / Quicklink 'editform' on form: directs to the current T3 page which might be insufficient.
- * Form 'subrecord' columns: the default width limit of 20 chars are disabled if 'nostrip' is specifed.
- * #3431 / typeAheadSql: columnname 'key' is a reserverd SQL statement - replace by 'id'. Additional the parametername
-   'typeAheadLdapKeyPrintf' renamed to 'typeAheadLdapIdPrintf'. By using 'id' instead of 'key' the quoting of the columnname
-   is not necessary anoymore.
-
-
-
-Bug Fixes
-^^^^^^^^^
-
- * Fix #3419 / typeAheadSql: Array with only one column or non standard columnnames are not handeld properbly.
-   Detection of missing LIMIT implemented.
- * #3425 / Form.parameter, FormElement.parameter: comment handling, trailing & leading spaces
-    Manual.rst: commented handling of 'comment character' and 'escaping of leading/trailing spaces'
-    Support.php: new funtion handleEscapeSpaceComment().
- * Evaluate.php: parse all F|FE.parameter via handleEscapeSpaceComment(). A leading '#' or ' ' might be escaped by '\'.
- * Saving 'extra' FE in STORE_SIP has been done with inappropiate FE_NAME. Correct is the pure FE_NAME, without any
-   extension like recordId. Unessary and broken decoding removed.
- * #3426 | Dynamic Update: Inputs loose the new content and shows the old value
- * Through fix #2064 the FE.checkType has not been used anymore. This is fixed now.
- * #3433 | templateGroup on primary Record: Values of removed copies are not deleted. The new implementation creates empty
-   fake instances of all copies of templateGroup FormElements. Those are empty. Before save, the submitted form values
-   will be expanded with the empty fake templateGroup FormElements and such empty values will be saved.
-
-
-Version 0.14
-------------
-
-Changes
-^^^^^^^
-
- * Play formEditor.sql.
-
-   * All Form & FormEditor input elements now have a maxlength definition of 0, which means take the column definition value.
-   * Drop-down list of container assignment:
-
-     * Display 'type' ('pill', 'fieldset', 'templategroup') instead of 'class' (always 'container').
-     * Display 'name' (internal name) instead of 'label' (shown on the website and might not so usefull as 'name' which is nowhere else used than in that drop-down.
-
-   * FormElement.placeholder colum width extended to 512:
-
-     ALTER TABLE `FormElement` CHANGE `placeholder` `placeholder` VARCHAR(512) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''
-
- * New class Ldap.php.
-
-Features
-^^^^^^^^
-
- * Typeahead for SQL and LDAP Datasources implemented.
- * formEditor.sql: Changed width of column FormElement.placeholder from 255 to 512. Removed hardcoded 'size' in FormElement 'placeholder'.
- * Character Count: Display a `counter` on input or textarea fields, activated by specifying the formElement.parameter 'characterCountWrap'.
- * Evaluate.php: Two new escape options 'l' and 'L'. Backport of ldap_escape() for PHP <5.6. Multiple escaping for one value now possible.
- * Manual.rst: add some example for TypeAhead and for saving LDAP value.
- * Load foreign values in templatGroups - saving is not implemented yet.
- * Manual: Added howto prevent <p>-wrap in TinyMCE
- * TemplateGroup: Add button now disabled if max. number of copies reached.
- * #3414/QuickFormQuery.php: wrap whole form in 'col-md-XX' - User controls the width of an QFQ form.
-
-Bug Fixes
-^^^^^^^^^
-
- * Dynamic Update has been broken since implementing of 'element-update' (#3180). Now both methods, 'element-update' and 'form-update' should be fine.
- * qfq-bs.css.less: Fixed problem with 'typeahead input elements' not expanded to Bootstrap column width. Changed
-   Layout/Design Typeahead drop-down box. Add hoover for the drop-down box with a blue background
- * AbstractBuildForm.php: #3374 - textarea elements now contains 'maxlength' attribute.
- * BuildFormBootstrap.php: wrapping of optional 'submitButtonText' now done with the 'per form' values.
- * typeahead.php: if there is an exception, the message body is sent as regular 'content' for the drop-down box. At the
-   moment this is the only way to transmit any error messages.
- * formEditor.sql: removed all 'maxLength' string values for 'Form' and 'FormElement' forms.
- * Save button becomes active if a templateGroup copy is removed.
- * #3413 Form ohne Pill hat kein padding am Rand. Fix: if there are no pills, an additinal col-md-12 will be rendered.
-
-
-Version 0.13
-------------
-
-Changes
-^^^^^^^
-
- * Play formEditor.sql.
- * formEditor.sql:
-
-   * Checktype of `Form.name` restricted to `alnumx` (prior `all`).
-   * Changed `access` for Form `form` & '`ormElement` from `always` to `sip`.
-
- * Table `FormElement`
-
-   * Modified column: `checkType` - new value `numerical`
-
-     ALTER TABLE FormElement MODIFY COLUMN checkType ENUM('alnumx','digit','numerical','email','min|max','min|max date',
-       'pattern','allbut','all') NOT NULL DEFAULT 'alnumx'
-
- * Example Report for `forms` extended by a delete button per row.
-
-Features
-^^^^^^^^
-
- * print.php: offers 'print page' for any local page - create a PDF on the fly (printout is then browser independent).
-
-   * Install `wkhtmltopdf` on the webserver (http://wkhtmltopdf.org/).
-   * In config.qfq.ini setup:
-
-        BASE_URL_PRINT=http://www.../
-        WKHTMLTOPDF=/opt/wkhtmltox/bin/wkhtmltopdf
-
- * Check and error report if 'php_intl' is missing.
- * New Checktype 'allow numerical'.
- * Documentation: example for 'radio' with no pre selection.
- * #3063, Radios and checkboxes optional rendered in Bootstrap layout.
- * Added 'help-box with-errors'-DIV after radios and checkboxes.
- * Respect attribute `data-class-on-change` on save buttons.
-
-
-Bug Fixes
-^^^^^^^^^
-
- * #2138 / digit sanitize: new class 'numerical' implemented.
- * Fixed recursive thrown exception.
- * #2064 / search of a default value for a non existing tablecolumn returns 'false'.
-
-   * Fixed setting of STORE_SYSTEM / showDebugInfo during API call.
-
- * #2081, #3180 Form: Label & note - update via `DynamicUpdate`
- * #3253, if there is no STORE_TYPO3 (calls through .../api/ like save, delete, load): use SIP / CLIENT_TYPO3VARS.
- * qfq-bs.css:
-
-   * Alignment of checkboxes and radios optimized.
-   * CSS class 'qfq-note' for 'notes' (third column in a form).
-
-
-Version 0.12
-------------
-
-Changes
-^^^^^^^
-
- * Table 'FormElement'
-   * New column: rowLabelInputNote
-
-      ALTER TABLE  `FormElement` ADD `rowLabelInputNote` set('row','label','/label','input','/input','note','/note','/row')
-      NOT NULL DEFAULT 'row,label,/label,input,/input,note,/note,/row' AFTER  `bsNoteColumns` ;
-
-   * Modified column: 'type' - new value 'templateGroup'
-
-      ALTER TABLE  `FormElement` CHANGE  `type`  `type` ENUM(  'checkbox',  'date',  'datetime',  'dateJQW',  'datetimeJQW',  'extra',
-      'gridJQW',  'text',  'editor',  'time',  'note',  'password',  'radio',  'select',  'subrecord',  'upload',  'fieldset', 'pill',
-      'templateGroup',  'beforeLoad',  'beforeSave',  'beforeInsert',  'beforeUpdate',  'beforeDelete',  'afterLoad',  'afterSave',
-      'afterInsert',  'afterUpdate',  'afterDelete',  'sendMail' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT  'text'
-
- * formEditor.sql: Added HTML 'placeholder' in FormEditor for bs*Columns.
-
-   * PLAY 'formEditor.sql'.
-
- * User Input will be UTF8 normalized.
-
-   * INSTALL 'php5-intl' or 'php7.0-intl' on Webserver.
-
- * Add globalize.js to be included. Needed by jqx-all.js
-
-   * UPDATE EXISTING TypoScript TEMPLATES of QFQ Installation.
-
- * Name of variable '_filename' (used in field 'parameter') has changed. Old: '_filename', New: 'filename'
-
-   * UPDATE `FormElement` SET parameter = REPLACE(parameter, "_filename", "filename")
-
-
-Features
-^^^^^^^^
-
- * User input will be UTF8 normalized
- * config.qfq-ini:
-   * New configuration values: FORM_BS_LABEL_COLUMNS / FORM_BS_INPUT_COLUMNS / FORM_BS_NOTE_COLUMNS
-   * Comment empty variables - the new default setting is, that empty parameter in config.qfq.ini means EMPTY (=parameter is set and will not be overwritten by internal default), not UNDEFINED (overwritten by internal default).
- * FileUpload:
-   * Implemented new Formelement.parameter: fileReplace=always - will replace existing files.
-   * Multiple / Advanced Upload: new logic implements slaveId, sqlInsert, sqlUpdate, sqlDelete.
- * FormElement.parameter: sqlBefore / sqlAfter fired during 'Form' save for action elements.
- * STORE FORM: variable 'filename' moved to STORE VAR - sanatize class needs no longer specified.
- * STORE VAR: two new variables 'filename' and 'fileDestination' valid during processing of current upload FormElement.
- * Default store priority list changed. Old: 'FSRD', New: 'FSRVD'.
- * CODING.md: update doc for FormElement 'upload' and general 'Form' rendering & save (recursive rendering).
- * User manual:
-   * Described form layout options: description for bsLabelColumn, bsInputColumn, bsNoteColumn
-   * Update 'file-upload' doc.
-   * Described 3 examples for upload forms.
- * Administrator manual:
-   * Add description page.meta...
- * New FormElement (type= 'container') added: 'templateGroup'
-   * FormElement.parameter.tgAddClass | tgAddText | tgRemoveClass | tgRemoveText | tgClass
-   * FormElement.maxSize: max number of duplicates
-   * #3230 templateGroup: margin between copies. 'tgClass' implemented.
- * Native FormElements:
-   * FormElement.parameter.htlmlBefore|htmlAfter - add the specified HTML code before or after the element (outside of any wrapping)
-   * #3224, #3231 Html Tag <hr> als FormElement. >> htmlBefore | htmlAfter.
-   * FormElement.parameter.wrapLabel | wrapInput | wrapAfter | wrapRow - if specified, any default wrapping is omitted.
-   * FormElement.bsNoteColumns | bsInputColumns | bsNoteColumns - a '0' will suppress the whole rendering of the item.
-   * FormElement.rowLabelInputNote - switch on/off rendering of the corresponding system wrapping items.
- * #3232 Define custom 'on-change' color - used for the save button: Form.parameter.buttonOnChangeClass=...
- * Form.parameter & FormElement.parameter: Lines starting with '#' are treated as comments and will not be parsed.
-
-Bug fixes
-^^^^^^^^^
-
- * User manual:
-   * Fixed double include of validator.js in T3 Typoscript template example.
-   * Fixed wrong store name SYSTEM: S > Y
-   * Fixed wrong STORE_FORM variable names.
-   * Reformat FormElement.parameter description.
-   * Styling errors fixed.
- * Use of 'decryptCurlyBraces()' to get better error messages.
- * Skip unwanted parameter expansion during save.
- * Fixed bug with uninitialized FE_SLAVE_ID
- * formEditor.sql:
-   * The defintion as 'editor' (not text) for FormElement 'note' has been lost - reinserted.
-   * Fixed problem while playing SQL query - deleting old FormElements of Formeditor deleted also FormElements of other forms.
- * #3066 / help-text with-error - CSS class 'hidden' will be rendered by default (as long there is no error).
- * Labels are skipped, if FormElement.bsLabelColumns=0.
- * Respect attribute `data-class-on-change` on save buttons.
-
-Version 0.11
-------------
-
-Features
-^^^^^^^^
-
- * Added STORE_BEFORE, #3146 - Mainly used to compare old and new values during a form 'save' action.
- * Added 'best practice' for defining and using of 'Central configure values' in UserManual.
- * Added accent characters to sanatize class 'alnumx', #3183.
- * Set default all QFQ send mails to 'auto-submit'.
- * Added possibility to customize error messages ('data-pattern-error', 'data-rquired-error', 'data-match-error',
-   'data-error') if validation fails. Customization can be done on global level (config.qfq.ini), per Form or per FormElement.
- * *FormElement*: Double an input element and validate that the input match: FormElement.parameter.retype=1
- * Autofocus in Forms is now supported. By default the first Input Element receives the focus. Can be customized.
- * Added a timestamp in shown exceptions. Usefull for screenshots, send by customer, to find the problem in SQL logfiles.
-
-Bug fixes
-^^^^^^^^^
-
- * Fixed missing docutmentation for FormElement 'note'.
- * Failed SQL queries will now always be logged, even if they do not modify some data.
-
-Version 0.10
-------------
-
-Features
-^^^^^^^^
-
- * Implemented Parameter 'extraDeleteForm' for 'forms' and 'subrecords'. Update doc.
-
-Bug fixes
-^^^^^^^^^
-
- * Suppress rendering of form title during a 'delete' call. No one will see it and required parameters are not supplied.
- * In case of broken SQL queries, print them in ajax error message.
- * Remove parameter 'table' from Delete SIP URLs. ToolTip updated.
-
-Version 0.9
------------
-
-Features
-^^^^^^^^
-
- * FormEditor:
-   * design update - new default background color: grey.
-   * per form configureable background colors.
-   * Optional right align of all form element labels.
-   * Added config.qfq.ini values CSS_CLASS_QFQ_FORM_PILL, CSS_CLASS_QFQ_FORM_BODY, CSS_CLASS_QFQ_CONTAINER.
-
-Bug fixes
-^^^^^^^^^
-
- * BuildFormBootstrap.php: added new class name 'qfq-label' to form labels - needed to assign 'qfq-form-right' class. Changed wrapping of formelements from 'col-md-8' (wrong) to 'col-md-12'.
- * QuickFormQuery.php: Set default for new F_CLASS_PILL & F_CLASS_BODY.
- * formEditor.sql: New default background color for formElements is blue.
- * qfq-bs.css.less: add classes qfq-form-pill, qfq-form-body, form-group (center), qfq-color-..., qfq-form-right.
- * Index.rst: Add note to hierachy chars. Fixed uncomplete doc to a) bs*Columns, showButton. Add classPill, classBody. Rewrote form.paramter.class.
- * QuickFormQuery.php: Button save/ close/ delete/ new - align to right border of form.
- * UsersManual/index.rst: renamed chapter for formelements. Cleanup formelement types. Wrote chapter 'Detailed concept'.
- * QuickFormQuery.php, FormAction.php: '#2931 / afterSave Hauptrecord xId nicht direkt verfügbar' - load master record again, after 'action'-elements has been processed.
- * UsersManual/index.rst: Startet FAQ section.
- * config.qfq.example.ini: Added comment where to save config.qfq.ini.
- * UsersManual/index.rst: Rewrite of 'action'-FormElement definition.
- * #2739: beforeDelete / afterDelete.
- * PROTOCOL.md: update 'delete' description.
- * delete.php: fixed unwanted loose of MSG_CONTENT.
- * Report.php: Fixed double '&&' in building UrlParam.
- * FormAction.php: In case of 'AFTER_DELETE', do not try to load primary record - that one is already deleted.
- * Sip.php: Do not skip SIP_TARGET_URL as parameter for the SIP.
- * #3001 Report: delete implementieren.
- * Index.rst, Constants.php: reverted parameter '_table' in delete links back to 'table' - Reason: 'form' needs to be 'form' (instead of '_form') due to many used places already.
- * Sip.php: move SIP_TARGET_URL back to stored inside SIP - it's necessary for 'delete'-links.
- * Report.php, Constants.php: Remove code to handle unecessary 'p:' tag for delete links.
- * Link.php: Check paged / Paged that the parameter r, table and form are given in the right combination.
- * Link.php, Report.php: New '_link' token 'x'. '_paged' and '_Paged' are rendered via Link() class, Link() class now supports delete links.
- * QuickFormQuery.php: for modeForm='Form Delete' the 'required param' are not respected - this makes sense, cause these parameters typically filled in newly created records.
- * Fixed: #3076 Delete Button bei Subrecords erzeugt sporadisch Javascript Exceptions (Webkit: Chrome / Vivaldi) - kein loeschen moeglich.
diff --git a/extension/Documentation/html/_static/ajax-loader.gif b/extension/Documentation/html/_static/ajax-loader.gif
deleted file mode 100644
index 61faf8cab23993bd3e1560bff0668bd628642330..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 673
zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl
zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW
zW@C<Bcm5fi^2`=a=CI<BoWt%nBaPE_qv4@lA~O$e(@QvVsPKYrw1nl|W$cy`JnUZC
z&pm)ff{kWGHpc{Hj$e<Wf^-Yd?hVhnTne26LlO)n6%u@0qor2V$ZRdW|29#Ay+Pr+
z#G^K6$xW&%T0&5Rn2-%J<Je`StbNMy#Dp_b!t~i%lV$k6Ncw&BbV{7Dx<KXw*O|?G
zWsa@TW{P|({)e&oFu&2t6sh_9S)fKSBO3+uTav2wDWkTDZ{~!>w{|b%Y*pl8F?4B9
zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg
z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S
z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN
zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI
yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN

diff --git a/extension/Documentation/html/_static/basic.css b/extension/Documentation/html/_static/basic.css
deleted file mode 100644
index dc88b5a2d..000000000
--- a/extension/Documentation/html/_static/basic.css
+++ /dev/null
@@ -1,632 +0,0 @@
-/*
- * basic.css
- * ~~~~~~~~~
- *
- * Sphinx stylesheet -- basic theme.
- *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-/* -- main layout ----------------------------------------------------------- */
-
-div.clearer {
-    clear: both;
-}
-
-/* -- relbar ---------------------------------------------------------------- */
-
-div.related {
-    width: 100%;
-    font-size: 90%;
-}
-
-div.related h3 {
-    display: none;
-}
-
-div.related ul {
-    margin: 0;
-    padding: 0 0 0 10px;
-    list-style: none;
-}
-
-div.related li {
-    display: inline;
-}
-
-div.related li.right {
-    float: right;
-    margin-right: 5px;
-}
-
-/* -- sidebar --------------------------------------------------------------- */
-
-div.sphinxsidebarwrapper {
-    padding: 10px 5px 0 10px;
-}
-
-div.sphinxsidebar {
-    float: left;
-    width: 230px;
-    margin-left: -100%;
-    font-size: 90%;
-    word-wrap: break-word;
-    overflow-wrap : break-word;
-}
-
-div.sphinxsidebar ul {
-    list-style: none;
-}
-
-div.sphinxsidebar ul ul,
-div.sphinxsidebar ul.want-points {
-    margin-left: 20px;
-    list-style: square;
-}
-
-div.sphinxsidebar ul ul {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-div.sphinxsidebar form {
-    margin-top: 10px;
-}
-
-div.sphinxsidebar input {
-    border: 1px solid #98dbcc;
-    font-family: sans-serif;
-    font-size: 1em;
-}
-
-div.sphinxsidebar #searchbox input[type="text"] {
-    width: 170px;
-}
-
-img {
-    border: 0;
-    max-width: 100%;
-}
-
-/* -- search page ----------------------------------------------------------- */
-
-ul.search {
-    margin: 10px 0 0 20px;
-    padding: 0;
-}
-
-ul.search li {
-    padding: 5px 0 5px 20px;
-    background-image: url(file.png);
-    background-repeat: no-repeat;
-    background-position: 0 7px;
-}
-
-ul.search li a {
-    font-weight: bold;
-}
-
-ul.search li div.context {
-    color: #888;
-    margin: 2px 0 0 30px;
-    text-align: left;
-}
-
-ul.keywordmatches li.goodmatch a {
-    font-weight: bold;
-}
-
-/* -- index page ------------------------------------------------------------ */
-
-table.contentstable {
-    width: 90%;
-    margin-left: auto;
-    margin-right: auto;
-}
-
-table.contentstable p.biglink {
-    line-height: 150%;
-}
-
-a.biglink {
-    font-size: 1.3em;
-}
-
-span.linkdescr {
-    font-style: italic;
-    padding-top: 5px;
-    font-size: 90%;
-}
-
-/* -- general index --------------------------------------------------------- */
-
-table.indextable {
-    width: 100%;
-}
-
-table.indextable td {
-    text-align: left;
-    vertical-align: top;
-}
-
-table.indextable ul {
-    margin-top: 0;
-    margin-bottom: 0;
-    list-style-type: none;
-}
-
-table.indextable > tbody > tr > td > ul {
-    padding-left: 0em;
-}
-
-table.indextable tr.pcap {
-    height: 10px;
-}
-
-table.indextable tr.cap {
-    margin-top: 10px;
-    background-color: #f2f2f2;
-}
-
-img.toggler {
-    margin-right: 3px;
-    margin-top: 3px;
-    cursor: pointer;
-}
-
-div.modindex-jumpbox {
-    border-top: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-    margin: 1em 0 1em 0;
-    padding: 0.4em;
-}
-
-div.genindex-jumpbox {
-    border-top: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-    margin: 1em 0 1em 0;
-    padding: 0.4em;
-}
-
-/* -- domain module index --------------------------------------------------- */
-
-table.modindextable td {
-    padding: 2px;
-    border-collapse: collapse;
-}
-
-/* -- general body styles --------------------------------------------------- */
-
-div.body p, div.body dd, div.body li, div.body blockquote {
-    -moz-hyphens: auto;
-    -ms-hyphens: auto;
-    -webkit-hyphens: auto;
-    hyphens: auto;
-}
-
-a.headerlink {
-    visibility: hidden;
-}
-
-h1:hover > a.headerlink,
-h2:hover > a.headerlink,
-h3:hover > a.headerlink,
-h4:hover > a.headerlink,
-h5:hover > a.headerlink,
-h6:hover > a.headerlink,
-dt:hover > a.headerlink,
-caption:hover > a.headerlink,
-p.caption:hover > a.headerlink,
-div.code-block-caption:hover > a.headerlink {
-    visibility: visible;
-}
-
-div.body p.caption {
-    text-align: inherit;
-}
-
-div.body td {
-    text-align: left;
-}
-
-.first {
-    margin-top: 0 !important;
-}
-
-p.rubric {
-    margin-top: 30px;
-    font-weight: bold;
-}
-
-img.align-left, .figure.align-left, object.align-left {
-    clear: left;
-    float: left;
-    margin-right: 1em;
-}
-
-img.align-right, .figure.align-right, object.align-right {
-    clear: right;
-    float: right;
-    margin-left: 1em;
-}
-
-img.align-center, .figure.align-center, object.align-center {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.align-left {
-    text-align: left;
-}
-
-.align-center {
-    text-align: center;
-}
-
-.align-right {
-    text-align: right;
-}
-
-/* -- sidebars -------------------------------------------------------------- */
-
-div.sidebar {
-    margin: 0 0 0.5em 1em;
-    border: 1px solid #ddb;
-    padding: 7px 7px 0 7px;
-    background-color: #ffe;
-    width: 40%;
-    float: right;
-}
-
-p.sidebar-title {
-    font-weight: bold;
-}
-
-/* -- topics ---------------------------------------------------------------- */
-
-div.topic {
-    border: 1px solid #ccc;
-    padding: 7px 7px 0 7px;
-    margin: 10px 0 10px 0;
-}
-
-p.topic-title {
-    font-size: 1.1em;
-    font-weight: bold;
-    margin-top: 10px;
-}
-
-/* -- admonitions ----------------------------------------------------------- */
-
-div.admonition {
-    margin-top: 10px;
-    margin-bottom: 10px;
-    padding: 7px;
-}
-
-div.admonition dt {
-    font-weight: bold;
-}
-
-div.admonition dl {
-    margin-bottom: 0;
-}
-
-p.admonition-title {
-    margin: 0px 10px 5px 0px;
-    font-weight: bold;
-}
-
-div.body p.centered {
-    text-align: center;
-    margin-top: 25px;
-}
-
-/* -- tables ---------------------------------------------------------------- */
-
-table.docutils {
-    border: 0;
-    border-collapse: collapse;
-}
-
-table caption span.caption-number {
-    font-style: italic;
-}
-
-table caption span.caption-text {
-}
-
-table.docutils td, table.docutils th {
-    padding: 1px 8px 1px 5px;
-    border-top: 0;
-    border-left: 0;
-    border-right: 0;
-    border-bottom: 1px solid #aaa;
-}
-
-table.footnote td, table.footnote th {
-    border: 0 !important;
-}
-
-th {
-    text-align: left;
-    padding-right: 5px;
-}
-
-table.citation {
-    border-left: solid 1px gray;
-    margin-left: 1px;
-}
-
-table.citation td {
-    border-bottom: none;
-}
-
-/* -- figures --------------------------------------------------------------- */
-
-div.figure {
-    margin: 0.5em;
-    padding: 0.5em;
-}
-
-div.figure p.caption {
-    padding: 0.3em;
-}
-
-div.figure p.caption span.caption-number {
-    font-style: italic;
-}
-
-div.figure p.caption span.caption-text {
-}
-
-/* -- field list styles ----------------------------------------------------- */
-
-table.field-list td, table.field-list th {
-    border: 0 !important;
-}
-
-.field-list ul {
-    margin: 0;
-    padding-left: 1em;
-}
-
-.field-list p {
-    margin: 0;
-}
-
-/* -- other body styles ----------------------------------------------------- */
-
-ol.arabic {
-    list-style: decimal;
-}
-
-ol.loweralpha {
-    list-style: lower-alpha;
-}
-
-ol.upperalpha {
-    list-style: upper-alpha;
-}
-
-ol.lowerroman {
-    list-style: lower-roman;
-}
-
-ol.upperroman {
-    list-style: upper-roman;
-}
-
-dl {
-    margin-bottom: 15px;
-}
-
-dd p {
-    margin-top: 0px;
-}
-
-dd ul, dd table {
-    margin-bottom: 10px;
-}
-
-dd {
-    margin-top: 3px;
-    margin-bottom: 10px;
-    margin-left: 30px;
-}
-
-dt:target, .highlighted {
-    background-color: #fbe54e;
-}
-
-dl.glossary dt {
-    font-weight: bold;
-    font-size: 1.1em;
-}
-
-.optional {
-    font-size: 1.3em;
-}
-
-.sig-paren {
-    font-size: larger;
-}
-
-.versionmodified {
-    font-style: italic;
-}
-
-.system-message {
-    background-color: #fda;
-    padding: 5px;
-    border: 3px solid red;
-}
-
-.footnote:target  {
-    background-color: #ffa;
-}
-
-.line-block {
-    display: block;
-    margin-top: 1em;
-    margin-bottom: 1em;
-}
-
-.line-block .line-block {
-    margin-top: 0;
-    margin-bottom: 0;
-    margin-left: 1.5em;
-}
-
-.guilabel, .menuselection {
-    font-family: sans-serif;
-}
-
-.accelerator {
-    text-decoration: underline;
-}
-
-.classifier {
-    font-style: oblique;
-}
-
-abbr, acronym {
-    border-bottom: dotted 1px;
-    cursor: help;
-}
-
-/* -- code displays --------------------------------------------------------- */
-
-pre {
-    overflow: auto;
-    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
-}
-
-span.pre {
-    -moz-hyphens: none;
-    -ms-hyphens: none;
-    -webkit-hyphens: none;
-    hyphens: none;
-}
-
-td.linenos pre {
-    padding: 5px 0px;
-    border: 0;
-    background-color: transparent;
-    color: #aaa;
-}
-
-table.highlighttable {
-    margin-left: 0.5em;
-}
-
-table.highlighttable td {
-    padding: 0 0.5em 0 0.5em;
-}
-
-div.code-block-caption {
-    padding: 2px 5px;
-    font-size: small;
-}
-
-div.code-block-caption code {
-    background-color: transparent;
-}
-
-div.code-block-caption + div > div.highlight > pre {
-    margin-top: 0;
-}
-
-div.code-block-caption span.caption-number {
-    padding: 0.1em 0.3em;
-    font-style: italic;
-}
-
-div.code-block-caption span.caption-text {
-}
-
-div.literal-block-wrapper {
-    padding: 1em 1em 0;
-}
-
-div.literal-block-wrapper div.highlight {
-    margin: 0;
-}
-
-code.descname {
-    background-color: transparent;
-    font-weight: bold;
-    font-size: 1.2em;
-}
-
-code.descclassname {
-    background-color: transparent;
-}
-
-code.xref, a code {
-    background-color: transparent;
-    font-weight: bold;
-}
-
-h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
-    background-color: transparent;
-}
-
-.viewcode-link {
-    float: right;
-}
-
-.viewcode-back {
-    float: right;
-    font-family: sans-serif;
-}
-
-div.viewcode-block:target {
-    margin: -1px -10px;
-    padding: 0 10px;
-}
-
-/* -- math display ---------------------------------------------------------- */
-
-img.math {
-    vertical-align: middle;
-}
-
-div.body div.math p {
-    text-align: center;
-}
-
-span.eqno {
-    float: right;
-}
-
-span.eqno a.headerlink {
-    position: relative;
-    left: 0px;
-    z-index: 1;
-}
-
-div.math:hover a.headerlink {
-    visibility: visible;
-}
-
-/* -- printout stylesheet --------------------------------------------------- */
-
-@media print {
-    div.document,
-    div.documentwrapper,
-    div.bodywrapper {
-        margin: 0 !important;
-        width: 100%;
-    }
-
-    div.sphinxsidebar,
-    div.related,
-    div.footer,
-    #top-link {
-        display: none;
-    }
-}
\ No newline at end of file
diff --git a/extension/Documentation/html/_static/classic.css b/extension/Documentation/html/_static/classic.css
deleted file mode 100644
index 22fa0bde7..000000000
--- a/extension/Documentation/html/_static/classic.css
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * classic.css_t
- * ~~~~~~~~~~~~~
- *
- * Sphinx stylesheet -- classic theme.
- *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-@import url("basic.css");
-
-/* -- page layout ----------------------------------------------------------- */
-
-body {
-    font-family: sans-serif;
-    font-size: 100%;
-    background-color: #11303d;
-    color: #000;
-    margin: 0;
-    padding: 0;
-}
-
-div.document {
-    background-color: #1c4e63;
-}
-
-div.documentwrapper {
-    float: left;
-    width: 100%;
-}
-
-div.bodywrapper {
-    margin: 0 0 0 230px;
-}
-
-div.body {
-    background-color: #ffffff;
-    color: #000000;
-    padding: 0 20px 30px 20px;
-}
-
-div.footer {
-    color: #ffffff;
-    width: 100%;
-    padding: 9px 0 9px 0;
-    text-align: center;
-    font-size: 75%;
-}
-
-div.footer a {
-    color: #ffffff;
-    text-decoration: underline;
-}
-
-div.related {
-    background-color: #133f52;
-    line-height: 30px;
-    color: #ffffff;
-}
-
-div.related a {
-    color: #ffffff;
-}
-
-div.sphinxsidebar {
-}
-
-div.sphinxsidebar h3 {
-    font-family: 'Trebuchet MS', sans-serif;
-    color: #ffffff;
-    font-size: 1.4em;
-    font-weight: normal;
-    margin: 0;
-    padding: 0;
-}
-
-div.sphinxsidebar h3 a {
-    color: #ffffff;
-}
-
-div.sphinxsidebar h4 {
-    font-family: 'Trebuchet MS', sans-serif;
-    color: #ffffff;
-    font-size: 1.3em;
-    font-weight: normal;
-    margin: 5px 0 0 0;
-    padding: 0;
-}
-
-div.sphinxsidebar p {
-    color: #ffffff;
-}
-
-div.sphinxsidebar p.topless {
-    margin: 5px 10px 10px 10px;
-}
-
-div.sphinxsidebar ul {
-    margin: 10px;
-    padding: 0;
-    color: #ffffff;
-}
-
-div.sphinxsidebar a {
-    color: #98dbcc;
-}
-
-div.sphinxsidebar input {
-    border: 1px solid #98dbcc;
-    font-family: sans-serif;
-    font-size: 1em;
-}
-
-
-
-/* -- hyperlink styles ------------------------------------------------------ */
-
-a {
-    color: #355f7c;
-    text-decoration: none;
-}
-
-a:visited {
-    color: #355f7c;
-    text-decoration: none;
-}
-
-a:hover {
-    text-decoration: underline;
-}
-
-
-
-/* -- body styles ----------------------------------------------------------- */
-
-div.body h1,
-div.body h2,
-div.body h3,
-div.body h4,
-div.body h5,
-div.body h6 {
-    font-family: 'Trebuchet MS', sans-serif;
-    background-color: #f2f2f2;
-    font-weight: normal;
-    color: #20435c;
-    border-bottom: 1px solid #ccc;
-    margin: 20px -20px 10px -20px;
-    padding: 3px 0 3px 10px;
-}
-
-div.body h1 { margin-top: 0; font-size: 200%; }
-div.body h2 { font-size: 160%; }
-div.body h3 { font-size: 140%; }
-div.body h4 { font-size: 120%; }
-div.body h5 { font-size: 110%; }
-div.body h6 { font-size: 100%; }
-
-a.headerlink {
-    color: #c60f0f;
-    font-size: 0.8em;
-    padding: 0 4px 0 4px;
-    text-decoration: none;
-}
-
-a.headerlink:hover {
-    background-color: #c60f0f;
-    color: white;
-}
-
-div.body p, div.body dd, div.body li, div.body blockquote {
-    text-align: justify;
-    line-height: 130%;
-}
-
-div.admonition p.admonition-title + p {
-    display: inline;
-}
-
-div.admonition p {
-    margin-bottom: 5px;
-}
-
-div.admonition pre {
-    margin-bottom: 5px;
-}
-
-div.admonition ul, div.admonition ol {
-    margin-bottom: 5px;
-}
-
-div.note {
-    background-color: #eee;
-    border: 1px solid #ccc;
-}
-
-div.seealso {
-    background-color: #ffc;
-    border: 1px solid #ff6;
-}
-
-div.topic {
-    background-color: #eee;
-}
-
-div.warning {
-    background-color: #ffe4e4;
-    border: 1px solid #f66;
-}
-
-p.admonition-title {
-    display: inline;
-}
-
-p.admonition-title:after {
-    content: ":";
-}
-
-pre {
-    padding: 5px;
-    background-color: #eeffcc;
-    color: #333333;
-    line-height: 120%;
-    border: 1px solid #ac9;
-    border-left: none;
-    border-right: none;
-}
-
-code {
-    background-color: #ecf0f3;
-    padding: 0 1px 0 1px;
-    font-size: 0.95em;
-}
-
-th {
-    background-color: #ede;
-}
-
-.warning code {
-    background: #efc2c2;
-}
-
-.note code {
-    background: #d6d6d6;
-}
-
-.viewcode-back {
-    font-family: sans-serif;
-}
-
-div.viewcode-block:target {
-    background-color: #f4debf;
-    border-top: 1px solid #ac9;
-    border-bottom: 1px solid #ac9;
-}
-
-div.code-block-caption {
-    color: #efefef;
-    background-color: #1c4e63;
-}
\ No newline at end of file
diff --git a/extension/Documentation/html/_static/comment-bright.png b/extension/Documentation/html/_static/comment-bright.png
deleted file mode 100644
index 15e27edb12ac25701ac0ac21b97b52bb4e45415e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 756
zcmV<Q0t@|#P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008JNkl<Zcmaiz
z1Hj}w5Qg8Gq}}~(+qP}nwsE#?+qP}nwr!&y+D+z~J^P8B5f1Z2p}9E7<MeddjkkYX
zd-EIb)!Fph8#Oll|7xX;pFUA;-4hpnGx`#oio0{nM4Efs-uiF5ty3!w*}J>gfIX78
z$8Pzv({A~p%??+>KickCb#0FM1rYN=mBmQ&Nwp<#JXUhU;{|)}%&s>suq6lXw*~s{
zvHx}3C%<;wE5CH!BR{p<CEvB*W&e*ae5&H6TsQ>5@ml9ws}y)=QN-kL2?#`S5d*6j
zk`h<}j1>tD$b?4D^N9w}-k)bx<r``%#N@BubkHRi`8NiUJ1QcYNoj^+f{t5;yOfCu
z025_fkz23uZryUlH?8%X)iz&u&N=GVtpN}jfHhN+0n&st2CyuMEP+D?lNAvnV{r9d
zcU*Hd8>XxFg>+#kme^xx#qg6FI-%iv2U{<p;QMgJt&^`Ag7_W6#X2)I$;?RfMG1!X
z06%V(20R6@MOywSVz5Sxg}7Rrcw!_)k>0h(Y)cs%5a|m%Pn_K3X_bDJ>EH#(Fb73Z
zfUt2Q3B>N+ot3qb*DqbTZpFIn4a!#_R-}{?-~Hs=xSS6p&$sZ-k1zDdtqU`Y@`#qL
z&zv-~)Q#JCU(dI)Hf;$CEnK=6CK50}q7~wdbI->?E07bJ0R;!GSQTs<U-;V35W~fW
z36@m9t>5Am`#;*WHjvHRvY?&$Lm-vq1a_BzocI^ULXV!lbMd%|^B#fY;XX)n<&R^L
z=84u1e_3ziq;Hz-*k5~zwY3*oDKt0;bM@M@@89;@m*4RFgvvM_4;5LB!@OB@^WbVT
zjl{t;<hC4hUbrL2lKb#<%ZqWCYg*v6+?;pq-M_TowLXr*A-JpI`8bZ>a8_>od-~P4
m{5|DvB&z#xT;*OnJqG}gk~_7HcNkCr0000<MNUMnLSTXfh<FSD

diff --git a/extension/Documentation/html/_static/comment-close.png b/extension/Documentation/html/_static/comment-close.png
deleted file mode 100644
index 4d91bcf57de866a901a89a2a68c0f36af1114841..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 829
zcmV-D1H$}?P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00097Nkl<ZcmZwB
z1Dy3Z6o&ElB<&b$^RsQ+wr$(CZQHhO+qT_7?@i8TaM%C-o;rX}=B^hIClh5G@FY>W
zanA~u9RIXo;n7c96&U)YLgs-FGlx~*_c{Jgvesu1E5(8YEf&5wF=YFPcRe@1=MJmi
zag(L*xc2<lF}aNwyuSNG>r0(slpcN!vC5CUju;vHJkHc*&70_n2OZsK%O~A=!+YIw
z<wtI?<OA1V_MYo5e9JW#z16MEgjt6?ZHst>7zLLl7~Z+~RgWOQ=MI6$#0pvpu$Q43
zP@36QAmu6!_9NPM?o<1_!+stoVRRZbW9#SPe!n;#A_6m8f}|xN1;H{`0RoXQ2LM47
zt(g;iZ6|pCb@h2xk&(}S3=EVBUO0e90m2Lp5CB<(SPIaB;n4))3JB87Or#XPOPcum
z?<^(g+m9}VNn4Y&B`g8h{t_$+R<w(NPp`pR;bZXUAU_*$1^F@H_u_HjklAf2Sdp#@
zi1e@(?k`~3fS<Wa3$P{d`>B1%HKRY6fjtd-<7&EsU;vs0GM(Lmbhi%Gwcfs0FTF}T
zL{_M6Go&E0Eg8FuB*(Yn+Z*RVTBE@10eIOb3El^MhO`GabDll(V0&FlJi2k^;q8af
zkENdk2}x2)_KVp`5OAwXZM;dG0?M-S)xE1IKDi6BY@5%Or?#aZ9$gcX)dPZ&wA1a<
z$rFXHPn|TBf`e?>Are8sKtKrKcjF$i^lp!zkL?C|y^vlHr1HXeVJd;1I~g&Ob-q)&
z(fn7s-KI}G{wnK<H<)KWVxE4VdETD8{2*;k)&R4~T%#E%j&$o0>zg_U5G(V%bX6uk
zIa+<@>rdmZYd!9Y=C0cuchrbIjuRB_Wq{-RXlic?flu1*_ux}x%(HDH&nT`k^xCeC
ziHi1!ChH*sQ6|UqJpTTzX$aw8e(UfcS^f;6yB<A{y1b}M;$`2cPs0I(nH<v~(<#$j
z(=R3u{_U4$r@s5W+3{rXALYlulK55cnX3D?%s|HYcaeVp)Om4$BmFtO00000NkvXX
Hu0mjf1x1rJ

diff --git a/extension/Documentation/html/_static/comment.png b/extension/Documentation/html/_static/comment.png
deleted file mode 100644
index dfbc0cbd512bdeefcb1984c99d8e577efb77f006..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 641
zcmV-{0)G98P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006=Nkl<Zcmaiw
z1B@MC6vpR|+E!HCR@|_TQOC6vt435es%^Vn@9aE}%}s;a?Y%wcJ|ydte7XF72V6cT
zZcVcF@Zn4UJS$fQ6bbsQH-fg}6|b#&$*T*WmdO*(Ka6+c>Wd+(1-70zU(rtxtqR%j
z-lsH|CKQJXqD{+F7V0OTv8@{~(wp(`oIP^ZykMWgR>&|RsklFMCnOo&Bd{le<WL>}
zV5F6424Qzl;o2G%oVvmHgRDP9!=rK8fy^!yV8y*4p=??uIRrrr0?>O!(z*g5Av<N7
z9bjgfR9%u#U0Oo`L>L2!4z0{sq%vhG*Po}`a<6%<Pg--|g3yQn3VWI{Jf@U}Du56|
zc#*aA;RUY^;9$z*60-XpjVP=_G=rKle45s4K(Lh`;GMuduTZ8zf4`a8$eLw4pbALM
zt+G`Eg6-g7ze4q+xrfElKq%=0lu6(d!Oxl#Qr!)y;YPS3r~qN@C@#(*d{QcR<Idg_
zT0$>kTK5TNhtC8}rXNu&h^QH4A&Sk~Autm*s~45(H7+0bi^MraaRVzr05hQ3iK?j`
zR#U@^i0WhkIHTg29u~|ypU?sXCQEQgXfObPW;+0YAF;|5XyaMAEM0sQ@4-xCZe=0e
z7r$ofiAxn@O5#RodD8rh5D@nKQ;?lcf@tg4o+Wp44aMl~c47azN_(im0N)7OqdPBC
zGw;353_o$DqGRDhuhU$Eaj!@m0<HM3c<s^gb7gJ08nJ?FGHyIi^#lz$dc34LhtZ?q
bY#4t557cxjxf?U>00000NkvXXu0mjfjZ7Z_

diff --git a/extension/Documentation/html/_static/default.css b/extension/Documentation/html/_static/default.css
deleted file mode 100644
index 81b936363..000000000
--- a/extension/Documentation/html/_static/default.css
+++ /dev/null
@@ -1 +0,0 @@
-@import url("classic.css");
diff --git a/extension/Documentation/html/_static/doctools.js b/extension/Documentation/html/_static/doctools.js
deleted file mode 100644
index 565497723..000000000
--- a/extension/Documentation/html/_static/doctools.js
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * doctools.js
- * ~~~~~~~~~~~
- *
- * Sphinx JavaScript utilities for all documentation.
- *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-/**
- * select a different prefix for underscore
- */
-$u = _.noConflict();
-
-/**
- * make the code below compatible with browsers without
- * an installed firebug like debugger
-if (!window.console || !console.firebug) {
-  var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
-    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
-    "profile", "profileEnd"];
-  window.console = {};
-  for (var i = 0; i < names.length; ++i)
-    window.console[names[i]] = function() {};
-}
- */
-
-/**
- * small helper function to urldecode strings
- */
-jQuery.urldecode = function(x) {
-  return decodeURIComponent(x).replace(/\+/g, ' ');
-};
-
-/**
- * small helper function to urlencode strings
- */
-jQuery.urlencode = encodeURIComponent;
-
-/**
- * This function returns the parsed url parameters of the
- * current request. Multiple values per key are supported,
- * it will always return arrays of strings for the value parts.
- */
-jQuery.getQueryParameters = function(s) {
-  if (typeof s == 'undefined')
-    s = document.location.search;
-  var parts = s.substr(s.indexOf('?') + 1).split('&');
-  var result = {};
-  for (var i = 0; i < parts.length; i++) {
-    var tmp = parts[i].split('=', 2);
-    var key = jQuery.urldecode(tmp[0]);
-    var value = jQuery.urldecode(tmp[1]);
-    if (key in result)
-      result[key].push(value);
-    else
-      result[key] = [value];
-  }
-  return result;
-};
-
-/**
- * highlight a given string on a jquery object by wrapping it in
- * span elements with the given class name.
- */
-jQuery.fn.highlightText = function(text, className) {
-  function highlight(node) {
-    if (node.nodeType == 3) {
-      var val = node.nodeValue;
-      var pos = val.toLowerCase().indexOf(text);
-      if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
-        var span = document.createElement("span");
-        span.className = className;
-        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
-        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
-          document.createTextNode(val.substr(pos + text.length)),
-          node.nextSibling));
-        node.nodeValue = val.substr(0, pos);
-      }
-    }
-    else if (!jQuery(node).is("button, select, textarea")) {
-      jQuery.each(node.childNodes, function() {
-        highlight(this);
-      });
-    }
-  }
-  return this.each(function() {
-    highlight(this);
-  });
-};
-
-/*
- * backward compatibility for jQuery.browser
- * This will be supported until firefox bug is fixed.
- */
-if (!jQuery.browser) {
-  jQuery.uaMatch = function(ua) {
-    ua = ua.toLowerCase();
-
-    var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
-      /(webkit)[ \/]([\w.]+)/.exec(ua) ||
-      /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
-      /(msie) ([\w.]+)/.exec(ua) ||
-      ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
-      [];
-
-    return {
-      browser: match[ 1 ] || "",
-      version: match[ 2 ] || "0"
-    };
-  };
-  jQuery.browser = {};
-  jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
-}
-
-/**
- * Small JavaScript module for the documentation.
- */
-var Documentation = {
-
-  init : function() {
-    this.fixFirefoxAnchorBug();
-    this.highlightSearchWords();
-    this.initIndexTable();
-    
-  },
-
-  /**
-   * i18n support
-   */
-  TRANSLATIONS : {},
-  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
-  LOCALE : 'unknown',
-
-  // gettext and ngettext don't access this so that the functions
-  // can safely bound to a different name (_ = Documentation.gettext)
-  gettext : function(string) {
-    var translated = Documentation.TRANSLATIONS[string];
-    if (typeof translated == 'undefined')
-      return string;
-    return (typeof translated == 'string') ? translated : translated[0];
-  },
-
-  ngettext : function(singular, plural, n) {
-    var translated = Documentation.TRANSLATIONS[singular];
-    if (typeof translated == 'undefined')
-      return (n == 1) ? singular : plural;
-    return translated[Documentation.PLURALEXPR(n)];
-  },
-
-  addTranslations : function(catalog) {
-    for (var key in catalog.messages)
-      this.TRANSLATIONS[key] = catalog.messages[key];
-    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
-    this.LOCALE = catalog.locale;
-  },
-
-  /**
-   * add context elements like header anchor links
-   */
-  addContextElements : function() {
-    $('div[id] > :header:first').each(function() {
-      $('<a class="headerlink">\u00B6</a>').
-      attr('href', '#' + this.id).
-      attr('title', _('Permalink to this headline')).
-      appendTo(this);
-    });
-    $('dt[id]').each(function() {
-      $('<a class="headerlink">\u00B6</a>').
-      attr('href', '#' + this.id).
-      attr('title', _('Permalink to this definition')).
-      appendTo(this);
-    });
-  },
-
-  /**
-   * workaround a firefox stupidity
-   * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
-   */
-  fixFirefoxAnchorBug : function() {
-    if (document.location.hash)
-      window.setTimeout(function() {
-        document.location.href += '';
-      }, 10);
-  },
-
-  /**
-   * highlight the search words provided in the url in the text
-   */
-  highlightSearchWords : function() {
-    var params = $.getQueryParameters();
-    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
-    if (terms.length) {
-      var body = $('div.body');
-      if (!body.length) {
-        body = $('body');
-      }
-      window.setTimeout(function() {
-        $.each(terms, function() {
-          body.highlightText(this.toLowerCase(), 'highlighted');
-        });
-      }, 10);
-      $('<p class="highlight-link"><a href="javascript:Documentation.' +
-        'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
-          .appendTo($('#searchbox'));
-    }
-  },
-
-  /**
-   * init the domain index toggle buttons
-   */
-  initIndexTable : function() {
-    var togglers = $('img.toggler').click(function() {
-      var src = $(this).attr('src');
-      var idnum = $(this).attr('id').substr(7);
-      $('tr.cg-' + idnum).toggle();
-      if (src.substr(-9) == 'minus.png')
-        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
-      else
-        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
-    }).css('display', '');
-    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
-        togglers.click();
-    }
-  },
-
-  /**
-   * helper function to hide the search marks again
-   */
-  hideSearchWords : function() {
-    $('#searchbox .highlight-link').fadeOut(300);
-    $('span.highlighted').removeClass('highlighted');
-  },
-
-  /**
-   * make the url absolute
-   */
-  makeURL : function(relativeURL) {
-    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
-  },
-
-  /**
-   * get the current relative url
-   */
-  getCurrentURL : function() {
-    var path = document.location.pathname;
-    var parts = path.split(/\//);
-    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
-      if (this == '..')
-        parts.pop();
-    });
-    var url = parts.join('/');
-    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
-  },
-
-  initOnKeyListeners: function() {
-    $(document).keyup(function(event) {
-      var activeElementType = document.activeElement.tagName;
-      // don't navigate when in search box or textarea
-      if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') {
-        switch (event.keyCode) {
-          case 37: // left
-            var prevHref = $('link[rel="prev"]').prop('href');
-            if (prevHref) {
-              window.location.href = prevHref;
-              return false;
-            }
-          case 39: // right
-            var nextHref = $('link[rel="next"]').prop('href');
-            if (nextHref) {
-              window.location.href = nextHref;
-              return false;
-            }
-        }
-      }
-    });
-  }
-};
-
-// quick alias for translations
-_ = Documentation.gettext;
-
-$(document).ready(function() {
-  Documentation.init();
-});
\ No newline at end of file
diff --git a/extension/Documentation/html/_static/down-pressed.png b/extension/Documentation/html/_static/down-pressed.png
deleted file mode 100644
index 5756c8cad8854722893dc70b9eb4bb0400343a39..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 222
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;`PZ^+1>KjR?B@S0W7
z%OS_REiHONoJ6{+Ks@6k3590|7k9F+ddB6!zw3#&!aw#S`x}3V3&=A(a#84O-&F7T
z^k3tZB;&iR9siw0|F|E|DAL<8r-F4!1H-;1{e*~yAKZN5f0|Ei6yUmR#Is)EM(Po_
zi`qJR6|P<~+)N+kSDgL7AjdIC_!O7Q?eGb+L+qOjm{~LLinM4NHn7U%HcK%uoMYO5
VJ~8zD2B3o(JYD@<);T3K0RV0%P>BEl

diff --git a/extension/Documentation/html/_static/down.png b/extension/Documentation/html/_static/down.png
deleted file mode 100644
index 1b3bdad2ceffae91cee61b32f3295f9bbe646e48..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 202
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CVIL!hEy=F?b*7pIY7kW{q%Rg
zx!yQ<9v8bmJwa`TQk7YSw}WVQ()mRdQ;TC;*<T*?<?OIJF4)K~*`+^EdvW@{fRyJ(
z?weB&PpGe(dw+-5<oNH&JW|0z@kgId=L!~9O|3`?{k1Umt465Dp9i1pCaQ@{=WpF|
zklotk)=&P-c9F*_Q}bpRPq*XX{4Fk5IYl~|@#V*s^(ig4#DI=t@O1TaS?83{1OQnY
BO{f3>

diff --git a/extension/Documentation/html/_static/file.png b/extension/Documentation/html/_static/file.png
deleted file mode 100644
index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 286
zcmV+(0pb3MP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0002xNkl<Zcmb`G
zgHi?o6ovOGdxdP*AltSE*&JruJwUGI3!FN?xxO>s`hMrGg#P~ix$^RISR_I47Y|r1
z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHD<M{a4P!N^sPbQKi=?mBx
zoos%BSoiGXjr-;%$QixXMOVNSUNp6L0a1Oz&cgu)wqE?07u5I7qrQIu4Fij)Y3c&0
z@0u_#NH6I?Mk(n;dT}d~^J<WkTLqp|RW-hV56tKpXqu)k@V{?amI+5DOlEU@funz+
kySsbM>fiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8(

diff --git a/extension/Documentation/html/_static/jquery-3.1.0.js b/extension/Documentation/html/_static/jquery-3.1.0.js
deleted file mode 100644
index f2fc27478..000000000
--- a/extension/Documentation/html/_static/jquery-3.1.0.js
+++ /dev/null
@@ -1,10074 +0,0 @@
-/*eslint-disable no-unused-vars*/
-/*!
- * jQuery JavaScript Library v3.1.0
- * https://jquery.com/
- *
- * Includes Sizzle.js
- * https://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2016-07-07T21:44Z
- */
-( function( global, factory ) {
-
-	"use strict";
-
-	if ( typeof module === "object" && typeof module.exports === "object" ) {
-
-		// For CommonJS and CommonJS-like environments where a proper `window`
-		// is present, execute the factory and get jQuery.
-		// For environments that do not have a `window` with a `document`
-		// (such as Node.js), expose a factory as module.exports.
-		// This accentuates the need for the creation of a real `window`.
-		// e.g. var jQuery = require("jquery")(window);
-		// See ticket #14549 for more info.
-		module.exports = global.document ?
-			factory( global, true ) :
-			function( w ) {
-				if ( !w.document ) {
-					throw new Error( "jQuery requires a window with a document" );
-				}
-				return factory( w );
-			};
-	} else {
-		factory( global );
-	}
-
-// Pass this if window is not defined yet
-} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
-// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
-// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
-// enough that all such attempts are guarded in a try block.
-"use strict";
-
-var arr = [];
-
-var document = window.document;
-
-var getProto = Object.getPrototypeOf;
-
-var slice = arr.slice;
-
-var concat = arr.concat;
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var fnToString = hasOwn.toString;
-
-var ObjectFunctionString = fnToString.call( Object );
-
-var support = {};
-
-
-
-	function DOMEval( code, doc ) {
-		doc = doc || document;
-
-		var script = doc.createElement( "script" );
-
-		script.text = code;
-		doc.head.appendChild( script ).parentNode.removeChild( script );
-	}
-/* global Symbol */
-// Defining this global in .eslintrc would create a danger of using the global
-// unguarded in another place, it seems safer to define global only for this module
-
-
-
-var
-	version = "3.1.0",
-
-	// Define a local copy of jQuery
-	jQuery = function( selector, context ) {
-
-		// The jQuery object is actually just the init constructor 'enhanced'
-		// Need init if jQuery is called (just allow error to be thrown if not included)
-		return new jQuery.fn.init( selector, context );
-	},
-
-	// Support: Android <=4.0 only
-	// Make sure we trim BOM and NBSP
-	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
-	// Matches dashed string for camelizing
-	rmsPrefix = /^-ms-/,
-	rdashAlpha = /-([a-z])/g,
-
-	// Used by jQuery.camelCase as callback to replace()
-	fcamelCase = function( all, letter ) {
-		return letter.toUpperCase();
-	};
-
-jQuery.fn = jQuery.prototype = {
-
-	// The current version of jQuery being used
-	jquery: version,
-
-	constructor: jQuery,
-
-	// The default length of a jQuery object is 0
-	length: 0,
-
-	toArray: function() {
-		return slice.call( this );
-	},
-
-	// Get the Nth element in the matched element set OR
-	// Get the whole matched element set as a clean array
-	get: function( num ) {
-		return num != null ?
-
-			// Return just the one element from the set
-			( num < 0 ? this[ num + this.length ] : this[ num ] ) :
-
-			// Return all the elements in a clean array
-			slice.call( this );
-	},
-
-	// Take an array of elements and push it onto the stack
-	// (returning the new matched element set)
-	pushStack: function( elems ) {
-
-		// Build a new jQuery matched element set
-		var ret = jQuery.merge( this.constructor(), elems );
-
-		// Add the old object onto the stack (as a reference)
-		ret.prevObject = this;
-
-		// Return the newly-formed element set
-		return ret;
-	},
-
-	// Execute a callback for every element in the matched set.
-	each: function( callback ) {
-		return jQuery.each( this, callback );
-	},
-
-	map: function( callback ) {
-		return this.pushStack( jQuery.map( this, function( elem, i ) {
-			return callback.call( elem, i, elem );
-		} ) );
-	},
-
-	slice: function() {
-		return this.pushStack( slice.apply( this, arguments ) );
-	},
-
-	first: function() {
-		return this.eq( 0 );
-	},
-
-	last: function() {
-		return this.eq( -1 );
-	},
-
-	eq: function( i ) {
-		var len = this.length,
-			j = +i + ( i < 0 ? len : 0 );
-		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
-	},
-
-	end: function() {
-		return this.prevObject || this.constructor();
-	},
-
-	// For internal use only.
-	// Behaves like an Array's method, not like a jQuery method.
-	push: push,
-	sort: arr.sort,
-	splice: arr.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
-	var options, name, src, copy, copyIsArray, clone,
-		target = arguments[ 0 ] || {},
-		i = 1,
-		length = arguments.length,
-		deep = false;
-
-	// Handle a deep copy situation
-	if ( typeof target === "boolean" ) {
-		deep = target;
-
-		// Skip the boolean and the target
-		target = arguments[ i ] || {};
-		i++;
-	}
-
-	// Handle case when target is a string or something (possible in deep copy)
-	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
-		target = {};
-	}
-
-	// Extend jQuery itself if only one argument is passed
-	if ( i === length ) {
-		target = this;
-		i--;
-	}
-
-	for ( ; i < length; i++ ) {
-
-		// Only deal with non-null/undefined values
-		if ( ( options = arguments[ i ] ) != null ) {
-
-			// Extend the base object
-			for ( name in options ) {
-				src = target[ name ];
-				copy = options[ name ];
-
-				// Prevent never-ending loop
-				if ( target === copy ) {
-					continue;
-				}
-
-				// Recurse if we're merging plain objects or arrays
-				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
-					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
-
-					if ( copyIsArray ) {
-						copyIsArray = false;
-						clone = src && jQuery.isArray( src ) ? src : [];
-
-					} else {
-						clone = src && jQuery.isPlainObject( src ) ? src : {};
-					}
-
-					// Never move original objects, clone them
-					target[ name ] = jQuery.extend( deep, clone, copy );
-
-				// Don't bring in undefined values
-				} else if ( copy !== undefined ) {
-					target[ name ] = copy;
-				}
-			}
-		}
-	}
-
-	// Return the modified object
-	return target;
-};
-
-jQuery.extend( {
-
-	// Unique for each copy of jQuery on the page
-	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
-	// Assume jQuery is ready without the ready module
-	isReady: true,
-
-	error: function( msg ) {
-		throw new Error( msg );
-	},
-
-	noop: function() {},
-
-	isFunction: function( obj ) {
-		return jQuery.type( obj ) === "function";
-	},
-
-	isArray: Array.isArray,
-
-	isWindow: function( obj ) {
-		return obj != null && obj === obj.window;
-	},
-
-	isNumeric: function( obj ) {
-
-		// As of jQuery 3.0, isNumeric is limited to
-		// strings and numbers (primitives or objects)
-		// that can be coerced to finite numbers (gh-2662)
-		var type = jQuery.type( obj );
-		return ( type === "number" || type === "string" ) &&
-
-			// parseFloat NaNs numeric-cast false positives ("")
-			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-			// subtraction forces infinities to NaN
-			!isNaN( obj - parseFloat( obj ) );
-	},
-
-	isPlainObject: function( obj ) {
-		var proto, Ctor;
-
-		// Detect obvious negatives
-		// Use toString instead of jQuery.type to catch host objects
-		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
-			return false;
-		}
-
-		proto = getProto( obj );
-
-		// Objects with no prototype (e.g., `Object.create( null )`) are plain
-		if ( !proto ) {
-			return true;
-		}
-
-		// Objects with prototype are plain iff they were constructed by a global Object function
-		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
-		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
-	},
-
-	isEmptyObject: function( obj ) {
-
-		/* eslint-disable no-unused-vars */
-		// See https://github.com/eslint/eslint/issues/6125
-		var name;
-
-		for ( name in obj ) {
-			return false;
-		}
-		return true;
-	},
-
-	type: function( obj ) {
-		if ( obj == null ) {
-			return obj + "";
-		}
-
-		// Support: Android <=2.3 only (functionish RegExp)
-		return typeof obj === "object" || typeof obj === "function" ?
-			class2type[ toString.call( obj ) ] || "object" :
-			typeof obj;
-	},
-
-	// Evaluates a script in a global context
-	globalEval: function( code ) {
-		DOMEval( code );
-	},
-
-	// Convert dashed to camelCase; used by the css and data modules
-	// Support: IE <=9 - 11, Edge 12 - 13
-	// Microsoft forgot to hump their vendor prefix (#9572)
-	camelCase: function( string ) {
-		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-	},
-
-	nodeName: function( elem, name ) {
-		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-	},
-
-	each: function( obj, callback ) {
-		var length, i = 0;
-
-		if ( isArrayLike( obj ) ) {
-			length = obj.length;
-			for ( ; i < length; i++ ) {
-				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-					break;
-				}
-			}
-		} else {
-			for ( i in obj ) {
-				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-					break;
-				}
-			}
-		}
-
-		return obj;
-	},
-
-	// Support: Android <=4.0 only
-	trim: function( text ) {
-		return text == null ?
-			"" :
-			( text + "" ).replace( rtrim, "" );
-	},
-
-	// results is for internal usage only
-	makeArray: function( arr, results ) {
-		var ret = results || [];
-
-		if ( arr != null ) {
-			if ( isArrayLike( Object( arr ) ) ) {
-				jQuery.merge( ret,
-					typeof arr === "string" ?
-					[ arr ] : arr
-				);
-			} else {
-				push.call( ret, arr );
-			}
-		}
-
-		return ret;
-	},
-
-	inArray: function( elem, arr, i ) {
-		return arr == null ? -1 : indexOf.call( arr, elem, i );
-	},
-
-	// Support: Android <=4.0 only, PhantomJS 1 only
-	// push.apply(_, arraylike) throws on ancient WebKit
-	merge: function( first, second ) {
-		var len = +second.length,
-			j = 0,
-			i = first.length;
-
-		for ( ; j < len; j++ ) {
-			first[ i++ ] = second[ j ];
-		}
-
-		first.length = i;
-
-		return first;
-	},
-
-	grep: function( elems, callback, invert ) {
-		var callbackInverse,
-			matches = [],
-			i = 0,
-			length = elems.length,
-			callbackExpect = !invert;
-
-		// Go through the array, only saving the items
-		// that pass the validator function
-		for ( ; i < length; i++ ) {
-			callbackInverse = !callback( elems[ i ], i );
-			if ( callbackInverse !== callbackExpect ) {
-				matches.push( elems[ i ] );
-			}
-		}
-
-		return matches;
-	},
-
-	// arg is for internal usage only
-	map: function( elems, callback, arg ) {
-		var length, value,
-			i = 0,
-			ret = [];
-
-		// Go through the array, translating each of the items to their new values
-		if ( isArrayLike( elems ) ) {
-			length = elems.length;
-			for ( ; i < length; i++ ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret.push( value );
-				}
-			}
-
-		// Go through every key on the object,
-		} else {
-			for ( i in elems ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret.push( value );
-				}
-			}
-		}
-
-		// Flatten any nested arrays
-		return concat.apply( [], ret );
-	},
-
-	// A global GUID counter for objects
-	guid: 1,
-
-	// Bind a function to a context, optionally partially applying any
-	// arguments.
-	proxy: function( fn, context ) {
-		var tmp, args, proxy;
-
-		if ( typeof context === "string" ) {
-			tmp = fn[ context ];
-			context = fn;
-			fn = tmp;
-		}
-
-		// Quick check to determine if target is callable, in the spec
-		// this throws a TypeError, but we will just return undefined.
-		if ( !jQuery.isFunction( fn ) ) {
-			return undefined;
-		}
-
-		// Simulated bind
-		args = slice.call( arguments, 2 );
-		proxy = function() {
-			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
-		};
-
-		// Set the guid of unique handler to the same of original handler, so it can be removed
-		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-		return proxy;
-	},
-
-	now: Date.now,
-
-	// jQuery.support is not used in Core but other projects attach their
-	// properties to it so it needs to exist.
-	support: support
-} );
-
-if ( typeof Symbol === "function" ) {
-	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-}
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
-
-function isArrayLike( obj ) {
-
-	// Support: real iOS 8.2 only (not reproducible in simulator)
-	// `in` check used to prevent JIT error (gh-2145)
-	// hasOwn isn't used here due to false negatives
-	// regarding Nodelist length in IE
-	var length = !!obj && "length" in obj && obj.length,
-		type = jQuery.type( obj );
-
-	if ( type === "function" || jQuery.isWindow( obj ) ) {
-		return false;
-	}
-
-	return type === "array" || length === 0 ||
-		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-var Sizzle =
-/*!
- * Sizzle CSS Selector Engine v2.3.0
- * https://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2016-01-04
- */
-(function( window ) {
-
-var i,
-	support,
-	Expr,
-	getText,
-	isXML,
-	tokenize,
-	compile,
-	select,
-	outermostContext,
-	sortInput,
-	hasDuplicate,
-
-	// Local document vars
-	setDocument,
-	document,
-	docElem,
-	documentIsHTML,
-	rbuggyQSA,
-	rbuggyMatches,
-	matches,
-	contains,
-
-	// Instance-specific data
-	expando = "sizzle" + 1 * new Date(),
-	preferredDoc = window.document,
-	dirruns = 0,
-	done = 0,
-	classCache = createCache(),
-	tokenCache = createCache(),
-	compilerCache = createCache(),
-	sortOrder = function( a, b ) {
-		if ( a === b ) {
-			hasDuplicate = true;
-		}
-		return 0;
-	},
-
-	// Instance methods
-	hasOwn = ({}).hasOwnProperty,
-	arr = [],
-	pop = arr.pop,
-	push_native = arr.push,
-	push = arr.push,
-	slice = arr.slice,
-	// Use a stripped-down indexOf as it's faster than native
-	// https://jsperf.com/thor-indexof-vs-for/5
-	indexOf = function( list, elem ) {
-		var i = 0,
-			len = list.length;
-		for ( ; i < len; i++ ) {
-			if ( list[i] === elem ) {
-				return i;
-			}
-		}
-		return -1;
-	},
-
-	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
-	// Regular expressions
-
-	// http://www.w3.org/TR/css3-selectors/#whitespace
-	whitespace = "[\\x20\\t\\r\\n\\f]",
-
-	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
-
-	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
-	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
-		// Operator (capture 2)
-		"*([*^$|!~]?=)" + whitespace +
-		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
-		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
-		"*\\]",
-
-	pseudos = ":(" + identifier + ")(?:\\((" +
-		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
-		// 1. quoted (capture 3; capture 4 or capture 5)
-		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
-		// 2. simple (capture 6)
-		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
-		// 3. anything else (capture 2)
-		".*" +
-		")\\)|)",
-
-	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-	rwhitespace = new RegExp( whitespace + "+", "g" ),
-	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
-	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
-
-	rpseudo = new RegExp( pseudos ),
-	ridentifier = new RegExp( "^" + identifier + "$" ),
-
-	matchExpr = {
-		"ID": new RegExp( "^#(" + identifier + ")" ),
-		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
-		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
-		"ATTR": new RegExp( "^" + attributes ),
-		"PSEUDO": new RegExp( "^" + pseudos ),
-		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
-		// For use in libraries implementing .is()
-		// We use this for POS matching in `select`
-		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
-	},
-
-	rinputs = /^(?:input|select|textarea|button)$/i,
-	rheader = /^h\d$/i,
-
-	rnative = /^[^{]+\{\s*\[native \w/,
-
-	// Easily-parseable/retrievable ID or TAG or CLASS selectors
-	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-	rsibling = /[+~]/,
-
-	// CSS escapes
-	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
-	funescape = function( _, escaped, escapedWhitespace ) {
-		var high = "0x" + escaped - 0x10000;
-		// NaN means non-codepoint
-		// Support: Firefox<24
-		// Workaround erroneous numeric interpretation of +"0x"
-		return high !== high || escapedWhitespace ?
-			escaped :
-			high < 0 ?
-				// BMP codepoint
-				String.fromCharCode( high + 0x10000 ) :
-				// Supplemental Plane codepoint (surrogate pair)
-				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-	},
-
-	// CSS string/identifier serialization
-	// https://drafts.csswg.org/cssom/#common-serializing-idioms
-	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,
-	fcssescape = function( ch, asCodePoint ) {
-		if ( asCodePoint ) {
-
-			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
-			if ( ch === "\0" ) {
-				return "\uFFFD";
-			}
-
-			// Control characters and (dependent upon position) numbers get escaped as code points
-			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
-		}
-
-		// Other potentially-special ASCII characters get backslash-escaped
-		return "\\" + ch;
-	},
-
-	// Used for iframes
-	// See setDocument()
-	// Removing the function wrapper causes a "Permission Denied"
-	// error in IE
-	unloadHandler = function() {
-		setDocument();
-	},
-
-	disabledAncestor = addCombinator(
-		function( elem ) {
-			return elem.disabled === true;
-		},
-		{ dir: "parentNode", next: "legend" }
-	);
-
-// Optimize for push.apply( _, NodeList )
-try {
-	push.apply(
-		(arr = slice.call( preferredDoc.childNodes )),
-		preferredDoc.childNodes
-	);
-	// Support: Android<4.0
-	// Detect silently failing push.apply
-	arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
-	push = { apply: arr.length ?
-
-		// Leverage slice if possible
-		function( target, els ) {
-			push_native.apply( target, slice.call(els) );
-		} :
-
-		// Support: IE<9
-		// Otherwise append directly
-		function( target, els ) {
-			var j = target.length,
-				i = 0;
-			// Can't trust NodeList.length
-			while ( (target[j++] = els[i++]) ) {}
-			target.length = j - 1;
-		}
-	};
-}
-
-function Sizzle( selector, context, results, seed ) {
-	var m, i, elem, nid, match, groups, newSelector,
-		newContext = context && context.ownerDocument,
-
-		// nodeType defaults to 9, since context defaults to document
-		nodeType = context ? context.nodeType : 9;
-
-	results = results || [];
-
-	// Return early from calls with invalid selector or context
-	if ( typeof selector !== "string" || !selector ||
-		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
-		return results;
-	}
-
-	// Try to shortcut find operations (as opposed to filters) in HTML documents
-	if ( !seed ) {
-
-		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
-			setDocument( context );
-		}
-		context = context || document;
-
-		if ( documentIsHTML ) {
-
-			// If the selector is sufficiently simple, try using a "get*By*" DOM method
-			// (excepting DocumentFragment context, where the methods don't exist)
-			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
-
-				// ID selector
-				if ( (m = match[1]) ) {
-
-					// Document context
-					if ( nodeType === 9 ) {
-						if ( (elem = context.getElementById( m )) ) {
-
-							// Support: IE, Opera, Webkit
-							// TODO: identify versions
-							// getElementById can match elements by name instead of ID
-							if ( elem.id === m ) {
-								results.push( elem );
-								return results;
-							}
-						} else {
-							return results;
-						}
-
-					// Element context
-					} else {
-
-						// Support: IE, Opera, Webkit
-						// TODO: identify versions
-						// getElementById can match elements by name instead of ID
-						if ( newContext && (elem = newContext.getElementById( m )) &&
-							contains( context, elem ) &&
-							elem.id === m ) {
-
-							results.push( elem );
-							return results;
-						}
-					}
-
-				// Type selector
-				} else if ( match[2] ) {
-					push.apply( results, context.getElementsByTagName( selector ) );
-					return results;
-
-				// Class selector
-				} else if ( (m = match[3]) && support.getElementsByClassName &&
-					context.getElementsByClassName ) {
-
-					push.apply( results, context.getElementsByClassName( m ) );
-					return results;
-				}
-			}
-
-			// Take advantage of querySelectorAll
-			if ( support.qsa &&
-				!compilerCache[ selector + " " ] &&
-				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-
-				if ( nodeType !== 1 ) {
-					newContext = context;
-					newSelector = selector;
-
-				// qSA looks outside Element context, which is not what we want
-				// Thanks to Andrew Dupont for this workaround technique
-				// Support: IE <=8
-				// Exclude object elements
-				} else if ( context.nodeName.toLowerCase() !== "object" ) {
-
-					// Capture the context ID, setting it first if necessary
-					if ( (nid = context.getAttribute( "id" )) ) {
-						nid = nid.replace( rcssescape, fcssescape );
-					} else {
-						context.setAttribute( "id", (nid = expando) );
-					}
-
-					// Prefix every selector in the list
-					groups = tokenize( selector );
-					i = groups.length;
-					while ( i-- ) {
-						groups[i] = "#" + nid + " " + toSelector( groups[i] );
-					}
-					newSelector = groups.join( "," );
-
-					// Expand context for sibling selectors
-					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
-						context;
-				}
-
-				if ( newSelector ) {
-					try {
-						push.apply( results,
-							newContext.querySelectorAll( newSelector )
-						);
-						return results;
-					} catch ( qsaError ) {
-					} finally {
-						if ( nid === expando ) {
-							context.removeAttribute( "id" );
-						}
-					}
-				}
-			}
-		}
-	}
-
-	// All others
-	return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
- *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- *	deleting the oldest entry
- */
-function createCache() {
-	var keys = [];
-
-	function cache( key, value ) {
-		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
-		if ( keys.push( key + " " ) > Expr.cacheLength ) {
-			// Only keep the most recent entries
-			delete cache[ keys.shift() ];
-		}
-		return (cache[ key + " " ] = value);
-	}
-	return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
-	fn[ expando ] = true;
-	return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created element and returns a boolean result
- */
-function assert( fn ) {
-	var el = document.createElement("fieldset");
-
-	try {
-		return !!fn( el );
-	} catch (e) {
-		return false;
-	} finally {
-		// Remove from its parent by default
-		if ( el.parentNode ) {
-			el.parentNode.removeChild( el );
-		}
-		// release memory in IE
-		el = null;
-	}
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied
- */
-function addHandle( attrs, handler ) {
-	var arr = attrs.split("|"),
-		i = arr.length;
-
-	while ( i-- ) {
-		Expr.attrHandle[ arr[i] ] = handler;
-	}
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
- */
-function siblingCheck( a, b ) {
-	var cur = b && a,
-		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
-			a.sourceIndex - b.sourceIndex;
-
-	// Use IE sourceIndex if available on both nodes
-	if ( diff ) {
-		return diff;
-	}
-
-	// Check if b follows a
-	if ( cur ) {
-		while ( (cur = cur.nextSibling) ) {
-			if ( cur === b ) {
-				return -1;
-			}
-		}
-	}
-
-	return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return name === "input" && elem.type === type;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return (name === "input" || name === "button") && elem.type === type;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for :enabled/:disabled
- * @param {Boolean} disabled true for :disabled; false for :enabled
- */
-function createDisabledPseudo( disabled ) {
-	// Known :disabled false positives:
-	// IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset)
-	// not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
-	return function( elem ) {
-
-		// Check form elements and option elements for explicit disabling
-		return "label" in elem && elem.disabled === disabled ||
-			"form" in elem && elem.disabled === disabled ||
-
-			// Check non-disabled form elements for fieldset[disabled] ancestors
-			"form" in elem && elem.disabled === false && (
-				// Support: IE6-11+
-				// Ancestry is covered for us
-				elem.isDisabled === disabled ||
-
-				// Otherwise, assume any non-<option> under fieldset[disabled] is disabled
-				/* jshint -W018 */
-				elem.isDisabled !== !disabled &&
-					("label" in elem || !disabledAncestor( elem )) !== disabled
-			);
-	};
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
-	return markFunction(function( argument ) {
-		argument = +argument;
-		return markFunction(function( seed, matches ) {
-			var j,
-				matchIndexes = fn( [], seed.length, argument ),
-				i = matchIndexes.length;
-
-			// Match elements found at the specified indexes
-			while ( i-- ) {
-				if ( seed[ (j = matchIndexes[i]) ] ) {
-					seed[j] = !(matches[j] = seed[j]);
-				}
-			}
-		});
-	});
-}
-
-/**
- * Checks a node for validity as a Sizzle context
- * @param {Element|Object=} context
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
- */
-function testContext( context ) {
-	return context && typeof context.getElementsByTagName !== "undefined" && context;
-}
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Detects XML nodes
- * @param {Element|Object} elem An element or a document
- * @returns {Boolean} True iff elem is a non-HTML XML node
- */
-isXML = Sizzle.isXML = function( elem ) {
-	// documentElement is verified for cases where it doesn't yet exist
-	// (such as loading iframes in IE - #4833)
-	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-	return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
-	var hasCompare, subWindow,
-		doc = node ? node.ownerDocument || node : preferredDoc;
-
-	// Return early if doc is invalid or already selected
-	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
-		return document;
-	}
-
-	// Update global variables
-	document = doc;
-	docElem = document.documentElement;
-	documentIsHTML = !isXML( document );
-
-	// Support: IE 9-11, Edge
-	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
-	if ( preferredDoc !== document &&
-		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
-
-		// Support: IE 11, Edge
-		if ( subWindow.addEventListener ) {
-			subWindow.addEventListener( "unload", unloadHandler, false );
-
-		// Support: IE 9 - 10 only
-		} else if ( subWindow.attachEvent ) {
-			subWindow.attachEvent( "onunload", unloadHandler );
-		}
-	}
-
-	/* Attributes
-	---------------------------------------------------------------------- */
-
-	// Support: IE<8
-	// Verify that getAttribute really returns attributes and not properties
-	// (excepting IE8 booleans)
-	support.attributes = assert(function( el ) {
-		el.className = "i";
-		return !el.getAttribute("className");
-	});
-
-	/* getElement(s)By*
-	---------------------------------------------------------------------- */
-
-	// Check if getElementsByTagName("*") returns only elements
-	support.getElementsByTagName = assert(function( el ) {
-		el.appendChild( document.createComment("") );
-		return !el.getElementsByTagName("*").length;
-	});
-
-	// Support: IE<9
-	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
-	// Support: IE<10
-	// Check if getElementById returns elements by name
-	// The broken getElementById methods don't pick up programmatically-set names,
-	// so use a roundabout getElementsByName test
-	support.getById = assert(function( el ) {
-		docElem.appendChild( el ).id = expando;
-		return !document.getElementsByName || !document.getElementsByName( expando ).length;
-	});
-
-	// ID find and filter
-	if ( support.getById ) {
-		Expr.find["ID"] = function( id, context ) {
-			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
-				var m = context.getElementById( id );
-				return m ? [ m ] : [];
-			}
-		};
-		Expr.filter["ID"] = function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				return elem.getAttribute("id") === attrId;
-			};
-		};
-	} else {
-		// Support: IE6/7
-		// getElementById is not reliable as a find shortcut
-		delete Expr.find["ID"];
-
-		Expr.filter["ID"] =  function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				var node = typeof elem.getAttributeNode !== "undefined" &&
-					elem.getAttributeNode("id");
-				return node && node.value === attrId;
-			};
-		};
-	}
-
-	// Tag
-	Expr.find["TAG"] = support.getElementsByTagName ?
-		function( tag, context ) {
-			if ( typeof context.getElementsByTagName !== "undefined" ) {
-				return context.getElementsByTagName( tag );
-
-			// DocumentFragment nodes don't have gEBTN
-			} else if ( support.qsa ) {
-				return context.querySelectorAll( tag );
-			}
-		} :
-
-		function( tag, context ) {
-			var elem,
-				tmp = [],
-				i = 0,
-				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
-				results = context.getElementsByTagName( tag );
-
-			// Filter out possible comments
-			if ( tag === "*" ) {
-				while ( (elem = results[i++]) ) {
-					if ( elem.nodeType === 1 ) {
-						tmp.push( elem );
-					}
-				}
-
-				return tmp;
-			}
-			return results;
-		};
-
-	// Class
-	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
-			return context.getElementsByClassName( className );
-		}
-	};
-
-	/* QSA/matchesSelector
-	---------------------------------------------------------------------- */
-
-	// QSA and matchesSelector support
-
-	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-	rbuggyMatches = [];
-
-	// qSa(:focus) reports false when true (Chrome 21)
-	// We allow this because of a bug in IE8/9 that throws an error
-	// whenever `document.activeElement` is accessed on an iframe
-	// So, we allow :focus to pass through QSA all the time to avoid the IE error
-	// See https://bugs.jquery.com/ticket/13378
-	rbuggyQSA = [];
-
-	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
-		// Build QSA regex
-		// Regex strategy adopted from Diego Perini
-		assert(function( el ) {
-			// Select is set to empty string on purpose
-			// This is to test IE's treatment of not explicitly
-			// setting a boolean content attribute,
-			// since its presence should be enough
-			// https://bugs.jquery.com/ticket/12359
-			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
-				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
-				"<option selected=''></option></select>";
-
-			// Support: IE8, Opera 11-12.16
-			// Nothing should be selected when empty strings follow ^= or $= or *=
-			// The test attribute must be unknown in Opera but "safe" for WinRT
-			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
-				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
-			}
-
-			// Support: IE8
-			// Boolean attributes and "value" are not treated correctly
-			if ( !el.querySelectorAll("[selected]").length ) {
-				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
-			}
-
-			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
-			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
-				rbuggyQSA.push("~=");
-			}
-
-			// Webkit/Opera - :checked should return selected option elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			// IE8 throws error here and will not see later tests
-			if ( !el.querySelectorAll(":checked").length ) {
-				rbuggyQSA.push(":checked");
-			}
-
-			// Support: Safari 8+, iOS 8+
-			// https://bugs.webkit.org/show_bug.cgi?id=136851
-			// In-page `selector#id sibling-combinator selector` fails
-			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
-				rbuggyQSA.push(".#.+[+~]");
-			}
-		});
-
-		assert(function( el ) {
-			el.innerHTML = "<a href='' disabled='disabled'></a>" +
-				"<select disabled='disabled'><option/></select>";
-
-			// Support: Windows 8 Native Apps
-			// The type and name attributes are restricted during .innerHTML assignment
-			var input = document.createElement("input");
-			input.setAttribute( "type", "hidden" );
-			el.appendChild( input ).setAttribute( "name", "D" );
-
-			// Support: IE8
-			// Enforce case-sensitivity of name attribute
-			if ( el.querySelectorAll("[name=d]").length ) {
-				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
-			}
-
-			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-			// IE8 throws error here and will not see later tests
-			if ( el.querySelectorAll(":enabled").length !== 2 ) {
-				rbuggyQSA.push( ":enabled", ":disabled" );
-			}
-
-			// Support: IE9-11+
-			// IE's :disabled selector does not pick up the children of disabled fieldsets
-			docElem.appendChild( el ).disabled = true;
-			if ( el.querySelectorAll(":disabled").length !== 2 ) {
-				rbuggyQSA.push( ":enabled", ":disabled" );
-			}
-
-			// Opera 10-11 does not throw on post-comma invalid pseudos
-			el.querySelectorAll("*,:x");
-			rbuggyQSA.push(",.*:");
-		});
-	}
-
-	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
-		docElem.webkitMatchesSelector ||
-		docElem.mozMatchesSelector ||
-		docElem.oMatchesSelector ||
-		docElem.msMatchesSelector) )) ) {
-
-		assert(function( el ) {
-			// Check to see if it's possible to do matchesSelector
-			// on a disconnected node (IE 9)
-			support.disconnectedMatch = matches.call( el, "*" );
-
-			// This should fail with an exception
-			// Gecko does not error, returns false instead
-			matches.call( el, "[s!='']:x" );
-			rbuggyMatches.push( "!=", pseudos );
-		});
-	}
-
-	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
-
-	/* Contains
-	---------------------------------------------------------------------- */
-	hasCompare = rnative.test( docElem.compareDocumentPosition );
-
-	// Element contains another
-	// Purposefully self-exclusive
-	// As in, an element does not contain itself
-	contains = hasCompare || rnative.test( docElem.contains ) ?
-		function( a, b ) {
-			var adown = a.nodeType === 9 ? a.documentElement : a,
-				bup = b && b.parentNode;
-			return a === bup || !!( bup && bup.nodeType === 1 && (
-				adown.contains ?
-					adown.contains( bup ) :
-					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-			));
-		} :
-		function( a, b ) {
-			if ( b ) {
-				while ( (b = b.parentNode) ) {
-					if ( b === a ) {
-						return true;
-					}
-				}
-			}
-			return false;
-		};
-
-	/* Sorting
-	---------------------------------------------------------------------- */
-
-	// Document order sorting
-	sortOrder = hasCompare ?
-	function( a, b ) {
-
-		// Flag for duplicate removal
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		// Sort on method existence if only one input has compareDocumentPosition
-		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
-		if ( compare ) {
-			return compare;
-		}
-
-		// Calculate position if both inputs belong to the same document
-		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
-			a.compareDocumentPosition( b ) :
-
-			// Otherwise we know they are disconnected
-			1;
-
-		// Disconnected nodes
-		if ( compare & 1 ||
-			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
-			// Choose the first element that is related to our preferred document
-			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
-				return -1;
-			}
-			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
-				return 1;
-			}
-
-			// Maintain original order
-			return sortInput ?
-				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-				0;
-		}
-
-		return compare & 4 ? -1 : 1;
-	} :
-	function( a, b ) {
-		// Exit early if the nodes are identical
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		var cur,
-			i = 0,
-			aup = a.parentNode,
-			bup = b.parentNode,
-			ap = [ a ],
-			bp = [ b ];
-
-		// Parentless nodes are either documents or disconnected
-		if ( !aup || !bup ) {
-			return a === document ? -1 :
-				b === document ? 1 :
-				aup ? -1 :
-				bup ? 1 :
-				sortInput ?
-				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-				0;
-
-		// If the nodes are siblings, we can do a quick check
-		} else if ( aup === bup ) {
-			return siblingCheck( a, b );
-		}
-
-		// Otherwise we need full lists of their ancestors for comparison
-		cur = a;
-		while ( (cur = cur.parentNode) ) {
-			ap.unshift( cur );
-		}
-		cur = b;
-		while ( (cur = cur.parentNode) ) {
-			bp.unshift( cur );
-		}
-
-		// Walk down the tree looking for a discrepancy
-		while ( ap[i] === bp[i] ) {
-			i++;
-		}
-
-		return i ?
-			// Do a sibling check if the nodes have a common ancestor
-			siblingCheck( ap[i], bp[i] ) :
-
-			// Otherwise nodes in our document sort first
-			ap[i] === preferredDoc ? -1 :
-			bp[i] === preferredDoc ? 1 :
-			0;
-	};
-
-	return document;
-};
-
-Sizzle.matches = function( expr, elements ) {
-	return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	// Make sure that attribute selectors are quoted
-	expr = expr.replace( rattributeQuotes, "='$1']" );
-
-	if ( support.matchesSelector && documentIsHTML &&
-		!compilerCache[ expr + " " ] &&
-		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
-		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
-
-		try {
-			var ret = matches.call( elem, expr );
-
-			// IE 9's matchesSelector returns false on disconnected nodes
-			if ( ret || support.disconnectedMatch ||
-					// As well, disconnected nodes are said to be in a document
-					// fragment in IE 9
-					elem.document && elem.document.nodeType !== 11 ) {
-				return ret;
-			}
-		} catch (e) {}
-	}
-
-	return Sizzle( expr, document, null, [ elem ] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
-	// Set document vars if needed
-	if ( ( context.ownerDocument || context ) !== document ) {
-		setDocument( context );
-	}
-	return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	var fn = Expr.attrHandle[ name.toLowerCase() ],
-		// Don't get fooled by Object.prototype properties (jQuery #13807)
-		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
-			fn( elem, name, !documentIsHTML ) :
-			undefined;
-
-	return val !== undefined ?
-		val :
-		support.attributes || !documentIsHTML ?
-			elem.getAttribute( name ) :
-			(val = elem.getAttributeNode(name)) && val.specified ?
-				val.value :
-				null;
-};
-
-Sizzle.escape = function( sel ) {
-	return (sel + "").replace( rcssescape, fcssescape );
-};
-
-Sizzle.error = function( msg ) {
-	throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
-	var elem,
-		duplicates = [],
-		j = 0,
-		i = 0;
-
-	// Unless we *know* we can detect duplicates, assume their presence
-	hasDuplicate = !support.detectDuplicates;
-	sortInput = !support.sortStable && results.slice( 0 );
-	results.sort( sortOrder );
-
-	if ( hasDuplicate ) {
-		while ( (elem = results[i++]) ) {
-			if ( elem === results[ i ] ) {
-				j = duplicates.push( i );
-			}
-		}
-		while ( j-- ) {
-			results.splice( duplicates[ j ], 1 );
-		}
-	}
-
-	// Clear input after sorting to release objects
-	// See https://github.com/jquery/sizzle/pull/225
-	sortInput = null;
-
-	return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
-	var node,
-		ret = "",
-		i = 0,
-		nodeType = elem.nodeType;
-
-	if ( !nodeType ) {
-		// If no nodeType, this is expected to be an array
-		while ( (node = elem[i++]) ) {
-			// Do not traverse comment nodes
-			ret += getText( node );
-		}
-	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-		// Use textContent for elements
-		// innerText usage removed for consistency of new lines (jQuery #11153)
-		if ( typeof elem.textContent === "string" ) {
-			return elem.textContent;
-		} else {
-			// Traverse its children
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				ret += getText( elem );
-			}
-		}
-	} else if ( nodeType === 3 || nodeType === 4 ) {
-		return elem.nodeValue;
-	}
-	// Do not include comment or processing instruction nodes
-
-	return ret;
-};
-
-Expr = Sizzle.selectors = {
-
-	// Can be adjusted by the user
-	cacheLength: 50,
-
-	createPseudo: markFunction,
-
-	match: matchExpr,
-
-	attrHandle: {},
-
-	find: {},
-
-	relative: {
-		">": { dir: "parentNode", first: true },
-		" ": { dir: "parentNode" },
-		"+": { dir: "previousSibling", first: true },
-		"~": { dir: "previousSibling" }
-	},
-
-	preFilter: {
-		"ATTR": function( match ) {
-			match[1] = match[1].replace( runescape, funescape );
-
-			// Move the given value to match[3] whether quoted or unquoted
-			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
-
-			if ( match[2] === "~=" ) {
-				match[3] = " " + match[3] + " ";
-			}
-
-			return match.slice( 0, 4 );
-		},
-
-		"CHILD": function( match ) {
-			/* matches from matchExpr["CHILD"]
-				1 type (only|nth|...)
-				2 what (child|of-type)
-				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-				4 xn-component of xn+y argument ([+-]?\d*n|)
-				5 sign of xn-component
-				6 x of xn-component
-				7 sign of y-component
-				8 y of y-component
-			*/
-			match[1] = match[1].toLowerCase();
-
-			if ( match[1].slice( 0, 3 ) === "nth" ) {
-				// nth-* requires argument
-				if ( !match[3] ) {
-					Sizzle.error( match[0] );
-				}
-
-				// numeric x and y parameters for Expr.filter.CHILD
-				// remember that false/true cast respectively to 0/1
-				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
-			// other types prohibit arguments
-			} else if ( match[3] ) {
-				Sizzle.error( match[0] );
-			}
-
-			return match;
-		},
-
-		"PSEUDO": function( match ) {
-			var excess,
-				unquoted = !match[6] && match[2];
-
-			if ( matchExpr["CHILD"].test( match[0] ) ) {
-				return null;
-			}
-
-			// Accept quoted arguments as-is
-			if ( match[3] ) {
-				match[2] = match[4] || match[5] || "";
-
-			// Strip excess characters from unquoted arguments
-			} else if ( unquoted && rpseudo.test( unquoted ) &&
-				// Get excess from tokenize (recursively)
-				(excess = tokenize( unquoted, true )) &&
-				// advance to the next closing parenthesis
-				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
-				// excess is a negative index
-				match[0] = match[0].slice( 0, excess );
-				match[2] = unquoted.slice( 0, excess );
-			}
-
-			// Return only captures needed by the pseudo filter method (type and argument)
-			return match.slice( 0, 3 );
-		}
-	},
-
-	filter: {
-
-		"TAG": function( nodeNameSelector ) {
-			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
-			return nodeNameSelector === "*" ?
-				function() { return true; } :
-				function( elem ) {
-					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-				};
-		},
-
-		"CLASS": function( className ) {
-			var pattern = classCache[ className + " " ];
-
-			return pattern ||
-				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-				classCache( className, function( elem ) {
-					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
-				});
-		},
-
-		"ATTR": function( name, operator, check ) {
-			return function( elem ) {
-				var result = Sizzle.attr( elem, name );
-
-				if ( result == null ) {
-					return operator === "!=";
-				}
-				if ( !operator ) {
-					return true;
-				}
-
-				result += "";
-
-				return operator === "=" ? result === check :
-					operator === "!=" ? result !== check :
-					operator === "^=" ? check && result.indexOf( check ) === 0 :
-					operator === "*=" ? check && result.indexOf( check ) > -1 :
-					operator === "$=" ? check && result.slice( -check.length ) === check :
-					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
-					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
-					false;
-			};
-		},
-
-		"CHILD": function( type, what, argument, first, last ) {
-			var simple = type.slice( 0, 3 ) !== "nth",
-				forward = type.slice( -4 ) !== "last",
-				ofType = what === "of-type";
-
-			return first === 1 && last === 0 ?
-
-				// Shortcut for :nth-*(n)
-				function( elem ) {
-					return !!elem.parentNode;
-				} :
-
-				function( elem, context, xml ) {
-					var cache, uniqueCache, outerCache, node, nodeIndex, start,
-						dir = simple !== forward ? "nextSibling" : "previousSibling",
-						parent = elem.parentNode,
-						name = ofType && elem.nodeName.toLowerCase(),
-						useCache = !xml && !ofType,
-						diff = false;
-
-					if ( parent ) {
-
-						// :(first|last|only)-(child|of-type)
-						if ( simple ) {
-							while ( dir ) {
-								node = elem;
-								while ( (node = node[ dir ]) ) {
-									if ( ofType ?
-										node.nodeName.toLowerCase() === name :
-										node.nodeType === 1 ) {
-
-										return false;
-									}
-								}
-								// Reverse direction for :only-* (if we haven't yet done so)
-								start = dir = type === "only" && !start && "nextSibling";
-							}
-							return true;
-						}
-
-						start = [ forward ? parent.firstChild : parent.lastChild ];
-
-						// non-xml :nth-child(...) stores cache data on `parent`
-						if ( forward && useCache ) {
-
-							// Seek `elem` from a previously-cached index
-
-							// ...in a gzip-friendly way
-							node = parent;
-							outerCache = node[ expando ] || (node[ expando ] = {});
-
-							// Support: IE <9 only
-							// Defend against cloned attroperties (jQuery gh-1709)
-							uniqueCache = outerCache[ node.uniqueID ] ||
-								(outerCache[ node.uniqueID ] = {});
-
-							cache = uniqueCache[ type ] || [];
-							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-							diff = nodeIndex && cache[ 2 ];
-							node = nodeIndex && parent.childNodes[ nodeIndex ];
-
-							while ( (node = ++nodeIndex && node && node[ dir ] ||
-
-								// Fallback to seeking `elem` from the start
-								(diff = nodeIndex = 0) || start.pop()) ) {
-
-								// When found, cache indexes on `parent` and break
-								if ( node.nodeType === 1 && ++diff && node === elem ) {
-									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
-									break;
-								}
-							}
-
-						} else {
-							// Use previously-cached element index if available
-							if ( useCache ) {
-								// ...in a gzip-friendly way
-								node = elem;
-								outerCache = node[ expando ] || (node[ expando ] = {});
-
-								// Support: IE <9 only
-								// Defend against cloned attroperties (jQuery gh-1709)
-								uniqueCache = outerCache[ node.uniqueID ] ||
-									(outerCache[ node.uniqueID ] = {});
-
-								cache = uniqueCache[ type ] || [];
-								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-								diff = nodeIndex;
-							}
-
-							// xml :nth-child(...)
-							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
-							if ( diff === false ) {
-								// Use the same loop as above to seek `elem` from the start
-								while ( (node = ++nodeIndex && node && node[ dir ] ||
-									(diff = nodeIndex = 0) || start.pop()) ) {
-
-									if ( ( ofType ?
-										node.nodeName.toLowerCase() === name :
-										node.nodeType === 1 ) &&
-										++diff ) {
-
-										// Cache the index of each encountered element
-										if ( useCache ) {
-											outerCache = node[ expando ] || (node[ expando ] = {});
-
-											// Support: IE <9 only
-											// Defend against cloned attroperties (jQuery gh-1709)
-											uniqueCache = outerCache[ node.uniqueID ] ||
-												(outerCache[ node.uniqueID ] = {});
-
-											uniqueCache[ type ] = [ dirruns, diff ];
-										}
-
-										if ( node === elem ) {
-											break;
-										}
-									}
-								}
-							}
-						}
-
-						// Incorporate the offset, then check against cycle size
-						diff -= last;
-						return diff === first || ( diff % first === 0 && diff / first >= 0 );
-					}
-				};
-		},
-
-		"PSEUDO": function( pseudo, argument ) {
-			// pseudo-class names are case-insensitive
-			// http://www.w3.org/TR/selectors/#pseudo-classes
-			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-			// Remember that setFilters inherits from pseudos
-			var args,
-				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-					Sizzle.error( "unsupported pseudo: " + pseudo );
-
-			// The user may use createPseudo to indicate that
-			// arguments are needed to create the filter function
-			// just as Sizzle does
-			if ( fn[ expando ] ) {
-				return fn( argument );
-			}
-
-			// But maintain support for old signatures
-			if ( fn.length > 1 ) {
-				args = [ pseudo, pseudo, "", argument ];
-				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-					markFunction(function( seed, matches ) {
-						var idx,
-							matched = fn( seed, argument ),
-							i = matched.length;
-						while ( i-- ) {
-							idx = indexOf( seed, matched[i] );
-							seed[ idx ] = !( matches[ idx ] = matched[i] );
-						}
-					}) :
-					function( elem ) {
-						return fn( elem, 0, args );
-					};
-			}
-
-			return fn;
-		}
-	},
-
-	pseudos: {
-		// Potentially complex pseudos
-		"not": markFunction(function( selector ) {
-			// Trim the selector passed to compile
-			// to avoid treating leading and trailing
-			// spaces as combinators
-			var input = [],
-				results = [],
-				matcher = compile( selector.replace( rtrim, "$1" ) );
-
-			return matcher[ expando ] ?
-				markFunction(function( seed, matches, context, xml ) {
-					var elem,
-						unmatched = matcher( seed, null, xml, [] ),
-						i = seed.length;
-
-					// Match elements unmatched by `matcher`
-					while ( i-- ) {
-						if ( (elem = unmatched[i]) ) {
-							seed[i] = !(matches[i] = elem);
-						}
-					}
-				}) :
-				function( elem, context, xml ) {
-					input[0] = elem;
-					matcher( input, null, xml, results );
-					// Don't keep the element (issue #299)
-					input[0] = null;
-					return !results.pop();
-				};
-		}),
-
-		"has": markFunction(function( selector ) {
-			return function( elem ) {
-				return Sizzle( selector, elem ).length > 0;
-			};
-		}),
-
-		"contains": markFunction(function( text ) {
-			text = text.replace( runescape, funescape );
-			return function( elem ) {
-				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-			};
-		}),
-
-		// "Whether an element is represented by a :lang() selector
-		// is based solely on the element's language value
-		// being equal to the identifier C,
-		// or beginning with the identifier C immediately followed by "-".
-		// The matching of C against the element's language value is performed case-insensitively.
-		// The identifier C does not have to be a valid language name."
-		// http://www.w3.org/TR/selectors/#lang-pseudo
-		"lang": markFunction( function( lang ) {
-			// lang value must be a valid identifier
-			if ( !ridentifier.test(lang || "") ) {
-				Sizzle.error( "unsupported lang: " + lang );
-			}
-			lang = lang.replace( runescape, funescape ).toLowerCase();
-			return function( elem ) {
-				var elemLang;
-				do {
-					if ( (elemLang = documentIsHTML ?
-						elem.lang :
-						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
-
-						elemLang = elemLang.toLowerCase();
-						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
-					}
-				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
-				return false;
-			};
-		}),
-
-		// Miscellaneous
-		"target": function( elem ) {
-			var hash = window.location && window.location.hash;
-			return hash && hash.slice( 1 ) === elem.id;
-		},
-
-		"root": function( elem ) {
-			return elem === docElem;
-		},
-
-		"focus": function( elem ) {
-			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
-		},
-
-		// Boolean properties
-		"enabled": createDisabledPseudo( false ),
-		"disabled": createDisabledPseudo( true ),
-
-		"checked": function( elem ) {
-			// In CSS3, :checked should return both checked and selected elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			var nodeName = elem.nodeName.toLowerCase();
-			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-		},
-
-		"selected": function( elem ) {
-			// Accessing this property makes selected-by-default
-			// options in Safari work properly
-			if ( elem.parentNode ) {
-				elem.parentNode.selectedIndex;
-			}
-
-			return elem.selected === true;
-		},
-
-		// Contents
-		"empty": function( elem ) {
-			// http://www.w3.org/TR/selectors/#empty-pseudo
-			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
-			//   but not by others (comment: 8; processing instruction: 7; etc.)
-			// nodeType < 6 works because attributes (2) do not appear as children
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				if ( elem.nodeType < 6 ) {
-					return false;
-				}
-			}
-			return true;
-		},
-
-		"parent": function( elem ) {
-			return !Expr.pseudos["empty"]( elem );
-		},
-
-		// Element/input types
-		"header": function( elem ) {
-			return rheader.test( elem.nodeName );
-		},
-
-		"input": function( elem ) {
-			return rinputs.test( elem.nodeName );
-		},
-
-		"button": function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return name === "input" && elem.type === "button" || name === "button";
-		},
-
-		"text": function( elem ) {
-			var attr;
-			return elem.nodeName.toLowerCase() === "input" &&
-				elem.type === "text" &&
-
-				// Support: IE<8
-				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
-				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
-		},
-
-		// Position-in-collection
-		"first": createPositionalPseudo(function() {
-			return [ 0 ];
-		}),
-
-		"last": createPositionalPseudo(function( matchIndexes, length ) {
-			return [ length - 1 ];
-		}),
-
-		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			return [ argument < 0 ? argument + length : argument ];
-		}),
-
-		"even": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 0;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"odd": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 1;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; --i >= 0; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; ++i < length; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		})
-	}
-};
-
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
-	Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
-	Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
-	var matched, match, tokens, type,
-		soFar, groups, preFilters,
-		cached = tokenCache[ selector + " " ];
-
-	if ( cached ) {
-		return parseOnly ? 0 : cached.slice( 0 );
-	}
-
-	soFar = selector;
-	groups = [];
-	preFilters = Expr.preFilter;
-
-	while ( soFar ) {
-
-		// Comma and first run
-		if ( !matched || (match = rcomma.exec( soFar )) ) {
-			if ( match ) {
-				// Don't consume trailing commas as valid
-				soFar = soFar.slice( match[0].length ) || soFar;
-			}
-			groups.push( (tokens = []) );
-		}
-
-		matched = false;
-
-		// Combinators
-		if ( (match = rcombinators.exec( soFar )) ) {
-			matched = match.shift();
-			tokens.push({
-				value: matched,
-				// Cast descendant combinators to space
-				type: match[0].replace( rtrim, " " )
-			});
-			soFar = soFar.slice( matched.length );
-		}
-
-		// Filters
-		for ( type in Expr.filter ) {
-			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-				(match = preFilters[ type ]( match ))) ) {
-				matched = match.shift();
-				tokens.push({
-					value: matched,
-					type: type,
-					matches: match
-				});
-				soFar = soFar.slice( matched.length );
-			}
-		}
-
-		if ( !matched ) {
-			break;
-		}
-	}
-
-	// Return the length of the invalid excess
-	// if we're just parsing
-	// Otherwise, throw an error or return tokens
-	return parseOnly ?
-		soFar.length :
-		soFar ?
-			Sizzle.error( selector ) :
-			// Cache the tokens
-			tokenCache( selector, groups ).slice( 0 );
-};
-
-function toSelector( tokens ) {
-	var i = 0,
-		len = tokens.length,
-		selector = "";
-	for ( ; i < len; i++ ) {
-		selector += tokens[i].value;
-	}
-	return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
-	var dir = combinator.dir,
-		skip = combinator.next,
-		key = skip || dir,
-		checkNonElements = base && key === "parentNode",
-		doneName = done++;
-
-	return combinator.first ?
-		// Check against closest ancestor/preceding element
-		function( elem, context, xml ) {
-			while ( (elem = elem[ dir ]) ) {
-				if ( elem.nodeType === 1 || checkNonElements ) {
-					return matcher( elem, context, xml );
-				}
-			}
-		} :
-
-		// Check against all ancestor/preceding elements
-		function( elem, context, xml ) {
-			var oldCache, uniqueCache, outerCache,
-				newCache = [ dirruns, doneName ];
-
-			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
-			if ( xml ) {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						if ( matcher( elem, context, xml ) ) {
-							return true;
-						}
-					}
-				}
-			} else {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						outerCache = elem[ expando ] || (elem[ expando ] = {});
-
-						// Support: IE <9 only
-						// Defend against cloned attroperties (jQuery gh-1709)
-						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
-
-						if ( skip && skip === elem.nodeName.toLowerCase() ) {
-							elem = elem[ dir ] || elem;
-						} else if ( (oldCache = uniqueCache[ key ]) &&
-							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
-							// Assign to newCache so results back-propagate to previous elements
-							return (newCache[ 2 ] = oldCache[ 2 ]);
-						} else {
-							// Reuse newcache so results back-propagate to previous elements
-							uniqueCache[ key ] = newCache;
-
-							// A match means we're done; a fail means we have to keep checking
-							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
-								return true;
-							}
-						}
-					}
-				}
-			}
-		};
-}
-
-function elementMatcher( matchers ) {
-	return matchers.length > 1 ?
-		function( elem, context, xml ) {
-			var i = matchers.length;
-			while ( i-- ) {
-				if ( !matchers[i]( elem, context, xml ) ) {
-					return false;
-				}
-			}
-			return true;
-		} :
-		matchers[0];
-}
-
-function multipleContexts( selector, contexts, results ) {
-	var i = 0,
-		len = contexts.length;
-	for ( ; i < len; i++ ) {
-		Sizzle( selector, contexts[i], results );
-	}
-	return results;
-}
-
-function condense( unmatched, map, filter, context, xml ) {
-	var elem,
-		newUnmatched = [],
-		i = 0,
-		len = unmatched.length,
-		mapped = map != null;
-
-	for ( ; i < len; i++ ) {
-		if ( (elem = unmatched[i]) ) {
-			if ( !filter || filter( elem, context, xml ) ) {
-				newUnmatched.push( elem );
-				if ( mapped ) {
-					map.push( i );
-				}
-			}
-		}
-	}
-
-	return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-	if ( postFilter && !postFilter[ expando ] ) {
-		postFilter = setMatcher( postFilter );
-	}
-	if ( postFinder && !postFinder[ expando ] ) {
-		postFinder = setMatcher( postFinder, postSelector );
-	}
-	return markFunction(function( seed, results, context, xml ) {
-		var temp, i, elem,
-			preMap = [],
-			postMap = [],
-			preexisting = results.length,
-
-			// Get initial elements from seed or context
-			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
-			// Prefilter to get matcher input, preserving a map for seed-results synchronization
-			matcherIn = preFilter && ( seed || !selector ) ?
-				condense( elems, preMap, preFilter, context, xml ) :
-				elems,
-
-			matcherOut = matcher ?
-				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
-					// ...intermediate processing is necessary
-					[] :
-
-					// ...otherwise use results directly
-					results :
-				matcherIn;
-
-		// Find primary matches
-		if ( matcher ) {
-			matcher( matcherIn, matcherOut, context, xml );
-		}
-
-		// Apply postFilter
-		if ( postFilter ) {
-			temp = condense( matcherOut, postMap );
-			postFilter( temp, [], context, xml );
-
-			// Un-match failing elements by moving them back to matcherIn
-			i = temp.length;
-			while ( i-- ) {
-				if ( (elem = temp[i]) ) {
-					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-				}
-			}
-		}
-
-		if ( seed ) {
-			if ( postFinder || preFilter ) {
-				if ( postFinder ) {
-					// Get the final matcherOut by condensing this intermediate into postFinder contexts
-					temp = [];
-					i = matcherOut.length;
-					while ( i-- ) {
-						if ( (elem = matcherOut[i]) ) {
-							// Restore matcherIn since elem is not yet a final match
-							temp.push( (matcherIn[i] = elem) );
-						}
-					}
-					postFinder( null, (matcherOut = []), temp, xml );
-				}
-
-				// Move matched elements from seed to results to keep them synchronized
-				i = matcherOut.length;
-				while ( i-- ) {
-					if ( (elem = matcherOut[i]) &&
-						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
-
-						seed[temp] = !(results[temp] = elem);
-					}
-				}
-			}
-
-		// Add elements to results, through postFinder if defined
-		} else {
-			matcherOut = condense(
-				matcherOut === results ?
-					matcherOut.splice( preexisting, matcherOut.length ) :
-					matcherOut
-			);
-			if ( postFinder ) {
-				postFinder( null, results, matcherOut, xml );
-			} else {
-				push.apply( results, matcherOut );
-			}
-		}
-	});
-}
-
-function matcherFromTokens( tokens ) {
-	var checkContext, matcher, j,
-		len = tokens.length,
-		leadingRelative = Expr.relative[ tokens[0].type ],
-		implicitRelative = leadingRelative || Expr.relative[" "],
-		i = leadingRelative ? 1 : 0,
-
-		// The foundational matcher ensures that elements are reachable from top-level context(s)
-		matchContext = addCombinator( function( elem ) {
-			return elem === checkContext;
-		}, implicitRelative, true ),
-		matchAnyContext = addCombinator( function( elem ) {
-			return indexOf( checkContext, elem ) > -1;
-		}, implicitRelative, true ),
-		matchers = [ function( elem, context, xml ) {
-			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-				(checkContext = context).nodeType ?
-					matchContext( elem, context, xml ) :
-					matchAnyContext( elem, context, xml ) );
-			// Avoid hanging onto element (issue #299)
-			checkContext = null;
-			return ret;
-		} ];
-
-	for ( ; i < len; i++ ) {
-		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
-		} else {
-			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
-			// Return special upon seeing a positional matcher
-			if ( matcher[ expando ] ) {
-				// Find the next relative operator (if any) for proper handling
-				j = ++i;
-				for ( ; j < len; j++ ) {
-					if ( Expr.relative[ tokens[j].type ] ) {
-						break;
-					}
-				}
-				return setMatcher(
-					i > 1 && elementMatcher( matchers ),
-					i > 1 && toSelector(
-						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
-						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
-					).replace( rtrim, "$1" ),
-					matcher,
-					i < j && matcherFromTokens( tokens.slice( i, j ) ),
-					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-					j < len && toSelector( tokens )
-				);
-			}
-			matchers.push( matcher );
-		}
-	}
-
-	return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-	var bySet = setMatchers.length > 0,
-		byElement = elementMatchers.length > 0,
-		superMatcher = function( seed, context, xml, results, outermost ) {
-			var elem, j, matcher,
-				matchedCount = 0,
-				i = "0",
-				unmatched = seed && [],
-				setMatched = [],
-				contextBackup = outermostContext,
-				// We must always have either seed elements or outermost context
-				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
-				// Use integer dirruns iff this is the outermost matcher
-				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
-				len = elems.length;
-
-			if ( outermost ) {
-				outermostContext = context === document || context || outermost;
-			}
-
-			// Add elements passing elementMatchers directly to results
-			// Support: IE<9, Safari
-			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
-			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
-				if ( byElement && elem ) {
-					j = 0;
-					if ( !context && elem.ownerDocument !== document ) {
-						setDocument( elem );
-						xml = !documentIsHTML;
-					}
-					while ( (matcher = elementMatchers[j++]) ) {
-						if ( matcher( elem, context || document, xml) ) {
-							results.push( elem );
-							break;
-						}
-					}
-					if ( outermost ) {
-						dirruns = dirrunsUnique;
-					}
-				}
-
-				// Track unmatched elements for set filters
-				if ( bySet ) {
-					// They will have gone through all possible matchers
-					if ( (elem = !matcher && elem) ) {
-						matchedCount--;
-					}
-
-					// Lengthen the array for every element, matched or not
-					if ( seed ) {
-						unmatched.push( elem );
-					}
-				}
-			}
-
-			// `i` is now the count of elements visited above, and adding it to `matchedCount`
-			// makes the latter nonnegative.
-			matchedCount += i;
-
-			// Apply set filters to unmatched elements
-			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
-			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
-			// no element matchers and no seed.
-			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
-			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
-			// numerically zero.
-			if ( bySet && i !== matchedCount ) {
-				j = 0;
-				while ( (matcher = setMatchers[j++]) ) {
-					matcher( unmatched, setMatched, context, xml );
-				}
-
-				if ( seed ) {
-					// Reintegrate element matches to eliminate the need for sorting
-					if ( matchedCount > 0 ) {
-						while ( i-- ) {
-							if ( !(unmatched[i] || setMatched[i]) ) {
-								setMatched[i] = pop.call( results );
-							}
-						}
-					}
-
-					// Discard index placeholder values to get only actual matches
-					setMatched = condense( setMatched );
-				}
-
-				// Add matches to results
-				push.apply( results, setMatched );
-
-				// Seedless set matches succeeding multiple successful matchers stipulate sorting
-				if ( outermost && !seed && setMatched.length > 0 &&
-					( matchedCount + setMatchers.length ) > 1 ) {
-
-					Sizzle.uniqueSort( results );
-				}
-			}
-
-			// Override manipulation of globals by nested matchers
-			if ( outermost ) {
-				dirruns = dirrunsUnique;
-				outermostContext = contextBackup;
-			}
-
-			return unmatched;
-		};
-
-	return bySet ?
-		markFunction( superMatcher ) :
-		superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
-	var i,
-		setMatchers = [],
-		elementMatchers = [],
-		cached = compilerCache[ selector + " " ];
-
-	if ( !cached ) {
-		// Generate a function of recursive functions that can be used to check each element
-		if ( !match ) {
-			match = tokenize( selector );
-		}
-		i = match.length;
-		while ( i-- ) {
-			cached = matcherFromTokens( match[i] );
-			if ( cached[ expando ] ) {
-				setMatchers.push( cached );
-			} else {
-				elementMatchers.push( cached );
-			}
-		}
-
-		// Cache the compiled function
-		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-
-		// Save selector and tokenization
-		cached.selector = selector;
-	}
-	return cached;
-};
-
-/**
- * A low-level selection function that works with Sizzle's compiled
- *  selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- *  selector function built with Sizzle.compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-select = Sizzle.select = function( selector, context, results, seed ) {
-	var i, tokens, token, type, find,
-		compiled = typeof selector === "function" && selector,
-		match = !seed && tokenize( (selector = compiled.selector || selector) );
-
-	results = results || [];
-
-	// Try to minimize operations if there is only one selector in the list and no seed
-	// (the latter of which guarantees us context)
-	if ( match.length === 1 ) {
-
-		// Reduce context if the leading compound selector is an ID
-		tokens = match[0] = match[0].slice( 0 );
-		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-				support.getById && context.nodeType === 9 && documentIsHTML &&
-				Expr.relative[ tokens[1].type ] ) {
-
-			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
-			if ( !context ) {
-				return results;
-
-			// Precompiled matchers will still verify ancestry, so step up a level
-			} else if ( compiled ) {
-				context = context.parentNode;
-			}
-
-			selector = selector.slice( tokens.shift().value.length );
-		}
-
-		// Fetch a seed set for right-to-left matching
-		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-		while ( i-- ) {
-			token = tokens[i];
-
-			// Abort if we hit a combinator
-			if ( Expr.relative[ (type = token.type) ] ) {
-				break;
-			}
-			if ( (find = Expr.find[ type ]) ) {
-				// Search, expanding context for leading sibling combinators
-				if ( (seed = find(
-					token.matches[0].replace( runescape, funescape ),
-					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
-				)) ) {
-
-					// If seed is empty or no tokens remain, we can return early
-					tokens.splice( i, 1 );
-					selector = seed.length && toSelector( tokens );
-					if ( !selector ) {
-						push.apply( results, seed );
-						return results;
-					}
-
-					break;
-				}
-			}
-		}
-	}
-
-	// Compile and execute a filtering function if one is not provided
-	// Provide `match` to avoid retokenization if we modified the selector above
-	( compiled || compile( selector, match ) )(
-		seed,
-		context,
-		!documentIsHTML,
-		results,
-		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
-	);
-	return results;
-};
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( el ) {
-	// Should return 1, but returns 4 (following)
-	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
-});
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( el ) {
-	el.innerHTML = "<a href='#'></a>";
-	return el.firstChild.getAttribute("href") === "#" ;
-}) ) {
-	addHandle( "type|href|height|width", function( elem, name, isXML ) {
-		if ( !isXML ) {
-			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
-		}
-	});
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( el ) {
-	el.innerHTML = "<input/>";
-	el.firstChild.setAttribute( "value", "" );
-	return el.firstChild.getAttribute( "value" ) === "";
-}) ) {
-	addHandle( "value", function( elem, name, isXML ) {
-		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
-			return elem.defaultValue;
-		}
-	});
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( el ) {
-	return el.getAttribute("disabled") == null;
-}) ) {
-	addHandle( booleans, function( elem, name, isXML ) {
-		var val;
-		if ( !isXML ) {
-			return elem[ name ] === true ? name.toLowerCase() :
-					(val = elem.getAttributeNode( name )) && val.specified ?
-					val.value :
-				null;
-		}
-	});
-}
-
-return Sizzle;
-
-})( window );
-
-
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-
-// Deprecated
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-jQuery.escapeSelector = Sizzle.escape;
-
-
-
-
-var dir = function( elem, dir, until ) {
-	var matched = [],
-		truncate = until !== undefined;
-
-	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
-		if ( elem.nodeType === 1 ) {
-			if ( truncate && jQuery( elem ).is( until ) ) {
-				break;
-			}
-			matched.push( elem );
-		}
-	}
-	return matched;
-};
-
-
-var siblings = function( n, elem ) {
-	var matched = [];
-
-	for ( ; n; n = n.nextSibling ) {
-		if ( n.nodeType === 1 && n !== elem ) {
-			matched.push( n );
-		}
-	}
-
-	return matched;
-};
-
-
-var rneedsContext = jQuery.expr.match.needsContext;
-
-var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
-
-
-
-var risSimple = /^.[^:#\[\.,]*$/;
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
-	if ( jQuery.isFunction( qualifier ) ) {
-		return jQuery.grep( elements, function( elem, i ) {
-			return !!qualifier.call( elem, i, elem ) !== not;
-		} );
-
-	}
-
-	if ( qualifier.nodeType ) {
-		return jQuery.grep( elements, function( elem ) {
-			return ( elem === qualifier ) !== not;
-		} );
-
-	}
-
-	if ( typeof qualifier === "string" ) {
-		if ( risSimple.test( qualifier ) ) {
-			return jQuery.filter( qualifier, elements, not );
-		}
-
-		qualifier = jQuery.filter( qualifier, elements );
-	}
-
-	return jQuery.grep( elements, function( elem ) {
-		return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
-	} );
-}
-
-jQuery.filter = function( expr, elems, not ) {
-	var elem = elems[ 0 ];
-
-	if ( not ) {
-		expr = ":not(" + expr + ")";
-	}
-
-	return elems.length === 1 && elem.nodeType === 1 ?
-		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
-		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
-			return elem.nodeType === 1;
-		} ) );
-};
-
-jQuery.fn.extend( {
-	find: function( selector ) {
-		var i, ret,
-			len = this.length,
-			self = this;
-
-		if ( typeof selector !== "string" ) {
-			return this.pushStack( jQuery( selector ).filter( function() {
-				for ( i = 0; i < len; i++ ) {
-					if ( jQuery.contains( self[ i ], this ) ) {
-						return true;
-					}
-				}
-			} ) );
-		}
-
-		ret = this.pushStack( [] );
-
-		for ( i = 0; i < len; i++ ) {
-			jQuery.find( selector, self[ i ], ret );
-		}
-
-		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
-	},
-	filter: function( selector ) {
-		return this.pushStack( winnow( this, selector || [], false ) );
-	},
-	not: function( selector ) {
-		return this.pushStack( winnow( this, selector || [], true ) );
-	},
-	is: function( selector ) {
-		return !!winnow(
-			this,
-
-			// If this is a positional/relative selector, check membership in the returned set
-			// so $("p:first").is("p:last") won't return true for a doc with two "p".
-			typeof selector === "string" && rneedsContext.test( selector ) ?
-				jQuery( selector ) :
-				selector || [],
-			false
-		).length;
-	}
-} );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
-	// A simple way to check for HTML strings
-	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-	// Strict HTML recognition (#11290: must start with <)
-	// Shortcut simple #id case for speed
-	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
-
-	init = jQuery.fn.init = function( selector, context, root ) {
-		var match, elem;
-
-		// HANDLE: $(""), $(null), $(undefined), $(false)
-		if ( !selector ) {
-			return this;
-		}
-
-		// Method init() accepts an alternate rootjQuery
-		// so migrate can support jQuery.sub (gh-2101)
-		root = root || rootjQuery;
-
-		// Handle HTML strings
-		if ( typeof selector === "string" ) {
-			if ( selector[ 0 ] === "<" &&
-				selector[ selector.length - 1 ] === ">" &&
-				selector.length >= 3 ) {
-
-				// Assume that strings that start and end with <> are HTML and skip the regex check
-				match = [ null, selector, null ];
-
-			} else {
-				match = rquickExpr.exec( selector );
-			}
-
-			// Match html or make sure no context is specified for #id
-			if ( match && ( match[ 1 ] || !context ) ) {
-
-				// HANDLE: $(html) -> $(array)
-				if ( match[ 1 ] ) {
-					context = context instanceof jQuery ? context[ 0 ] : context;
-
-					// Option to run scripts is true for back-compat
-					// Intentionally let the error be thrown if parseHTML is not present
-					jQuery.merge( this, jQuery.parseHTML(
-						match[ 1 ],
-						context && context.nodeType ? context.ownerDocument || context : document,
-						true
-					) );
-
-					// HANDLE: $(html, props)
-					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
-						for ( match in context ) {
-
-							// Properties of context are called as methods if possible
-							if ( jQuery.isFunction( this[ match ] ) ) {
-								this[ match ]( context[ match ] );
-
-							// ...and otherwise set as attributes
-							} else {
-								this.attr( match, context[ match ] );
-							}
-						}
-					}
-
-					return this;
-
-				// HANDLE: $(#id)
-				} else {
-					elem = document.getElementById( match[ 2 ] );
-
-					if ( elem ) {
-
-						// Inject the element directly into the jQuery object
-						this[ 0 ] = elem;
-						this.length = 1;
-					}
-					return this;
-				}
-
-			// HANDLE: $(expr, $(...))
-			} else if ( !context || context.jquery ) {
-				return ( context || root ).find( selector );
-
-			// HANDLE: $(expr, context)
-			// (which is just equivalent to: $(context).find(expr)
-			} else {
-				return this.constructor( context ).find( selector );
-			}
-
-		// HANDLE: $(DOMElement)
-		} else if ( selector.nodeType ) {
-			this[ 0 ] = selector;
-			this.length = 1;
-			return this;
-
-		// HANDLE: $(function)
-		// Shortcut for document ready
-		} else if ( jQuery.isFunction( selector ) ) {
-			return root.ready !== undefined ?
-				root.ready( selector ) :
-
-				// Execute immediately if ready is not present
-				selector( jQuery );
-		}
-
-		return jQuery.makeArray( selector, this );
-	};
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
-	// Methods guaranteed to produce a unique set when starting from a unique set
-	guaranteedUnique = {
-		children: true,
-		contents: true,
-		next: true,
-		prev: true
-	};
-
-jQuery.fn.extend( {
-	has: function( target ) {
-		var targets = jQuery( target, this ),
-			l = targets.length;
-
-		return this.filter( function() {
-			var i = 0;
-			for ( ; i < l; i++ ) {
-				if ( jQuery.contains( this, targets[ i ] ) ) {
-					return true;
-				}
-			}
-		} );
-	},
-
-	closest: function( selectors, context ) {
-		var cur,
-			i = 0,
-			l = this.length,
-			matched = [],
-			targets = typeof selectors !== "string" && jQuery( selectors );
-
-		// Positional selectors never match, since there's no _selection_ context
-		if ( !rneedsContext.test( selectors ) ) {
-			for ( ; i < l; i++ ) {
-				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
-					// Always skip document fragments
-					if ( cur.nodeType < 11 && ( targets ?
-						targets.index( cur ) > -1 :
-
-						// Don't pass non-elements to Sizzle
-						cur.nodeType === 1 &&
-							jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
-						matched.push( cur );
-						break;
-					}
-				}
-			}
-		}
-
-		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
-	},
-
-	// Determine the position of an element within the set
-	index: function( elem ) {
-
-		// No argument, return index in parent
-		if ( !elem ) {
-			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
-		}
-
-		// Index in selector
-		if ( typeof elem === "string" ) {
-			return indexOf.call( jQuery( elem ), this[ 0 ] );
-		}
-
-		// Locate the position of the desired element
-		return indexOf.call( this,
-
-			// If it receives a jQuery object, the first element is used
-			elem.jquery ? elem[ 0 ] : elem
-		);
-	},
-
-	add: function( selector, context ) {
-		return this.pushStack(
-			jQuery.uniqueSort(
-				jQuery.merge( this.get(), jQuery( selector, context ) )
-			)
-		);
-	},
-
-	addBack: function( selector ) {
-		return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter( selector )
-		);
-	}
-} );
-
-function sibling( cur, dir ) {
-	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
-	return cur;
-}
-
-jQuery.each( {
-	parent: function( elem ) {
-		var parent = elem.parentNode;
-		return parent && parent.nodeType !== 11 ? parent : null;
-	},
-	parents: function( elem ) {
-		return dir( elem, "parentNode" );
-	},
-	parentsUntil: function( elem, i, until ) {
-		return dir( elem, "parentNode", until );
-	},
-	next: function( elem ) {
-		return sibling( elem, "nextSibling" );
-	},
-	prev: function( elem ) {
-		return sibling( elem, "previousSibling" );
-	},
-	nextAll: function( elem ) {
-		return dir( elem, "nextSibling" );
-	},
-	prevAll: function( elem ) {
-		return dir( elem, "previousSibling" );
-	},
-	nextUntil: function( elem, i, until ) {
-		return dir( elem, "nextSibling", until );
-	},
-	prevUntil: function( elem, i, until ) {
-		return dir( elem, "previousSibling", until );
-	},
-	siblings: function( elem ) {
-		return siblings( ( elem.parentNode || {} ).firstChild, elem );
-	},
-	children: function( elem ) {
-		return siblings( elem.firstChild );
-	},
-	contents: function( elem ) {
-		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
-	}
-}, function( name, fn ) {
-	jQuery.fn[ name ] = function( until, selector ) {
-		var matched = jQuery.map( this, fn, until );
-
-		if ( name.slice( -5 ) !== "Until" ) {
-			selector = until;
-		}
-
-		if ( selector && typeof selector === "string" ) {
-			matched = jQuery.filter( selector, matched );
-		}
-
-		if ( this.length > 1 ) {
-
-			// Remove duplicates
-			if ( !guaranteedUnique[ name ] ) {
-				jQuery.uniqueSort( matched );
-			}
-
-			// Reverse order for parents* and prev-derivatives
-			if ( rparentsprev.test( name ) ) {
-				matched.reverse();
-			}
-		}
-
-		return this.pushStack( matched );
-	};
-} );
-var rnotwhite = ( /\S+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
-	var object = {};
-	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
-		object[ flag ] = true;
-	} );
-	return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *	options: an optional list of space-separated options that will change how
- *			the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *	once:			will ensure the callback list can only be fired once (like a Deferred)
- *
- *	memory:			will keep track of previous values and will call any callback added
- *					after the list has been fired right away with the latest "memorized"
- *					values (like a Deferred)
- *
- *	unique:			will ensure a callback can only be added once (no duplicate in the list)
- *
- *	stopOnFalse:	interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-	// Convert options from String-formatted to Object-formatted if needed
-	// (we check in cache first)
-	options = typeof options === "string" ?
-		createOptions( options ) :
-		jQuery.extend( {}, options );
-
-	var // Flag to know if list is currently firing
-		firing,
-
-		// Last fire value for non-forgettable lists
-		memory,
-
-		// Flag to know if list was already fired
-		fired,
-
-		// Flag to prevent firing
-		locked,
-
-		// Actual callback list
-		list = [],
-
-		// Queue of execution data for repeatable lists
-		queue = [],
-
-		// Index of currently firing callback (modified by add/remove as needed)
-		firingIndex = -1,
-
-		// Fire callbacks
-		fire = function() {
-
-			// Enforce single-firing
-			locked = options.once;
-
-			// Execute callbacks for all pending executions,
-			// respecting firingIndex overrides and runtime changes
-			fired = firing = true;
-			for ( ; queue.length; firingIndex = -1 ) {
-				memory = queue.shift();
-				while ( ++firingIndex < list.length ) {
-
-					// Run callback and check for early termination
-					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
-						options.stopOnFalse ) {
-
-						// Jump to end and forget the data so .add doesn't re-fire
-						firingIndex = list.length;
-						memory = false;
-					}
-				}
-			}
-
-			// Forget the data if we're done with it
-			if ( !options.memory ) {
-				memory = false;
-			}
-
-			firing = false;
-
-			// Clean up if we're done firing for good
-			if ( locked ) {
-
-				// Keep an empty list if we have data for future add calls
-				if ( memory ) {
-					list = [];
-
-				// Otherwise, this object is spent
-				} else {
-					list = "";
-				}
-			}
-		},
-
-		// Actual Callbacks object
-		self = {
-
-			// Add a callback or a collection of callbacks to the list
-			add: function() {
-				if ( list ) {
-
-					// If we have memory from a past run, we should fire after adding
-					if ( memory && !firing ) {
-						firingIndex = list.length - 1;
-						queue.push( memory );
-					}
-
-					( function add( args ) {
-						jQuery.each( args, function( _, arg ) {
-							if ( jQuery.isFunction( arg ) ) {
-								if ( !options.unique || !self.has( arg ) ) {
-									list.push( arg );
-								}
-							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
-
-								// Inspect recursively
-								add( arg );
-							}
-						} );
-					} )( arguments );
-
-					if ( memory && !firing ) {
-						fire();
-					}
-				}
-				return this;
-			},
-
-			// Remove a callback from the list
-			remove: function() {
-				jQuery.each( arguments, function( _, arg ) {
-					var index;
-					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-						list.splice( index, 1 );
-
-						// Handle firing indexes
-						if ( index <= firingIndex ) {
-							firingIndex--;
-						}
-					}
-				} );
-				return this;
-			},
-
-			// Check if a given callback is in the list.
-			// If no argument is given, return whether or not list has callbacks attached.
-			has: function( fn ) {
-				return fn ?
-					jQuery.inArray( fn, list ) > -1 :
-					list.length > 0;
-			},
-
-			// Remove all callbacks from the list
-			empty: function() {
-				if ( list ) {
-					list = [];
-				}
-				return this;
-			},
-
-			// Disable .fire and .add
-			// Abort any current/pending executions
-			// Clear all callbacks and values
-			disable: function() {
-				locked = queue = [];
-				list = memory = "";
-				return this;
-			},
-			disabled: function() {
-				return !list;
-			},
-
-			// Disable .fire
-			// Also disable .add unless we have memory (since it would have no effect)
-			// Abort any pending executions
-			lock: function() {
-				locked = queue = [];
-				if ( !memory && !firing ) {
-					list = memory = "";
-				}
-				return this;
-			},
-			locked: function() {
-				return !!locked;
-			},
-
-			// Call all callbacks with the given context and arguments
-			fireWith: function( context, args ) {
-				if ( !locked ) {
-					args = args || [];
-					args = [ context, args.slice ? args.slice() : args ];
-					queue.push( args );
-					if ( !firing ) {
-						fire();
-					}
-				}
-				return this;
-			},
-
-			// Call all the callbacks with the given arguments
-			fire: function() {
-				self.fireWith( this, arguments );
-				return this;
-			},
-
-			// To know if the callbacks have already been called at least once
-			fired: function() {
-				return !!fired;
-			}
-		};
-
-	return self;
-};
-
-
-function Identity( v ) {
-	return v;
-}
-function Thrower( ex ) {
-	throw ex;
-}
-
-function adoptValue( value, resolve, reject ) {
-	var method;
-
-	try {
-
-		// Check for promise aspect first to privilege synchronous behavior
-		if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
-			method.call( value ).done( resolve ).fail( reject );
-
-		// Other thenables
-		} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
-			method.call( value, resolve, reject );
-
-		// Other non-thenables
-		} else {
-
-			// Support: Android 4.0 only
-			// Strict mode functions invoked without .call/.apply get global-object context
-			resolve.call( undefined, value );
-		}
-
-	// For Promises/A+, convert exceptions into rejections
-	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
-	// Deferred#then to conditionally suppress rejection.
-	} catch ( value ) {
-
-		// Support: Android 4.0 only
-		// Strict mode functions invoked without .call/.apply get global-object context
-		reject.call( undefined, value );
-	}
-}
-
-jQuery.extend( {
-
-	Deferred: function( func ) {
-		var tuples = [
-
-				// action, add listener, callbacks,
-				// ... .then handlers, argument index, [final state]
-				[ "notify", "progress", jQuery.Callbacks( "memory" ),
-					jQuery.Callbacks( "memory" ), 2 ],
-				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
-					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
-				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
-					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
-			],
-			state = "pending",
-			promise = {
-				state: function() {
-					return state;
-				},
-				always: function() {
-					deferred.done( arguments ).fail( arguments );
-					return this;
-				},
-				"catch": function( fn ) {
-					return promise.then( null, fn );
-				},
-
-				// Keep pipe for back-compat
-				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
-					var fns = arguments;
-
-					return jQuery.Deferred( function( newDefer ) {
-						jQuery.each( tuples, function( i, tuple ) {
-
-							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
-							var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
-
-							// deferred.progress(function() { bind to newDefer or newDefer.notify })
-							// deferred.done(function() { bind to newDefer or newDefer.resolve })
-							// deferred.fail(function() { bind to newDefer or newDefer.reject })
-							deferred[ tuple[ 1 ] ]( function() {
-								var returned = fn && fn.apply( this, arguments );
-								if ( returned && jQuery.isFunction( returned.promise ) ) {
-									returned.promise()
-										.progress( newDefer.notify )
-										.done( newDefer.resolve )
-										.fail( newDefer.reject );
-								} else {
-									newDefer[ tuple[ 0 ] + "With" ](
-										this,
-										fn ? [ returned ] : arguments
-									);
-								}
-							} );
-						} );
-						fns = null;
-					} ).promise();
-				},
-				then: function( onFulfilled, onRejected, onProgress ) {
-					var maxDepth = 0;
-					function resolve( depth, deferred, handler, special ) {
-						return function() {
-							var that = this,
-								args = arguments,
-								mightThrow = function() {
-									var returned, then;
-
-									// Support: Promises/A+ section 2.3.3.3.3
-									// https://promisesaplus.com/#point-59
-									// Ignore double-resolution attempts
-									if ( depth < maxDepth ) {
-										return;
-									}
-
-									returned = handler.apply( that, args );
-
-									// Support: Promises/A+ section 2.3.1
-									// https://promisesaplus.com/#point-48
-									if ( returned === deferred.promise() ) {
-										throw new TypeError( "Thenable self-resolution" );
-									}
-
-									// Support: Promises/A+ sections 2.3.3.1, 3.5
-									// https://promisesaplus.com/#point-54
-									// https://promisesaplus.com/#point-75
-									// Retrieve `then` only once
-									then = returned &&
-
-										// Support: Promises/A+ section 2.3.4
-										// https://promisesaplus.com/#point-64
-										// Only check objects and functions for thenability
-										( typeof returned === "object" ||
-											typeof returned === "function" ) &&
-										returned.then;
-
-									// Handle a returned thenable
-									if ( jQuery.isFunction( then ) ) {
-
-										// Special processors (notify) just wait for resolution
-										if ( special ) {
-											then.call(
-												returned,
-												resolve( maxDepth, deferred, Identity, special ),
-												resolve( maxDepth, deferred, Thrower, special )
-											);
-
-										// Normal processors (resolve) also hook into progress
-										} else {
-
-											// ...and disregard older resolution values
-											maxDepth++;
-
-											then.call(
-												returned,
-												resolve( maxDepth, deferred, Identity, special ),
-												resolve( maxDepth, deferred, Thrower, special ),
-												resolve( maxDepth, deferred, Identity,
-													deferred.notifyWith )
-											);
-										}
-
-									// Handle all other returned values
-									} else {
-
-										// Only substitute handlers pass on context
-										// and multiple values (non-spec behavior)
-										if ( handler !== Identity ) {
-											that = undefined;
-											args = [ returned ];
-										}
-
-										// Process the value(s)
-										// Default process is resolve
-										( special || deferred.resolveWith )( that, args );
-									}
-								},
-
-								// Only normal processors (resolve) catch and reject exceptions
-								process = special ?
-									mightThrow :
-									function() {
-										try {
-											mightThrow();
-										} catch ( e ) {
-
-											if ( jQuery.Deferred.exceptionHook ) {
-												jQuery.Deferred.exceptionHook( e,
-													process.stackTrace );
-											}
-
-											// Support: Promises/A+ section 2.3.3.3.4.1
-											// https://promisesaplus.com/#point-61
-											// Ignore post-resolution exceptions
-											if ( depth + 1 >= maxDepth ) {
-
-												// Only substitute handlers pass on context
-												// and multiple values (non-spec behavior)
-												if ( handler !== Thrower ) {
-													that = undefined;
-													args = [ e ];
-												}
-
-												deferred.rejectWith( that, args );
-											}
-										}
-									};
-
-							// Support: Promises/A+ section 2.3.3.3.1
-							// https://promisesaplus.com/#point-57
-							// Re-resolve promises immediately to dodge false rejection from
-							// subsequent errors
-							if ( depth ) {
-								process();
-							} else {
-
-								// Call an optional hook to record the stack, in case of exception
-								// since it's otherwise lost when execution goes async
-								if ( jQuery.Deferred.getStackHook ) {
-									process.stackTrace = jQuery.Deferred.getStackHook();
-								}
-								window.setTimeout( process );
-							}
-						};
-					}
-
-					return jQuery.Deferred( function( newDefer ) {
-
-						// progress_handlers.add( ... )
-						tuples[ 0 ][ 3 ].add(
-							resolve(
-								0,
-								newDefer,
-								jQuery.isFunction( onProgress ) ?
-									onProgress :
-									Identity,
-								newDefer.notifyWith
-							)
-						);
-
-						// fulfilled_handlers.add( ... )
-						tuples[ 1 ][ 3 ].add(
-							resolve(
-								0,
-								newDefer,
-								jQuery.isFunction( onFulfilled ) ?
-									onFulfilled :
-									Identity
-							)
-						);
-
-						// rejected_handlers.add( ... )
-						tuples[ 2 ][ 3 ].add(
-							resolve(
-								0,
-								newDefer,
-								jQuery.isFunction( onRejected ) ?
-									onRejected :
-									Thrower
-							)
-						);
-					} ).promise();
-				},
-
-				// Get a promise for this deferred
-				// If obj is provided, the promise aspect is added to the object
-				promise: function( obj ) {
-					return obj != null ? jQuery.extend( obj, promise ) : promise;
-				}
-			},
-			deferred = {};
-
-		// Add list-specific methods
-		jQuery.each( tuples, function( i, tuple ) {
-			var list = tuple[ 2 ],
-				stateString = tuple[ 5 ];
-
-			// promise.progress = list.add
-			// promise.done = list.add
-			// promise.fail = list.add
-			promise[ tuple[ 1 ] ] = list.add;
-
-			// Handle state
-			if ( stateString ) {
-				list.add(
-					function() {
-
-						// state = "resolved" (i.e., fulfilled)
-						// state = "rejected"
-						state = stateString;
-					},
-
-					// rejected_callbacks.disable
-					// fulfilled_callbacks.disable
-					tuples[ 3 - i ][ 2 ].disable,
-
-					// progress_callbacks.lock
-					tuples[ 0 ][ 2 ].lock
-				);
-			}
-
-			// progress_handlers.fire
-			// fulfilled_handlers.fire
-			// rejected_handlers.fire
-			list.add( tuple[ 3 ].fire );
-
-			// deferred.notify = function() { deferred.notifyWith(...) }
-			// deferred.resolve = function() { deferred.resolveWith(...) }
-			// deferred.reject = function() { deferred.rejectWith(...) }
-			deferred[ tuple[ 0 ] ] = function() {
-				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
-				return this;
-			};
-
-			// deferred.notifyWith = list.fireWith
-			// deferred.resolveWith = list.fireWith
-			// deferred.rejectWith = list.fireWith
-			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
-		} );
-
-		// Make the deferred a promise
-		promise.promise( deferred );
-
-		// Call given func if any
-		if ( func ) {
-			func.call( deferred, deferred );
-		}
-
-		// All done!
-		return deferred;
-	},
-
-	// Deferred helper
-	when: function( singleValue ) {
-		var
-
-			// count of uncompleted subordinates
-			remaining = arguments.length,
-
-			// count of unprocessed arguments
-			i = remaining,
-
-			// subordinate fulfillment data
-			resolveContexts = Array( i ),
-			resolveValues = slice.call( arguments ),
-
-			// the master Deferred
-			master = jQuery.Deferred(),
-
-			// subordinate callback factory
-			updateFunc = function( i ) {
-				return function( value ) {
-					resolveContexts[ i ] = this;
-					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
-					if ( !( --remaining ) ) {
-						master.resolveWith( resolveContexts, resolveValues );
-					}
-				};
-			};
-
-		// Single- and empty arguments are adopted like Promise.resolve
-		if ( remaining <= 1 ) {
-			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );
-
-			// Use .then() to unwrap secondary thenables (cf. gh-3000)
-			if ( master.state() === "pending" ||
-				jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
-
-				return master.then();
-			}
-		}
-
-		// Multiple arguments are aggregated like Promise.all array elements
-		while ( i-- ) {
-			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
-		}
-
-		return master.promise();
-	}
-} );
-
-
-// These usually indicate a programmer mistake during development,
-// warn about them ASAP rather than swallowing them by default.
-var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
-
-jQuery.Deferred.exceptionHook = function( error, stack ) {
-
-	// Support: IE 8 - 9 only
-	// Console exists when dev tools are open, which can happen at any time
-	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
-		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
-	}
-};
-
-
-
-
-jQuery.readyException = function( error ) {
-	window.setTimeout( function() {
-		throw error;
-	} );
-};
-
-
-
-
-// The deferred used on DOM ready
-var readyList = jQuery.Deferred();
-
-jQuery.fn.ready = function( fn ) {
-
-	readyList
-		.then( fn )
-
-		// Wrap jQuery.readyException in a function so that the lookup
-		// happens at the time of error handling instead of callback
-		// registration.
-		.catch( function( error ) {
-			jQuery.readyException( error );
-		} );
-
-	return this;
-};
-
-jQuery.extend( {
-
-	// Is the DOM ready to be used? Set to true once it occurs.
-	isReady: false,
-
-	// A counter to track how many items to wait for before
-	// the ready event fires. See #6781
-	readyWait: 1,
-
-	// Hold (or release) the ready event
-	holdReady: function( hold ) {
-		if ( hold ) {
-			jQuery.readyWait++;
-		} else {
-			jQuery.ready( true );
-		}
-	},
-
-	// Handle when the DOM is ready
-	ready: function( wait ) {
-
-		// Abort if there are pending holds or we're already ready
-		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-			return;
-		}
-
-		// Remember that the DOM is ready
-		jQuery.isReady = true;
-
-		// If a normal DOM Ready event fired, decrement, and wait if need be
-		if ( wait !== true && --jQuery.readyWait > 0 ) {
-			return;
-		}
-
-		// If there are functions bound, to execute
-		readyList.resolveWith( document, [ jQuery ] );
-	}
-} );
-
-jQuery.ready.then = readyList.then;
-
-// The ready event handler and self cleanup method
-function completed() {
-	document.removeEventListener( "DOMContentLoaded", completed );
-	window.removeEventListener( "load", completed );
-	jQuery.ready();
-}
-
-// Catch cases where $(document).ready() is called
-// after the browser event has already occurred.
-// Support: IE <=9 - 10 only
-// Older IE sometimes signals "interactive" too soon
-if ( document.readyState === "complete" ||
-	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
-	// Handle it asynchronously to allow scripts the opportunity to delay ready
-	window.setTimeout( jQuery.ready );
-
-} else {
-
-	// Use the handy event callback
-	document.addEventListener( "DOMContentLoaded", completed );
-
-	// A fallback to window.onload, that will always work
-	window.addEventListener( "load", completed );
-}
-
-
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
-	var i = 0,
-		len = elems.length,
-		bulk = key == null;
-
-	// Sets many values
-	if ( jQuery.type( key ) === "object" ) {
-		chainable = true;
-		for ( i in key ) {
-			access( elems, fn, i, key[ i ], true, emptyGet, raw );
-		}
-
-	// Sets one value
-	} else if ( value !== undefined ) {
-		chainable = true;
-
-		if ( !jQuery.isFunction( value ) ) {
-			raw = true;
-		}
-
-		if ( bulk ) {
-
-			// Bulk operations run against the entire set
-			if ( raw ) {
-				fn.call( elems, value );
-				fn = null;
-
-			// ...except when executing function values
-			} else {
-				bulk = fn;
-				fn = function( elem, key, value ) {
-					return bulk.call( jQuery( elem ), value );
-				};
-			}
-		}
-
-		if ( fn ) {
-			for ( ; i < len; i++ ) {
-				fn(
-					elems[ i ], key, raw ?
-					value :
-					value.call( elems[ i ], i, fn( elems[ i ], key ) )
-				);
-			}
-		}
-	}
-
-	return chainable ?
-		elems :
-
-		// Gets
-		bulk ?
-			fn.call( elems ) :
-			len ? fn( elems[ 0 ], key ) : emptyGet;
-};
-var acceptData = function( owner ) {
-
-	// Accepts only:
-	//  - Node
-	//    - Node.ELEMENT_NODE
-	//    - Node.DOCUMENT_NODE
-	//  - Object
-	//    - Any
-	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-};
-
-
-
-
-function Data() {
-	this.expando = jQuery.expando + Data.uid++;
-}
-
-Data.uid = 1;
-
-Data.prototype = {
-
-	cache: function( owner ) {
-
-		// Check if the owner object already has a cache
-		var value = owner[ this.expando ];
-
-		// If not, create one
-		if ( !value ) {
-			value = {};
-
-			// We can accept data for non-element nodes in modern browsers,
-			// but we should not, see #8335.
-			// Always return an empty object.
-			if ( acceptData( owner ) ) {
-
-				// If it is a node unlikely to be stringify-ed or looped over
-				// use plain assignment
-				if ( owner.nodeType ) {
-					owner[ this.expando ] = value;
-
-				// Otherwise secure it in a non-enumerable property
-				// configurable must be true to allow the property to be
-				// deleted when data is removed
-				} else {
-					Object.defineProperty( owner, this.expando, {
-						value: value,
-						configurable: true
-					} );
-				}
-			}
-		}
-
-		return value;
-	},
-	set: function( owner, data, value ) {
-		var prop,
-			cache = this.cache( owner );
-
-		// Handle: [ owner, key, value ] args
-		// Always use camelCase key (gh-2257)
-		if ( typeof data === "string" ) {
-			cache[ jQuery.camelCase( data ) ] = value;
-
-		// Handle: [ owner, { properties } ] args
-		} else {
-
-			// Copy the properties one-by-one to the cache object
-			for ( prop in data ) {
-				cache[ jQuery.camelCase( prop ) ] = data[ prop ];
-			}
-		}
-		return cache;
-	},
-	get: function( owner, key ) {
-		return key === undefined ?
-			this.cache( owner ) :
-
-			// Always use camelCase key (gh-2257)
-			owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
-	},
-	access: function( owner, key, value ) {
-
-		// In cases where either:
-		//
-		//   1. No key was specified
-		//   2. A string key was specified, but no value provided
-		//
-		// Take the "read" path and allow the get method to determine
-		// which value to return, respectively either:
-		//
-		//   1. The entire cache object
-		//   2. The data stored at the key
-		//
-		if ( key === undefined ||
-				( ( key && typeof key === "string" ) && value === undefined ) ) {
-
-			return this.get( owner, key );
-		}
-
-		// When the key is not a string, or both a key and value
-		// are specified, set or extend (existing objects) with either:
-		//
-		//   1. An object of properties
-		//   2. A key and value
-		//
-		this.set( owner, key, value );
-
-		// Since the "set" path can have two possible entry points
-		// return the expected data based on which path was taken[*]
-		return value !== undefined ? value : key;
-	},
-	remove: function( owner, key ) {
-		var i,
-			cache = owner[ this.expando ];
-
-		if ( cache === undefined ) {
-			return;
-		}
-
-		if ( key !== undefined ) {
-
-			// Support array or space separated string of keys
-			if ( jQuery.isArray( key ) ) {
-
-				// If key is an array of keys...
-				// We always set camelCase keys, so remove that.
-				key = key.map( jQuery.camelCase );
-			} else {
-				key = jQuery.camelCase( key );
-
-				// If a key with the spaces exists, use it.
-				// Otherwise, create an array by matching non-whitespace
-				key = key in cache ?
-					[ key ] :
-					( key.match( rnotwhite ) || [] );
-			}
-
-			i = key.length;
-
-			while ( i-- ) {
-				delete cache[ key[ i ] ];
-			}
-		}
-
-		// Remove the expando if there's no more data
-		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
-
-			// Support: Chrome <=35 - 45
-			// Webkit & Blink performance suffers when deleting properties
-			// from DOM nodes, so set to undefined instead
-			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
-			if ( owner.nodeType ) {
-				owner[ this.expando ] = undefined;
-			} else {
-				delete owner[ this.expando ];
-			}
-		}
-	},
-	hasData: function( owner ) {
-		var cache = owner[ this.expando ];
-		return cache !== undefined && !jQuery.isEmptyObject( cache );
-	}
-};
-var dataPriv = new Data();
-
-var dataUser = new Data();
-
-
-
-//	Implementation Summary
-//
-//	1. Enforce API surface and semantic compatibility with 1.9.x branch
-//	2. Improve the module's maintainability by reducing the storage
-//		paths to a single mechanism.
-//	3. Use the same single mechanism to support "private" and "user" data.
-//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
-//	5. Avoid exposing implementation details on user objects (eg. expando properties)
-//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
-	rmultiDash = /[A-Z]/g;
-
-function dataAttr( elem, key, data ) {
-	var name;
-
-	// If nothing was found internally, try to fetch any
-	// data from the HTML5 data-* attribute
-	if ( data === undefined && elem.nodeType === 1 ) {
-		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
-		data = elem.getAttribute( name );
-
-		if ( typeof data === "string" ) {
-			try {
-				data = data === "true" ? true :
-					data === "false" ? false :
-					data === "null" ? null :
-
-					// Only convert to a number if it doesn't change the string
-					+data + "" === data ? +data :
-					rbrace.test( data ) ? JSON.parse( data ) :
-					data;
-			} catch ( e ) {}
-
-			// Make sure we set the data so it isn't changed later
-			dataUser.set( elem, key, data );
-		} else {
-			data = undefined;
-		}
-	}
-	return data;
-}
-
-jQuery.extend( {
-	hasData: function( elem ) {
-		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
-	},
-
-	data: function( elem, name, data ) {
-		return dataUser.access( elem, name, data );
-	},
-
-	removeData: function( elem, name ) {
-		dataUser.remove( elem, name );
-	},
-
-	// TODO: Now that all calls to _data and _removeData have been replaced
-	// with direct calls to dataPriv methods, these can be deprecated.
-	_data: function( elem, name, data ) {
-		return dataPriv.access( elem, name, data );
-	},
-
-	_removeData: function( elem, name ) {
-		dataPriv.remove( elem, name );
-	}
-} );
-
-jQuery.fn.extend( {
-	data: function( key, value ) {
-		var i, name, data,
-			elem = this[ 0 ],
-			attrs = elem && elem.attributes;
-
-		// Gets all values
-		if ( key === undefined ) {
-			if ( this.length ) {
-				data = dataUser.get( elem );
-
-				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
-					i = attrs.length;
-					while ( i-- ) {
-
-						// Support: IE 11 only
-						// The attrs elements can be null (#14894)
-						if ( attrs[ i ] ) {
-							name = attrs[ i ].name;
-							if ( name.indexOf( "data-" ) === 0 ) {
-								name = jQuery.camelCase( name.slice( 5 ) );
-								dataAttr( elem, name, data[ name ] );
-							}
-						}
-					}
-					dataPriv.set( elem, "hasDataAttrs", true );
-				}
-			}
-
-			return data;
-		}
-
-		// Sets multiple values
-		if ( typeof key === "object" ) {
-			return this.each( function() {
-				dataUser.set( this, key );
-			} );
-		}
-
-		return access( this, function( value ) {
-			var data;
-
-			// The calling jQuery object (element matches) is not empty
-			// (and therefore has an element appears at this[ 0 ]) and the
-			// `value` parameter was not undefined. An empty jQuery object
-			// will result in `undefined` for elem = this[ 0 ] which will
-			// throw an exception if an attempt to read a data cache is made.
-			if ( elem && value === undefined ) {
-
-				// Attempt to get data from the cache
-				// The key will always be camelCased in Data
-				data = dataUser.get( elem, key );
-				if ( data !== undefined ) {
-					return data;
-				}
-
-				// Attempt to "discover" the data in
-				// HTML5 custom data-* attrs
-				data = dataAttr( elem, key );
-				if ( data !== undefined ) {
-					return data;
-				}
-
-				// We tried really hard, but the data doesn't exist.
-				return;
-			}
-
-			// Set the data...
-			this.each( function() {
-
-				// We always store the camelCased key
-				dataUser.set( this, key, value );
-			} );
-		}, null, value, arguments.length > 1, null, true );
-	},
-
-	removeData: function( key ) {
-		return this.each( function() {
-			dataUser.remove( this, key );
-		} );
-	}
-} );
-
-
-jQuery.extend( {
-	queue: function( elem, type, data ) {
-		var queue;
-
-		if ( elem ) {
-			type = ( type || "fx" ) + "queue";
-			queue = dataPriv.get( elem, type );
-
-			// Speed up dequeue by getting out quickly if this is just a lookup
-			if ( data ) {
-				if ( !queue || jQuery.isArray( data ) ) {
-					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
-				} else {
-					queue.push( data );
-				}
-			}
-			return queue || [];
-		}
-	},
-
-	dequeue: function( elem, type ) {
-		type = type || "fx";
-
-		var queue = jQuery.queue( elem, type ),
-			startLength = queue.length,
-			fn = queue.shift(),
-			hooks = jQuery._queueHooks( elem, type ),
-			next = function() {
-				jQuery.dequeue( elem, type );
-			};
-
-		// If the fx queue is dequeued, always remove the progress sentinel
-		if ( fn === "inprogress" ) {
-			fn = queue.shift();
-			startLength--;
-		}
-
-		if ( fn ) {
-
-			// Add a progress sentinel to prevent the fx queue from being
-			// automatically dequeued
-			if ( type === "fx" ) {
-				queue.unshift( "inprogress" );
-			}
-
-			// Clear up the last queue stop function
-			delete hooks.stop;
-			fn.call( elem, next, hooks );
-		}
-
-		if ( !startLength && hooks ) {
-			hooks.empty.fire();
-		}
-	},
-
-	// Not public - generate a queueHooks object, or return the current one
-	_queueHooks: function( elem, type ) {
-		var key = type + "queueHooks";
-		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
-			empty: jQuery.Callbacks( "once memory" ).add( function() {
-				dataPriv.remove( elem, [ type + "queue", key ] );
-			} )
-		} );
-	}
-} );
-
-jQuery.fn.extend( {
-	queue: function( type, data ) {
-		var setter = 2;
-
-		if ( typeof type !== "string" ) {
-			data = type;
-			type = "fx";
-			setter--;
-		}
-
-		if ( arguments.length < setter ) {
-			return jQuery.queue( this[ 0 ], type );
-		}
-
-		return data === undefined ?
-			this :
-			this.each( function() {
-				var queue = jQuery.queue( this, type, data );
-
-				// Ensure a hooks for this queue
-				jQuery._queueHooks( this, type );
-
-				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
-					jQuery.dequeue( this, type );
-				}
-			} );
-	},
-	dequeue: function( type ) {
-		return this.each( function() {
-			jQuery.dequeue( this, type );
-		} );
-	},
-	clearQueue: function( type ) {
-		return this.queue( type || "fx", [] );
-	},
-
-	// Get a promise resolved when queues of a certain type
-	// are emptied (fx is the type by default)
-	promise: function( type, obj ) {
-		var tmp,
-			count = 1,
-			defer = jQuery.Deferred(),
-			elements = this,
-			i = this.length,
-			resolve = function() {
-				if ( !( --count ) ) {
-					defer.resolveWith( elements, [ elements ] );
-				}
-			};
-
-		if ( typeof type !== "string" ) {
-			obj = type;
-			type = undefined;
-		}
-		type = type || "fx";
-
-		while ( i-- ) {
-			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
-			if ( tmp && tmp.empty ) {
-				count++;
-				tmp.empty.add( resolve );
-			}
-		}
-		resolve();
-		return defer.promise( obj );
-	}
-} );
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-var isHiddenWithinTree = function( elem, el ) {
-
-		// isHiddenWithinTree might be called from jQuery#filter function;
-		// in that case, element will be second argument
-		elem = el || elem;
-
-		// Inline style trumps all
-		return elem.style.display === "none" ||
-			elem.style.display === "" &&
-
-			// Otherwise, check computed style
-			// Support: Firefox <=43 - 45
-			// Disconnected elements can have computed display: none, so first confirm that elem is
-			// in the document.
-			jQuery.contains( elem.ownerDocument, elem ) &&
-
-			jQuery.css( elem, "display" ) === "none";
-	};
-
-var swap = function( elem, options, callback, args ) {
-	var ret, name,
-		old = {};
-
-	// Remember the old values, and insert the new ones
-	for ( name in options ) {
-		old[ name ] = elem.style[ name ];
-		elem.style[ name ] = options[ name ];
-	}
-
-	ret = callback.apply( elem, args || [] );
-
-	// Revert the old values
-	for ( name in options ) {
-		elem.style[ name ] = old[ name ];
-	}
-
-	return ret;
-};
-
-
-
-
-function adjustCSS( elem, prop, valueParts, tween ) {
-	var adjusted,
-		scale = 1,
-		maxIterations = 20,
-		currentValue = tween ?
-			function() {
-				return tween.cur();
-			} :
-			function() {
-				return jQuery.css( elem, prop, "" );
-			},
-		initial = currentValue(),
-		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
-		// Starting value computation is required for potential unit mismatches
-		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
-			rcssNum.exec( jQuery.css( elem, prop ) );
-
-	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
-		// Trust units reported by jQuery.css
-		unit = unit || initialInUnit[ 3 ];
-
-		// Make sure we update the tween properties later on
-		valueParts = valueParts || [];
-
-		// Iteratively approximate from a nonzero starting point
-		initialInUnit = +initial || 1;
-
-		do {
-
-			// If previous iteration zeroed out, double until we get *something*.
-			// Use string for doubling so we don't accidentally see scale as unchanged below
-			scale = scale || ".5";
-
-			// Adjust and apply
-			initialInUnit = initialInUnit / scale;
-			jQuery.style( elem, prop, initialInUnit + unit );
-
-		// Update scale, tolerating zero or NaN from tween.cur()
-		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
-		} while (
-			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
-		);
-	}
-
-	if ( valueParts ) {
-		initialInUnit = +initialInUnit || +initial || 0;
-
-		// Apply relative offset (+=/-=) if specified
-		adjusted = valueParts[ 1 ] ?
-			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
-			+valueParts[ 2 ];
-		if ( tween ) {
-			tween.unit = unit;
-			tween.start = initialInUnit;
-			tween.end = adjusted;
-		}
-	}
-	return adjusted;
-}
-
-
-var defaultDisplayMap = {};
-
-function getDefaultDisplay( elem ) {
-	var temp,
-		doc = elem.ownerDocument,
-		nodeName = elem.nodeName,
-		display = defaultDisplayMap[ nodeName ];
-
-	if ( display ) {
-		return display;
-	}
-
-	temp = doc.body.appendChild( doc.createElement( nodeName ) ),
-	display = jQuery.css( temp, "display" );
-
-	temp.parentNode.removeChild( temp );
-
-	if ( display === "none" ) {
-		display = "block";
-	}
-	defaultDisplayMap[ nodeName ] = display;
-
-	return display;
-}
-
-function showHide( elements, show ) {
-	var display, elem,
-		values = [],
-		index = 0,
-		length = elements.length;
-
-	// Determine new display value for elements that need to change
-	for ( ; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-
-		display = elem.style.display;
-		if ( show ) {
-
-			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
-			// check is required in this first loop unless we have a nonempty display value (either
-			// inline or about-to-be-restored)
-			if ( display === "none" ) {
-				values[ index ] = dataPriv.get( elem, "display" ) || null;
-				if ( !values[ index ] ) {
-					elem.style.display = "";
-				}
-			}
-			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
-				values[ index ] = getDefaultDisplay( elem );
-			}
-		} else {
-			if ( display !== "none" ) {
-				values[ index ] = "none";
-
-				// Remember what we're overwriting
-				dataPriv.set( elem, "display", display );
-			}
-		}
-	}
-
-	// Set the display of the elements in a second loop to avoid constant reflow
-	for ( index = 0; index < length; index++ ) {
-		if ( values[ index ] != null ) {
-			elements[ index ].style.display = values[ index ];
-		}
-	}
-
-	return elements;
-}
-
-jQuery.fn.extend( {
-	show: function() {
-		return showHide( this, true );
-	},
-	hide: function() {
-		return showHide( this );
-	},
-	toggle: function( state ) {
-		if ( typeof state === "boolean" ) {
-			return state ? this.show() : this.hide();
-		}
-
-		return this.each( function() {
-			if ( isHiddenWithinTree( this ) ) {
-				jQuery( this ).show();
-			} else {
-				jQuery( this ).hide();
-			}
-		} );
-	}
-} );
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
-
-var rscriptType = ( /^$|\/(?:java|ecma)script/i );
-
-
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
-
-	// Support: IE <=9 only
-	option: [ 1, "<select multiple='multiple'>", "</select>" ],
-
-	// XHTML parsers do not magically insert elements in the
-	// same way that tag soup parsers do. So we cannot shorten
-	// this by omitting <tbody> or other required elements.
-	thead: [ 1, "<table>", "</table>" ],
-	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
-	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
-	_default: [ 0, "", "" ]
-};
-
-// Support: IE <=9 only
-wrapMap.optgroup = wrapMap.option;
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-
-function getAll( context, tag ) {
-
-	// Support: IE <=9 - 11 only
-	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
-	var ret = typeof context.getElementsByTagName !== "undefined" ?
-			context.getElementsByTagName( tag || "*" ) :
-			typeof context.querySelectorAll !== "undefined" ?
-				context.querySelectorAll( tag || "*" ) :
-			[];
-
-	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
-		jQuery.merge( [ context ], ret ) :
-		ret;
-}
-
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
-	var i = 0,
-		l = elems.length;
-
-	for ( ; i < l; i++ ) {
-		dataPriv.set(
-			elems[ i ],
-			"globalEval",
-			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
-		);
-	}
-}
-
-
-var rhtml = /<|&#?\w+;/;
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
-	var elem, tmp, tag, wrap, contains, j,
-		fragment = context.createDocumentFragment(),
-		nodes = [],
-		i = 0,
-		l = elems.length;
-
-	for ( ; i < l; i++ ) {
-		elem = elems[ i ];
-
-		if ( elem || elem === 0 ) {
-
-			// Add nodes directly
-			if ( jQuery.type( elem ) === "object" ) {
-
-				// Support: Android <=4.0 only, PhantomJS 1 only
-				// push.apply(_, arraylike) throws on ancient WebKit
-				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
-			// Convert non-html into a text node
-			} else if ( !rhtml.test( elem ) ) {
-				nodes.push( context.createTextNode( elem ) );
-
-			// Convert html into DOM nodes
-			} else {
-				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
-
-				// Deserialize a standard representation
-				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
-				wrap = wrapMap[ tag ] || wrapMap._default;
-				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
-				// Descend through wrappers to the right content
-				j = wrap[ 0 ];
-				while ( j-- ) {
-					tmp = tmp.lastChild;
-				}
-
-				// Support: Android <=4.0 only, PhantomJS 1 only
-				// push.apply(_, arraylike) throws on ancient WebKit
-				jQuery.merge( nodes, tmp.childNodes );
-
-				// Remember the top-level container
-				tmp = fragment.firstChild;
-
-				// Ensure the created nodes are orphaned (#12392)
-				tmp.textContent = "";
-			}
-		}
-	}
-
-	// Remove wrapper from fragment
-	fragment.textContent = "";
-
-	i = 0;
-	while ( ( elem = nodes[ i++ ] ) ) {
-
-		// Skip elements already in the context collection (trac-4087)
-		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
-			if ( ignored ) {
-				ignored.push( elem );
-			}
-			continue;
-		}
-
-		contains = jQuery.contains( elem.ownerDocument, elem );
-
-		// Append to fragment
-		tmp = getAll( fragment.appendChild( elem ), "script" );
-
-		// Preserve script evaluation history
-		if ( contains ) {
-			setGlobalEval( tmp );
-		}
-
-		// Capture executables
-		if ( scripts ) {
-			j = 0;
-			while ( ( elem = tmp[ j++ ] ) ) {
-				if ( rscriptType.test( elem.type || "" ) ) {
-					scripts.push( elem );
-				}
-			}
-		}
-	}
-
-	return fragment;
-}
-
-
-( function() {
-	var fragment = document.createDocumentFragment(),
-		div = fragment.appendChild( document.createElement( "div" ) ),
-		input = document.createElement( "input" );
-
-	// Support: Android 4.0 - 4.3 only
-	// Check state lost if the name is set (#11217)
-	// Support: Windows Web Apps (WWA)
-	// `name` and `type` must use .setAttribute for WWA (#14901)
-	input.setAttribute( "type", "radio" );
-	input.setAttribute( "checked", "checked" );
-	input.setAttribute( "name", "t" );
-
-	div.appendChild( input );
-
-	// Support: Android <=4.1 only
-	// Older WebKit doesn't clone checked state correctly in fragments
-	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-	// Support: IE <=11 only
-	// Make sure textarea (and checkbox) defaultValue is properly cloned
-	div.innerHTML = "<textarea>x</textarea>";
-	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-} )();
-var documentElement = document.documentElement;
-
-
-
-var
-	rkeyEvent = /^key/,
-	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
-	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
-	return true;
-}
-
-function returnFalse() {
-	return false;
-}
-
-// Support: IE <=9 only
-// See #13393 for more info
-function safeActiveElement() {
-	try {
-		return document.activeElement;
-	} catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
-	var origFn, type;
-
-	// Types can be a map of types/handlers
-	if ( typeof types === "object" ) {
-
-		// ( types-Object, selector, data )
-		if ( typeof selector !== "string" ) {
-
-			// ( types-Object, data )
-			data = data || selector;
-			selector = undefined;
-		}
-		for ( type in types ) {
-			on( elem, type, selector, data, types[ type ], one );
-		}
-		return elem;
-	}
-
-	if ( data == null && fn == null ) {
-
-		// ( types, fn )
-		fn = selector;
-		data = selector = undefined;
-	} else if ( fn == null ) {
-		if ( typeof selector === "string" ) {
-
-			// ( types, selector, fn )
-			fn = data;
-			data = undefined;
-		} else {
-
-			// ( types, data, fn )
-			fn = data;
-			data = selector;
-			selector = undefined;
-		}
-	}
-	if ( fn === false ) {
-		fn = returnFalse;
-	} else if ( !fn ) {
-		return elem;
-	}
-
-	if ( one === 1 ) {
-		origFn = fn;
-		fn = function( event ) {
-
-			// Can use an empty set, since event contains the info
-			jQuery().off( event );
-			return origFn.apply( this, arguments );
-		};
-
-		// Use same guid so caller can remove using origFn
-		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-	}
-	return elem.each( function() {
-		jQuery.event.add( this, types, fn, data, selector );
-	} );
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-	global: {},
-
-	add: function( elem, types, handler, data, selector ) {
-
-		var handleObjIn, eventHandle, tmp,
-			events, t, handleObj,
-			special, handlers, type, namespaces, origType,
-			elemData = dataPriv.get( elem );
-
-		// Don't attach events to noData or text/comment nodes (but allow plain objects)
-		if ( !elemData ) {
-			return;
-		}
-
-		// Caller can pass in an object of custom data in lieu of the handler
-		if ( handler.handler ) {
-			handleObjIn = handler;
-			handler = handleObjIn.handler;
-			selector = handleObjIn.selector;
-		}
-
-		// Ensure that invalid selectors throw exceptions at attach time
-		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
-		if ( selector ) {
-			jQuery.find.matchesSelector( documentElement, selector );
-		}
-
-		// Make sure that the handler has a unique ID, used to find/remove it later
-		if ( !handler.guid ) {
-			handler.guid = jQuery.guid++;
-		}
-
-		// Init the element's event structure and main handler, if this is the first
-		if ( !( events = elemData.events ) ) {
-			events = elemData.events = {};
-		}
-		if ( !( eventHandle = elemData.handle ) ) {
-			eventHandle = elemData.handle = function( e ) {
-
-				// Discard the second event of a jQuery.event.trigger() and
-				// when an event is called after a page has unloaded
-				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
-					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
-			};
-		}
-
-		// Handle multiple events separated by a space
-		types = ( types || "" ).match( rnotwhite ) || [ "" ];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[ t ] ) || [];
-			type = origType = tmp[ 1 ];
-			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-			// There *must* be a type, no attaching namespace-only handlers
-			if ( !type ) {
-				continue;
-			}
-
-			// If event changes its type, use the special event handlers for the changed type
-			special = jQuery.event.special[ type ] || {};
-
-			// If selector defined, determine special event api type, otherwise given type
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-
-			// Update special based on newly reset type
-			special = jQuery.event.special[ type ] || {};
-
-			// handleObj is passed to all event handlers
-			handleObj = jQuery.extend( {
-				type: type,
-				origType: origType,
-				data: data,
-				handler: handler,
-				guid: handler.guid,
-				selector: selector,
-				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-				namespace: namespaces.join( "." )
-			}, handleObjIn );
-
-			// Init the event handler queue if we're the first
-			if ( !( handlers = events[ type ] ) ) {
-				handlers = events[ type ] = [];
-				handlers.delegateCount = 0;
-
-				// Only use addEventListener if the special events handler returns false
-				if ( !special.setup ||
-					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
-					if ( elem.addEventListener ) {
-						elem.addEventListener( type, eventHandle );
-					}
-				}
-			}
-
-			if ( special.add ) {
-				special.add.call( elem, handleObj );
-
-				if ( !handleObj.handler.guid ) {
-					handleObj.handler.guid = handler.guid;
-				}
-			}
-
-			// Add to the element's handler list, delegates in front
-			if ( selector ) {
-				handlers.splice( handlers.delegateCount++, 0, handleObj );
-			} else {
-				handlers.push( handleObj );
-			}
-
-			// Keep track of which events have ever been used, for event optimization
-			jQuery.event.global[ type ] = true;
-		}
-
-	},
-
-	// Detach an event or set of events from an element
-	remove: function( elem, types, handler, selector, mappedTypes ) {
-
-		var j, origCount, tmp,
-			events, t, handleObj,
-			special, handlers, type, namespaces, origType,
-			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
-
-		if ( !elemData || !( events = elemData.events ) ) {
-			return;
-		}
-
-		// Once for each type.namespace in types; type may be omitted
-		types = ( types || "" ).match( rnotwhite ) || [ "" ];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[ t ] ) || [];
-			type = origType = tmp[ 1 ];
-			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-			// Unbind all events (on this namespace, if provided) for the element
-			if ( !type ) {
-				for ( type in events ) {
-					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-				}
-				continue;
-			}
-
-			special = jQuery.event.special[ type ] || {};
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-			handlers = events[ type ] || [];
-			tmp = tmp[ 2 ] &&
-				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
-			// Remove matching events
-			origCount = j = handlers.length;
-			while ( j-- ) {
-				handleObj = handlers[ j ];
-
-				if ( ( mappedTypes || origType === handleObj.origType ) &&
-					( !handler || handler.guid === handleObj.guid ) &&
-					( !tmp || tmp.test( handleObj.namespace ) ) &&
-					( !selector || selector === handleObj.selector ||
-						selector === "**" && handleObj.selector ) ) {
-					handlers.splice( j, 1 );
-
-					if ( handleObj.selector ) {
-						handlers.delegateCount--;
-					}
-					if ( special.remove ) {
-						special.remove.call( elem, handleObj );
-					}
-				}
-			}
-
-			// Remove generic event handler if we removed something and no more handlers exist
-			// (avoids potential for endless recursion during removal of special event handlers)
-			if ( origCount && !handlers.length ) {
-				if ( !special.teardown ||
-					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
-					jQuery.removeEvent( elem, type, elemData.handle );
-				}
-
-				delete events[ type ];
-			}
-		}
-
-		// Remove data and the expando if it's no longer used
-		if ( jQuery.isEmptyObject( events ) ) {
-			dataPriv.remove( elem, "handle events" );
-		}
-	},
-
-	dispatch: function( nativeEvent ) {
-
-		// Make a writable jQuery.Event from the native event object
-		var event = jQuery.event.fix( nativeEvent );
-
-		var i, j, ret, matched, handleObj, handlerQueue,
-			args = new Array( arguments.length ),
-			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
-			special = jQuery.event.special[ event.type ] || {};
-
-		// Use the fix-ed jQuery.Event rather than the (read-only) native event
-		args[ 0 ] = event;
-
-		for ( i = 1; i < arguments.length; i++ ) {
-			args[ i ] = arguments[ i ];
-		}
-
-		event.delegateTarget = this;
-
-		// Call the preDispatch hook for the mapped type, and let it bail if desired
-		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-			return;
-		}
-
-		// Determine handlers
-		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
-		// Run delegates first; they may want to stop propagation beneath us
-		i = 0;
-		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
-			event.currentTarget = matched.elem;
-
-			j = 0;
-			while ( ( handleObj = matched.handlers[ j++ ] ) &&
-				!event.isImmediatePropagationStopped() ) {
-
-				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
-				// a subset or equal to those in the bound event (both can have no namespace).
-				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
-
-					event.handleObj = handleObj;
-					event.data = handleObj.data;
-
-					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
-						handleObj.handler ).apply( matched.elem, args );
-
-					if ( ret !== undefined ) {
-						if ( ( event.result = ret ) === false ) {
-							event.preventDefault();
-							event.stopPropagation();
-						}
-					}
-				}
-			}
-		}
-
-		// Call the postDispatch hook for the mapped type
-		if ( special.postDispatch ) {
-			special.postDispatch.call( this, event );
-		}
-
-		return event.result;
-	},
-
-	handlers: function( event, handlers ) {
-		var i, matches, sel, handleObj,
-			handlerQueue = [],
-			delegateCount = handlers.delegateCount,
-			cur = event.target;
-
-		// Support: IE <=9
-		// Find delegate handlers
-		// Black-hole SVG <use> instance trees (#13180)
-		//
-		// Support: Firefox <=42
-		// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
-		if ( delegateCount && cur.nodeType &&
-			( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
-
-			for ( ; cur !== this; cur = cur.parentNode || this ) {
-
-				// Don't check non-elements (#13208)
-				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-				if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
-					matches = [];
-					for ( i = 0; i < delegateCount; i++ ) {
-						handleObj = handlers[ i ];
-
-						// Don't conflict with Object.prototype properties (#13203)
-						sel = handleObj.selector + " ";
-
-						if ( matches[ sel ] === undefined ) {
-							matches[ sel ] = handleObj.needsContext ?
-								jQuery( sel, this ).index( cur ) > -1 :
-								jQuery.find( sel, this, null, [ cur ] ).length;
-						}
-						if ( matches[ sel ] ) {
-							matches.push( handleObj );
-						}
-					}
-					if ( matches.length ) {
-						handlerQueue.push( { elem: cur, handlers: matches } );
-					}
-				}
-			}
-		}
-
-		// Add the remaining (directly-bound) handlers
-		if ( delegateCount < handlers.length ) {
-			handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
-		}
-
-		return handlerQueue;
-	},
-
-	addProp: function( name, hook ) {
-		Object.defineProperty( jQuery.Event.prototype, name, {
-			enumerable: true,
-			configurable: true,
-
-			get: jQuery.isFunction( hook ) ?
-				function() {
-					if ( this.originalEvent ) {
-							return hook( this.originalEvent );
-					}
-				} :
-				function() {
-					if ( this.originalEvent ) {
-							return this.originalEvent[ name ];
-					}
-				},
-
-			set: function( value ) {
-				Object.defineProperty( this, name, {
-					enumerable: true,
-					configurable: true,
-					writable: true,
-					value: value
-				} );
-			}
-		} );
-	},
-
-	fix: function( originalEvent ) {
-		return originalEvent[ jQuery.expando ] ?
-			originalEvent :
-			new jQuery.Event( originalEvent );
-	},
-
-	special: {
-		load: {
-
-			// Prevent triggered image.load events from bubbling to window.load
-			noBubble: true
-		},
-		focus: {
-
-			// Fire native event if possible so blur/focus sequence is correct
-			trigger: function() {
-				if ( this !== safeActiveElement() && this.focus ) {
-					this.focus();
-					return false;
-				}
-			},
-			delegateType: "focusin"
-		},
-		blur: {
-			trigger: function() {
-				if ( this === safeActiveElement() && this.blur ) {
-					this.blur();
-					return false;
-				}
-			},
-			delegateType: "focusout"
-		},
-		click: {
-
-			// For checkbox, fire native event so checked state will be right
-			trigger: function() {
-				if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
-					this.click();
-					return false;
-				}
-			},
-
-			// For cross-browser consistency, don't fire native .click() on links
-			_default: function( event ) {
-				return jQuery.nodeName( event.target, "a" );
-			}
-		},
-
-		beforeunload: {
-			postDispatch: function( event ) {
-
-				// Support: Firefox 20+
-				// Firefox doesn't alert if the returnValue field is not set.
-				if ( event.result !== undefined && event.originalEvent ) {
-					event.originalEvent.returnValue = event.result;
-				}
-			}
-		}
-	}
-};
-
-jQuery.removeEvent = function( elem, type, handle ) {
-
-	// This "if" is needed for plain objects
-	if ( elem.removeEventListener ) {
-		elem.removeEventListener( type, handle );
-	}
-};
-
-jQuery.Event = function( src, props ) {
-
-	// Allow instantiation without the 'new' keyword
-	if ( !( this instanceof jQuery.Event ) ) {
-		return new jQuery.Event( src, props );
-	}
-
-	// Event object
-	if ( src && src.type ) {
-		this.originalEvent = src;
-		this.type = src.type;
-
-		// Events bubbling up the document may have been marked as prevented
-		// by a handler lower down the tree; reflect the correct value.
-		this.isDefaultPrevented = src.defaultPrevented ||
-				src.defaultPrevented === undefined &&
-
-				// Support: Android <=2.3 only
-				src.returnValue === false ?
-			returnTrue :
-			returnFalse;
-
-		// Create target properties
-		// Support: Safari <=6 - 7 only
-		// Target should not be a text node (#504, #13143)
-		this.target = ( src.target && src.target.nodeType === 3 ) ?
-			src.target.parentNode :
-			src.target;
-
-		this.currentTarget = src.currentTarget;
-		this.relatedTarget = src.relatedTarget;
-
-	// Event type
-	} else {
-		this.type = src;
-	}
-
-	// Put explicitly provided properties onto the event object
-	if ( props ) {
-		jQuery.extend( this, props );
-	}
-
-	// Create a timestamp if incoming event doesn't have one
-	this.timeStamp = src && src.timeStamp || jQuery.now();
-
-	// Mark it as fixed
-	this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-	constructor: jQuery.Event,
-	isDefaultPrevented: returnFalse,
-	isPropagationStopped: returnFalse,
-	isImmediatePropagationStopped: returnFalse,
-	isSimulated: false,
-
-	preventDefault: function() {
-		var e = this.originalEvent;
-
-		this.isDefaultPrevented = returnTrue;
-
-		if ( e && !this.isSimulated ) {
-			e.preventDefault();
-		}
-	},
-	stopPropagation: function() {
-		var e = this.originalEvent;
-
-		this.isPropagationStopped = returnTrue;
-
-		if ( e && !this.isSimulated ) {
-			e.stopPropagation();
-		}
-	},
-	stopImmediatePropagation: function() {
-		var e = this.originalEvent;
-
-		this.isImmediatePropagationStopped = returnTrue;
-
-		if ( e && !this.isSimulated ) {
-			e.stopImmediatePropagation();
-		}
-
-		this.stopPropagation();
-	}
-};
-
-// Includes all common event props including KeyEvent and MouseEvent specific props
-jQuery.each( {
-	altKey: true,
-	bubbles: true,
-	cancelable: true,
-	changedTouches: true,
-	ctrlKey: true,
-	detail: true,
-	eventPhase: true,
-	metaKey: true,
-	pageX: true,
-	pageY: true,
-	shiftKey: true,
-	view: true,
-	"char": true,
-	charCode: true,
-	key: true,
-	keyCode: true,
-	button: true,
-	buttons: true,
-	clientX: true,
-	clientY: true,
-	offsetX: true,
-	offsetY: true,
-	pointerId: true,
-	pointerType: true,
-	screenX: true,
-	screenY: true,
-	targetTouches: true,
-	toElement: true,
-	touches: true,
-
-	which: function( event ) {
-		var button = event.button;
-
-		// Add which for key events
-		if ( event.which == null && rkeyEvent.test( event.type ) ) {
-			return event.charCode != null ? event.charCode : event.keyCode;
-		}
-
-		// Add which for click: 1 === left; 2 === middle; 3 === right
-		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
-			return ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-		}
-
-		return event.which;
-	}
-}, jQuery.event.addProp );
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
-	mouseenter: "mouseover",
-	mouseleave: "mouseout",
-	pointerenter: "pointerover",
-	pointerleave: "pointerout"
-}, function( orig, fix ) {
-	jQuery.event.special[ orig ] = {
-		delegateType: fix,
-		bindType: fix,
-
-		handle: function( event ) {
-			var ret,
-				target = this,
-				related = event.relatedTarget,
-				handleObj = event.handleObj;
-
-			// For mouseenter/leave call the handler if related is outside the target.
-			// NB: No relatedTarget if the mouse left/entered the browser window
-			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
-				event.type = handleObj.origType;
-				ret = handleObj.handler.apply( this, arguments );
-				event.type = fix;
-			}
-			return ret;
-		}
-	};
-} );
-
-jQuery.fn.extend( {
-
-	on: function( types, selector, data, fn ) {
-		return on( this, types, selector, data, fn );
-	},
-	one: function( types, selector, data, fn ) {
-		return on( this, types, selector, data, fn, 1 );
-	},
-	off: function( types, selector, fn ) {
-		var handleObj, type;
-		if ( types && types.preventDefault && types.handleObj ) {
-
-			// ( event )  dispatched jQuery.Event
-			handleObj = types.handleObj;
-			jQuery( types.delegateTarget ).off(
-				handleObj.namespace ?
-					handleObj.origType + "." + handleObj.namespace :
-					handleObj.origType,
-				handleObj.selector,
-				handleObj.handler
-			);
-			return this;
-		}
-		if ( typeof types === "object" ) {
-
-			// ( types-object [, selector] )
-			for ( type in types ) {
-				this.off( type, selector, types[ type ] );
-			}
-			return this;
-		}
-		if ( selector === false || typeof selector === "function" ) {
-
-			// ( types [, fn] )
-			fn = selector;
-			selector = undefined;
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		}
-		return this.each( function() {
-			jQuery.event.remove( this, types, fn, selector );
-		} );
-	}
-} );
-
-
-var
-
-	/* eslint-disable max-len */
-
-	// See https://github.com/eslint/eslint/issues/3229
-	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
-
-	/* eslint-enable */
-
-	// Support: IE <=10 - 11, Edge 12 - 13
-	// In IE/Edge using regex groups here causes severe slowdowns.
-	// See https://connect.microsoft.com/IE/feedback/details/1736512/
-	rnoInnerhtml = /<script|<style|<link/i,
-
-	// checked="checked" or checked
-	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-	rscriptTypeMasked = /^true\/(.*)/,
-	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
-
-function manipulationTarget( elem, content ) {
-	if ( jQuery.nodeName( elem, "table" ) &&
-		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
-
-		return elem.getElementsByTagName( "tbody" )[ 0 ] || elem;
-	}
-
-	return elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
-	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
-	return elem;
-}
-function restoreScript( elem ) {
-	var match = rscriptTypeMasked.exec( elem.type );
-
-	if ( match ) {
-		elem.type = match[ 1 ];
-	} else {
-		elem.removeAttribute( "type" );
-	}
-
-	return elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
-
-	if ( dest.nodeType !== 1 ) {
-		return;
-	}
-
-	// 1. Copy private data: events, handlers, etc.
-	if ( dataPriv.hasData( src ) ) {
-		pdataOld = dataPriv.access( src );
-		pdataCur = dataPriv.set( dest, pdataOld );
-		events = pdataOld.events;
-
-		if ( events ) {
-			delete pdataCur.handle;
-			pdataCur.events = {};
-
-			for ( type in events ) {
-				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-					jQuery.event.add( dest, type, events[ type ][ i ] );
-				}
-			}
-		}
-	}
-
-	// 2. Copy user data
-	if ( dataUser.hasData( src ) ) {
-		udataOld = dataUser.access( src );
-		udataCur = jQuery.extend( {}, udataOld );
-
-		dataUser.set( dest, udataCur );
-	}
-}
-
-// Fix IE bugs, see support tests
-function fixInput( src, dest ) {
-	var nodeName = dest.nodeName.toLowerCase();
-
-	// Fails to persist the checked state of a cloned checkbox or radio button.
-	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-		dest.checked = src.checked;
-
-	// Fails to return the selected option to the default selected state when cloning options
-	} else if ( nodeName === "input" || nodeName === "textarea" ) {
-		dest.defaultValue = src.defaultValue;
-	}
-}
-
-function domManip( collection, args, callback, ignored ) {
-
-	// Flatten any nested arrays
-	args = concat.apply( [], args );
-
-	var fragment, first, scripts, hasScripts, node, doc,
-		i = 0,
-		l = collection.length,
-		iNoClone = l - 1,
-		value = args[ 0 ],
-		isFunction = jQuery.isFunction( value );
-
-	// We can't cloneNode fragments that contain checked, in WebKit
-	if ( isFunction ||
-			( l > 1 && typeof value === "string" &&
-				!support.checkClone && rchecked.test( value ) ) ) {
-		return collection.each( function( index ) {
-			var self = collection.eq( index );
-			if ( isFunction ) {
-				args[ 0 ] = value.call( this, index, self.html() );
-			}
-			domManip( self, args, callback, ignored );
-		} );
-	}
-
-	if ( l ) {
-		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
-		first = fragment.firstChild;
-
-		if ( fragment.childNodes.length === 1 ) {
-			fragment = first;
-		}
-
-		// Require either new content or an interest in ignored elements to invoke the callback
-		if ( first || ignored ) {
-			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-			hasScripts = scripts.length;
-
-			// Use the original fragment for the last item
-			// instead of the first because it can end up
-			// being emptied incorrectly in certain situations (#8070).
-			for ( ; i < l; i++ ) {
-				node = fragment;
-
-				if ( i !== iNoClone ) {
-					node = jQuery.clone( node, true, true );
-
-					// Keep references to cloned scripts for later restoration
-					if ( hasScripts ) {
-
-						// Support: Android <=4.0 only, PhantomJS 1 only
-						// push.apply(_, arraylike) throws on ancient WebKit
-						jQuery.merge( scripts, getAll( node, "script" ) );
-					}
-				}
-
-				callback.call( collection[ i ], node, i );
-			}
-
-			if ( hasScripts ) {
-				doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-				// Reenable scripts
-				jQuery.map( scripts, restoreScript );
-
-				// Evaluate executable scripts on first document insertion
-				for ( i = 0; i < hasScripts; i++ ) {
-					node = scripts[ i ];
-					if ( rscriptType.test( node.type || "" ) &&
-						!dataPriv.access( node, "globalEval" ) &&
-						jQuery.contains( doc, node ) ) {
-
-						if ( node.src ) {
-
-							// Optional AJAX dependency, but won't run scripts if not present
-							if ( jQuery._evalUrl ) {
-								jQuery._evalUrl( node.src );
-							}
-						} else {
-							DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
-						}
-					}
-				}
-			}
-		}
-	}
-
-	return collection;
-}
-
-function remove( elem, selector, keepData ) {
-	var node,
-		nodes = selector ? jQuery.filter( selector, elem ) : elem,
-		i = 0;
-
-	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
-		if ( !keepData && node.nodeType === 1 ) {
-			jQuery.cleanData( getAll( node ) );
-		}
-
-		if ( node.parentNode ) {
-			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
-				setGlobalEval( getAll( node, "script" ) );
-			}
-			node.parentNode.removeChild( node );
-		}
-	}
-
-	return elem;
-}
-
-jQuery.extend( {
-	htmlPrefilter: function( html ) {
-		return html.replace( rxhtmlTag, "<$1></$2>" );
-	},
-
-	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-		var i, l, srcElements, destElements,
-			clone = elem.cloneNode( true ),
-			inPage = jQuery.contains( elem.ownerDocument, elem );
-
-		// Fix IE cloning issues
-		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
-				!jQuery.isXMLDoc( elem ) ) {
-
-			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
-			destElements = getAll( clone );
-			srcElements = getAll( elem );
-
-			for ( i = 0, l = srcElements.length; i < l; i++ ) {
-				fixInput( srcElements[ i ], destElements[ i ] );
-			}
-		}
-
-		// Copy the events from the original to the clone
-		if ( dataAndEvents ) {
-			if ( deepDataAndEvents ) {
-				srcElements = srcElements || getAll( elem );
-				destElements = destElements || getAll( clone );
-
-				for ( i = 0, l = srcElements.length; i < l; i++ ) {
-					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
-				}
-			} else {
-				cloneCopyEvent( elem, clone );
-			}
-		}
-
-		// Preserve script evaluation history
-		destElements = getAll( clone, "script" );
-		if ( destElements.length > 0 ) {
-			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
-		}
-
-		// Return the cloned set
-		return clone;
-	},
-
-	cleanData: function( elems ) {
-		var data, elem, type,
-			special = jQuery.event.special,
-			i = 0;
-
-		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
-			if ( acceptData( elem ) ) {
-				if ( ( data = elem[ dataPriv.expando ] ) ) {
-					if ( data.events ) {
-						for ( type in data.events ) {
-							if ( special[ type ] ) {
-								jQuery.event.remove( elem, type );
-
-							// This is a shortcut to avoid jQuery.event.remove's overhead
-							} else {
-								jQuery.removeEvent( elem, type, data.handle );
-							}
-						}
-					}
-
-					// Support: Chrome <=35 - 45+
-					// Assign undefined instead of using delete, see Data#remove
-					elem[ dataPriv.expando ] = undefined;
-				}
-				if ( elem[ dataUser.expando ] ) {
-
-					// Support: Chrome <=35 - 45+
-					// Assign undefined instead of using delete, see Data#remove
-					elem[ dataUser.expando ] = undefined;
-				}
-			}
-		}
-	}
-} );
-
-jQuery.fn.extend( {
-	detach: function( selector ) {
-		return remove( this, selector, true );
-	},
-
-	remove: function( selector ) {
-		return remove( this, selector );
-	},
-
-	text: function( value ) {
-		return access( this, function( value ) {
-			return value === undefined ?
-				jQuery.text( this ) :
-				this.empty().each( function() {
-					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-						this.textContent = value;
-					}
-				} );
-		}, null, value, arguments.length );
-	},
-
-	append: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				var target = manipulationTarget( this, elem );
-				target.appendChild( elem );
-			}
-		} );
-	},
-
-	prepend: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				var target = manipulationTarget( this, elem );
-				target.insertBefore( elem, target.firstChild );
-			}
-		} );
-	},
-
-	before: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this );
-			}
-		} );
-	},
-
-	after: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this.nextSibling );
-			}
-		} );
-	},
-
-	empty: function() {
-		var elem,
-			i = 0;
-
-		for ( ; ( elem = this[ i ] ) != null; i++ ) {
-			if ( elem.nodeType === 1 ) {
-
-				// Prevent memory leaks
-				jQuery.cleanData( getAll( elem, false ) );
-
-				// Remove any remaining nodes
-				elem.textContent = "";
-			}
-		}
-
-		return this;
-	},
-
-	clone: function( dataAndEvents, deepDataAndEvents ) {
-		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-		return this.map( function() {
-			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-		} );
-	},
-
-	html: function( value ) {
-		return access( this, function( value ) {
-			var elem = this[ 0 ] || {},
-				i = 0,
-				l = this.length;
-
-			if ( value === undefined && elem.nodeType === 1 ) {
-				return elem.innerHTML;
-			}
-
-			// See if we can take a shortcut and just use innerHTML
-			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
-				value = jQuery.htmlPrefilter( value );
-
-				try {
-					for ( ; i < l; i++ ) {
-						elem = this[ i ] || {};
-
-						// Remove element nodes and prevent memory leaks
-						if ( elem.nodeType === 1 ) {
-							jQuery.cleanData( getAll( elem, false ) );
-							elem.innerHTML = value;
-						}
-					}
-
-					elem = 0;
-
-				// If using innerHTML throws an exception, use the fallback method
-				} catch ( e ) {}
-			}
-
-			if ( elem ) {
-				this.empty().append( value );
-			}
-		}, null, value, arguments.length );
-	},
-
-	replaceWith: function() {
-		var ignored = [];
-
-		// Make the changes, replacing each non-ignored context element with the new content
-		return domManip( this, arguments, function( elem ) {
-			var parent = this.parentNode;
-
-			if ( jQuery.inArray( this, ignored ) < 0 ) {
-				jQuery.cleanData( getAll( this ) );
-				if ( parent ) {
-					parent.replaceChild( elem, this );
-				}
-			}
-
-		// Force callback invocation
-		}, ignored );
-	}
-} );
-
-jQuery.each( {
-	appendTo: "append",
-	prependTo: "prepend",
-	insertBefore: "before",
-	insertAfter: "after",
-	replaceAll: "replaceWith"
-}, function( name, original ) {
-	jQuery.fn[ name ] = function( selector ) {
-		var elems,
-			ret = [],
-			insert = jQuery( selector ),
-			last = insert.length - 1,
-			i = 0;
-
-		for ( ; i <= last; i++ ) {
-			elems = i === last ? this : this.clone( true );
-			jQuery( insert[ i ] )[ original ]( elems );
-
-			// Support: Android <=4.0 only, PhantomJS 1 only
-			// .get() because push.apply(_, arraylike) throws on ancient WebKit
-			push.apply( ret, elems.get() );
-		}
-
-		return this.pushStack( ret );
-	};
-} );
-var rmargin = ( /^margin/ );
-
-var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-
-var getStyles = function( elem ) {
-
-		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
-		// IE throws on elements created in popups
-		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
-		var view = elem.ownerDocument.defaultView;
-
-		if ( !view || !view.opener ) {
-			view = window;
-		}
-
-		return view.getComputedStyle( elem );
-	};
-
-
-
-( function() {
-
-	// Executing both pixelPosition & boxSizingReliable tests require only one layout
-	// so they're executed at the same time to save the second computation.
-	function computeStyleTests() {
-
-		// This is a singleton, we need to execute it only once
-		if ( !div ) {
-			return;
-		}
-
-		div.style.cssText =
-			"box-sizing:border-box;" +
-			"position:relative;display:block;" +
-			"margin:auto;border:1px;padding:1px;" +
-			"top:1%;width:50%";
-		div.innerHTML = "";
-		documentElement.appendChild( container );
-
-		var divStyle = window.getComputedStyle( div );
-		pixelPositionVal = divStyle.top !== "1%";
-
-		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
-		reliableMarginLeftVal = divStyle.marginLeft === "2px";
-		boxSizingReliableVal = divStyle.width === "4px";
-
-		// Support: Android 4.0 - 4.3 only
-		// Some styles come back with percentage values, even though they shouldn't
-		div.style.marginRight = "50%";
-		pixelMarginRightVal = divStyle.marginRight === "4px";
-
-		documentElement.removeChild( container );
-
-		// Nullify the div so it wouldn't be stored in the memory and
-		// it will also be a sign that checks already performed
-		div = null;
-	}
-
-	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
-		container = document.createElement( "div" ),
-		div = document.createElement( "div" );
-
-	// Finish early in limited (non-browser) environments
-	if ( !div.style ) {
-		return;
-	}
-
-	// Support: IE <=9 - 11 only
-	// Style of cloned element affects source element cloned (#8908)
-	div.style.backgroundClip = "content-box";
-	div.cloneNode( true ).style.backgroundClip = "";
-	support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
-		"padding:0;margin-top:1px;position:absolute";
-	container.appendChild( div );
-
-	jQuery.extend( support, {
-		pixelPosition: function() {
-			computeStyleTests();
-			return pixelPositionVal;
-		},
-		boxSizingReliable: function() {
-			computeStyleTests();
-			return boxSizingReliableVal;
-		},
-		pixelMarginRight: function() {
-			computeStyleTests();
-			return pixelMarginRightVal;
-		},
-		reliableMarginLeft: function() {
-			computeStyleTests();
-			return reliableMarginLeftVal;
-		}
-	} );
-} )();
-
-
-function curCSS( elem, name, computed ) {
-	var width, minWidth, maxWidth, ret,
-		style = elem.style;
-
-	computed = computed || getStyles( elem );
-
-	// Support: IE <=9 only
-	// getPropertyValue is only needed for .css('filter') (#12537)
-	if ( computed ) {
-		ret = computed.getPropertyValue( name ) || computed[ name ];
-
-		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-			ret = jQuery.style( elem, name );
-		}
-
-		// A tribute to the "awesome hack by Dean Edwards"
-		// Android Browser returns percentage for some values,
-		// but width seems to be reliably pixels.
-		// This is against the CSSOM draft spec:
-		// https://drafts.csswg.org/cssom/#resolved-values
-		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
-			// Remember the original values
-			width = style.width;
-			minWidth = style.minWidth;
-			maxWidth = style.maxWidth;
-
-			// Put in the new values to get a computed value out
-			style.minWidth = style.maxWidth = style.width = ret;
-			ret = computed.width;
-
-			// Revert the changed values
-			style.width = width;
-			style.minWidth = minWidth;
-			style.maxWidth = maxWidth;
-		}
-	}
-
-	return ret !== undefined ?
-
-		// Support: IE <=9 - 11 only
-		// IE returns zIndex value as an integer.
-		ret + "" :
-		ret;
-}
-
-
-function addGetHookIf( conditionFn, hookFn ) {
-
-	// Define the hook, we'll check on the first run if it's really needed.
-	return {
-		get: function() {
-			if ( conditionFn() ) {
-
-				// Hook not needed (or it's not possible to use it due
-				// to missing dependency), remove it.
-				delete this.get;
-				return;
-			}
-
-			// Hook needed; redefine it so that the support test is not executed again.
-			return ( this.get = hookFn ).apply( this, arguments );
-		}
-	};
-}
-
-
-var
-
-	// Swappable if display is none or starts with table
-	// except "table", "table-cell", or "table-caption"
-	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-	cssNormalTransform = {
-		letterSpacing: "0",
-		fontWeight: "400"
-	},
-
-	cssPrefixes = [ "Webkit", "Moz", "ms" ],
-	emptyStyle = document.createElement( "div" ).style;
-
-// Return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( name ) {
-
-	// Shortcut for names that are not vendor prefixed
-	if ( name in emptyStyle ) {
-		return name;
-	}
-
-	// Check for vendor prefixed names
-	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
-		i = cssPrefixes.length;
-
-	while ( i-- ) {
-		name = cssPrefixes[ i ] + capName;
-		if ( name in emptyStyle ) {
-			return name;
-		}
-	}
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-
-	// Any relative (+/-) values have already been
-	// normalized at this point
-	var matches = rcssNum.exec( value );
-	return matches ?
-
-		// Guard against undefined "subtract", e.g., when used as in cssHooks
-		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
-		value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
-	var i = extra === ( isBorderBox ? "border" : "content" ) ?
-
-		// If we already have the right measurement, avoid augmentation
-		4 :
-
-		// Otherwise initialize for horizontal or vertical properties
-		name === "width" ? 1 : 0,
-
-		val = 0;
-
-	for ( ; i < 4; i += 2 ) {
-
-		// Both box models exclude margin, so add it if we want it
-		if ( extra === "margin" ) {
-			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
-		}
-
-		if ( isBorderBox ) {
-
-			// border-box includes padding, so remove it if we want content
-			if ( extra === "content" ) {
-				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-			}
-
-			// At this point, extra isn't border nor margin, so remove border
-			if ( extra !== "margin" ) {
-				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		} else {
-
-			// At this point, extra isn't content, so add padding
-			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
-			// At this point, extra isn't content nor padding, so add border
-			if ( extra !== "padding" ) {
-				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		}
-	}
-
-	return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
-	// Start with offset property, which is equivalent to the border-box value
-	var val,
-		valueIsBorderBox = true,
-		styles = getStyles( elem ),
-		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
-	// Support: IE <=11 only
-	// Running getBoundingClientRect on a disconnected node
-	// in IE throws an error.
-	if ( elem.getClientRects().length ) {
-		val = elem.getBoundingClientRect()[ name ];
-	}
-
-	// Some non-html elements return undefined for offsetWidth, so check for null/undefined
-	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
-	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
-	if ( val <= 0 || val == null ) {
-
-		// Fall back to computed then uncomputed css if necessary
-		val = curCSS( elem, name, styles );
-		if ( val < 0 || val == null ) {
-			val = elem.style[ name ];
-		}
-
-		// Computed unit is not pixels. Stop here and return.
-		if ( rnumnonpx.test( val ) ) {
-			return val;
-		}
-
-		// Check for style in case a browser which returns unreliable values
-		// for getComputedStyle silently falls back to the reliable elem.style
-		valueIsBorderBox = isBorderBox &&
-			( support.boxSizingReliable() || val === elem.style[ name ] );
-
-		// Normalize "", auto, and prepare for extra
-		val = parseFloat( val ) || 0;
-	}
-
-	// Use the active box-sizing model to add/subtract irrelevant styles
-	return ( val +
-		augmentWidthOrHeight(
-			elem,
-			name,
-			extra || ( isBorderBox ? "border" : "content" ),
-			valueIsBorderBox,
-			styles
-		)
-	) + "px";
-}
-
-jQuery.extend( {
-
-	// Add in style property hooks for overriding the default
-	// behavior of getting and setting a style property
-	cssHooks: {
-		opacity: {
-			get: function( elem, computed ) {
-				if ( computed ) {
-
-					// We should always get a number back from opacity
-					var ret = curCSS( elem, "opacity" );
-					return ret === "" ? "1" : ret;
-				}
-			}
-		}
-	},
-
-	// Don't automatically add "px" to these possibly-unitless properties
-	cssNumber: {
-		"animationIterationCount": true,
-		"columnCount": true,
-		"fillOpacity": true,
-		"flexGrow": true,
-		"flexShrink": true,
-		"fontWeight": true,
-		"lineHeight": true,
-		"opacity": true,
-		"order": true,
-		"orphans": true,
-		"widows": true,
-		"zIndex": true,
-		"zoom": true
-	},
-
-	// Add in properties whose names you wish to fix before
-	// setting or getting the value
-	cssProps: {
-		"float": "cssFloat"
-	},
-
-	// Get and set the style property on a DOM Node
-	style: function( elem, name, value, extra ) {
-
-		// Don't set styles on text and comment nodes
-		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-			return;
-		}
-
-		// Make sure that we're working with the right name
-		var ret, type, hooks,
-			origName = jQuery.camelCase( name ),
-			style = elem.style;
-
-		name = jQuery.cssProps[ origName ] ||
-			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
-		// Gets hook for the prefixed version, then unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// Check if we're setting a value
-		if ( value !== undefined ) {
-			type = typeof value;
-
-			// Convert "+=" or "-=" to relative numbers (#7345)
-			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
-				value = adjustCSS( elem, name, ret );
-
-				// Fixes bug #9237
-				type = "number";
-			}
-
-			// Make sure that null and NaN values aren't set (#7116)
-			if ( value == null || value !== value ) {
-				return;
-			}
-
-			// If a number was passed in, add the unit (except for certain CSS properties)
-			if ( type === "number" ) {
-				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
-			}
-
-			// background-* props affect original clone's values
-			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
-				style[ name ] = "inherit";
-			}
-
-			// If a hook was provided, use that value, otherwise just set the specified value
-			if ( !hooks || !( "set" in hooks ) ||
-				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
-
-				style[ name ] = value;
-			}
-
-		} else {
-
-			// If a hook was provided get the non-computed value from there
-			if ( hooks && "get" in hooks &&
-				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
-
-				return ret;
-			}
-
-			// Otherwise just get the value from the style object
-			return style[ name ];
-		}
-	},
-
-	css: function( elem, name, extra, styles ) {
-		var val, num, hooks,
-			origName = jQuery.camelCase( name );
-
-		// Make sure that we're working with the right name
-		name = jQuery.cssProps[ origName ] ||
-			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
-		// Try prefixed name followed by the unprefixed name
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// If a hook was provided get the computed value from there
-		if ( hooks && "get" in hooks ) {
-			val = hooks.get( elem, true, extra );
-		}
-
-		// Otherwise, if a way to get the computed value exists, use that
-		if ( val === undefined ) {
-			val = curCSS( elem, name, styles );
-		}
-
-		// Convert "normal" to computed value
-		if ( val === "normal" && name in cssNormalTransform ) {
-			val = cssNormalTransform[ name ];
-		}
-
-		// Make numeric if forced or a qualifier was provided and val looks numeric
-		if ( extra === "" || extra ) {
-			num = parseFloat( val );
-			return extra === true || isFinite( num ) ? num || 0 : val;
-		}
-		return val;
-	}
-} );
-
-jQuery.each( [ "height", "width" ], function( i, name ) {
-	jQuery.cssHooks[ name ] = {
-		get: function( elem, computed, extra ) {
-			if ( computed ) {
-
-				// Certain elements can have dimension info if we invisibly show them
-				// but it must have a current display style that would benefit
-				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
-
-					// Support: Safari 8+
-					// Table columns in Safari have non-zero offsetWidth & zero
-					// getBoundingClientRect().width unless display is changed.
-					// Support: IE <=11 only
-					// Running getBoundingClientRect on a disconnected node
-					// in IE throws an error.
-					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
-						swap( elem, cssShow, function() {
-							return getWidthOrHeight( elem, name, extra );
-						} ) :
-						getWidthOrHeight( elem, name, extra );
-			}
-		},
-
-		set: function( elem, value, extra ) {
-			var matches,
-				styles = extra && getStyles( elem ),
-				subtract = extra && augmentWidthOrHeight(
-					elem,
-					name,
-					extra,
-					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-					styles
-				);
-
-			// Convert to pixels if value adjustment is needed
-			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
-				( matches[ 3 ] || "px" ) !== "px" ) {
-
-				elem.style[ name ] = value;
-				value = jQuery.css( elem, name );
-			}
-
-			return setPositiveNumber( elem, value, subtract );
-		}
-	};
-} );
-
-jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
-	function( elem, computed ) {
-		if ( computed ) {
-			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
-				elem.getBoundingClientRect().left -
-					swap( elem, { marginLeft: 0 }, function() {
-						return elem.getBoundingClientRect().left;
-					} )
-				) + "px";
-		}
-	}
-);
-
-// These hooks are used by animate to expand properties
-jQuery.each( {
-	margin: "",
-	padding: "",
-	border: "Width"
-}, function( prefix, suffix ) {
-	jQuery.cssHooks[ prefix + suffix ] = {
-		expand: function( value ) {
-			var i = 0,
-				expanded = {},
-
-				// Assumes a single number if not a string
-				parts = typeof value === "string" ? value.split( " " ) : [ value ];
-
-			for ( ; i < 4; i++ ) {
-				expanded[ prefix + cssExpand[ i ] + suffix ] =
-					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-			}
-
-			return expanded;
-		}
-	};
-
-	if ( !rmargin.test( prefix ) ) {
-		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-	}
-} );
-
-jQuery.fn.extend( {
-	css: function( name, value ) {
-		return access( this, function( elem, name, value ) {
-			var styles, len,
-				map = {},
-				i = 0;
-
-			if ( jQuery.isArray( name ) ) {
-				styles = getStyles( elem );
-				len = name.length;
-
-				for ( ; i < len; i++ ) {
-					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
-				}
-
-				return map;
-			}
-
-			return value !== undefined ?
-				jQuery.style( elem, name, value ) :
-				jQuery.css( elem, name );
-		}, name, value, arguments.length > 1 );
-	}
-} );
-
-
-function Tween( elem, options, prop, end, easing ) {
-	return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
-	constructor: Tween,
-	init: function( elem, options, prop, end, easing, unit ) {
-		this.elem = elem;
-		this.prop = prop;
-		this.easing = easing || jQuery.easing._default;
-		this.options = options;
-		this.start = this.now = this.cur();
-		this.end = end;
-		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-	},
-	cur: function() {
-		var hooks = Tween.propHooks[ this.prop ];
-
-		return hooks && hooks.get ?
-			hooks.get( this ) :
-			Tween.propHooks._default.get( this );
-	},
-	run: function( percent ) {
-		var eased,
-			hooks = Tween.propHooks[ this.prop ];
-
-		if ( this.options.duration ) {
-			this.pos = eased = jQuery.easing[ this.easing ](
-				percent, this.options.duration * percent, 0, 1, this.options.duration
-			);
-		} else {
-			this.pos = eased = percent;
-		}
-		this.now = ( this.end - this.start ) * eased + this.start;
-
-		if ( this.options.step ) {
-			this.options.step.call( this.elem, this.now, this );
-		}
-
-		if ( hooks && hooks.set ) {
-			hooks.set( this );
-		} else {
-			Tween.propHooks._default.set( this );
-		}
-		return this;
-	}
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
-	_default: {
-		get: function( tween ) {
-			var result;
-
-			// Use a property on the element directly when it is not a DOM element,
-			// or when there is no matching style property that exists.
-			if ( tween.elem.nodeType !== 1 ||
-				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
-				return tween.elem[ tween.prop ];
-			}
-
-			// Passing an empty string as a 3rd parameter to .css will automatically
-			// attempt a parseFloat and fallback to a string if the parse fails.
-			// Simple values such as "10px" are parsed to Float;
-			// complex values such as "rotate(1rad)" are returned as-is.
-			result = jQuery.css( tween.elem, tween.prop, "" );
-
-			// Empty strings, null, undefined and "auto" are converted to 0.
-			return !result || result === "auto" ? 0 : result;
-		},
-		set: function( tween ) {
-
-			// Use step hook for back compat.
-			// Use cssHook if its there.
-			// Use .style if available and use plain properties where available.
-			if ( jQuery.fx.step[ tween.prop ] ) {
-				jQuery.fx.step[ tween.prop ]( tween );
-			} else if ( tween.elem.nodeType === 1 &&
-				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
-					jQuery.cssHooks[ tween.prop ] ) ) {
-				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-			} else {
-				tween.elem[ tween.prop ] = tween.now;
-			}
-		}
-	}
-};
-
-// Support: IE <=9 only
-// Panic based approach to setting things on disconnected nodes
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-	set: function( tween ) {
-		if ( tween.elem.nodeType && tween.elem.parentNode ) {
-			tween.elem[ tween.prop ] = tween.now;
-		}
-	}
-};
-
-jQuery.easing = {
-	linear: function( p ) {
-		return p;
-	},
-	swing: function( p ) {
-		return 0.5 - Math.cos( p * Math.PI ) / 2;
-	},
-	_default: "swing"
-};
-
-jQuery.fx = Tween.prototype.init;
-
-// Back compat <1.8 extension point
-jQuery.fx.step = {};
-
-
-
-
-var
-	fxNow, timerId,
-	rfxtypes = /^(?:toggle|show|hide)$/,
-	rrun = /queueHooks$/;
-
-function raf() {
-	if ( timerId ) {
-		window.requestAnimationFrame( raf );
-		jQuery.fx.tick();
-	}
-}
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-	window.setTimeout( function() {
-		fxNow = undefined;
-	} );
-	return ( fxNow = jQuery.now() );
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-	var which,
-		i = 0,
-		attrs = { height: type };
-
-	// If we include width, step value is 1 to do all cssExpand values,
-	// otherwise step value is 2 to skip over Left and Right
-	includeWidth = includeWidth ? 1 : 0;
-	for ( ; i < 4; i += 2 - includeWidth ) {
-		which = cssExpand[ i ];
-		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-	}
-
-	if ( includeWidth ) {
-		attrs.opacity = attrs.width = type;
-	}
-
-	return attrs;
-}
-
-function createTween( value, prop, animation ) {
-	var tween,
-		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
-		index = 0,
-		length = collection.length;
-	for ( ; index < length; index++ ) {
-		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
-
-			// We're done with this property
-			return tween;
-		}
-	}
-}
-
-function defaultPrefilter( elem, props, opts ) {
-	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
-		isBox = "width" in props || "height" in props,
-		anim = this,
-		orig = {},
-		style = elem.style,
-		hidden = elem.nodeType && isHiddenWithinTree( elem ),
-		dataShow = dataPriv.get( elem, "fxshow" );
-
-	// Queue-skipping animations hijack the fx hooks
-	if ( !opts.queue ) {
-		hooks = jQuery._queueHooks( elem, "fx" );
-		if ( hooks.unqueued == null ) {
-			hooks.unqueued = 0;
-			oldfire = hooks.empty.fire;
-			hooks.empty.fire = function() {
-				if ( !hooks.unqueued ) {
-					oldfire();
-				}
-			};
-		}
-		hooks.unqueued++;
-
-		anim.always( function() {
-
-			// Ensure the complete handler is called before this completes
-			anim.always( function() {
-				hooks.unqueued--;
-				if ( !jQuery.queue( elem, "fx" ).length ) {
-					hooks.empty.fire();
-				}
-			} );
-		} );
-	}
-
-	// Detect show/hide animations
-	for ( prop in props ) {
-		value = props[ prop ];
-		if ( rfxtypes.test( value ) ) {
-			delete props[ prop ];
-			toggle = toggle || value === "toggle";
-			if ( value === ( hidden ? "hide" : "show" ) ) {
-
-				// Pretend to be hidden if this is a "show" and
-				// there is still data from a stopped show/hide
-				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
-					hidden = true;
-
-				// Ignore all other no-op show/hide data
-				} else {
-					continue;
-				}
-			}
-			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
-		}
-	}
-
-	// Bail out if this is a no-op like .hide().hide()
-	propTween = !jQuery.isEmptyObject( props );
-	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
-		return;
-	}
-
-	// Restrict "overflow" and "display" styles during box animations
-	if ( isBox && elem.nodeType === 1 ) {
-
-		// Support: IE <=9 - 11, Edge 12 - 13
-		// Record all 3 overflow attributes because IE does not infer the shorthand
-		// from identically-valued overflowX and overflowY
-		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-		// Identify a display type, preferring old show/hide data over the CSS cascade
-		restoreDisplay = dataShow && dataShow.display;
-		if ( restoreDisplay == null ) {
-			restoreDisplay = dataPriv.get( elem, "display" );
-		}
-		display = jQuery.css( elem, "display" );
-		if ( display === "none" ) {
-			if ( restoreDisplay ) {
-				display = restoreDisplay;
-			} else {
-
-				// Get nonempty value(s) by temporarily forcing visibility
-				showHide( [ elem ], true );
-				restoreDisplay = elem.style.display || restoreDisplay;
-				display = jQuery.css( elem, "display" );
-				showHide( [ elem ] );
-			}
-		}
-
-		// Animate inline elements as inline-block
-		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
-			if ( jQuery.css( elem, "float" ) === "none" ) {
-
-				// Restore the original display value at the end of pure show/hide animations
-				if ( !propTween ) {
-					anim.done( function() {
-						style.display = restoreDisplay;
-					} );
-					if ( restoreDisplay == null ) {
-						display = style.display;
-						restoreDisplay = display === "none" ? "" : display;
-					}
-				}
-				style.display = "inline-block";
-			}
-		}
-	}
-
-	if ( opts.overflow ) {
-		style.overflow = "hidden";
-		anim.always( function() {
-			style.overflow = opts.overflow[ 0 ];
-			style.overflowX = opts.overflow[ 1 ];
-			style.overflowY = opts.overflow[ 2 ];
-		} );
-	}
-
-	// Implement show/hide animations
-	propTween = false;
-	for ( prop in orig ) {
-
-		// General show/hide setup for this element animation
-		if ( !propTween ) {
-			if ( dataShow ) {
-				if ( "hidden" in dataShow ) {
-					hidden = dataShow.hidden;
-				}
-			} else {
-				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
-			}
-
-			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
-			if ( toggle ) {
-				dataShow.hidden = !hidden;
-			}
-
-			// Show elements before animating them
-			if ( hidden ) {
-				showHide( [ elem ], true );
-			}
-
-			/* eslint-disable no-loop-func */
-
-			anim.done( function() {
-
-			/* eslint-enable no-loop-func */
-
-				// The final step of a "hide" animation is actually hiding the element
-				if ( !hidden ) {
-					showHide( [ elem ] );
-				}
-				dataPriv.remove( elem, "fxshow" );
-				for ( prop in orig ) {
-					jQuery.style( elem, prop, orig[ prop ] );
-				}
-			} );
-		}
-
-		// Per-property setup
-		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
-		if ( !( prop in dataShow ) ) {
-			dataShow[ prop ] = propTween.start;
-			if ( hidden ) {
-				propTween.end = propTween.start;
-				propTween.start = 0;
-			}
-		}
-	}
-}
-
-function propFilter( props, specialEasing ) {
-	var index, name, easing, value, hooks;
-
-	// camelCase, specialEasing and expand cssHook pass
-	for ( index in props ) {
-		name = jQuery.camelCase( index );
-		easing = specialEasing[ name ];
-		value = props[ index ];
-		if ( jQuery.isArray( value ) ) {
-			easing = value[ 1 ];
-			value = props[ index ] = value[ 0 ];
-		}
-
-		if ( index !== name ) {
-			props[ name ] = value;
-			delete props[ index ];
-		}
-
-		hooks = jQuery.cssHooks[ name ];
-		if ( hooks && "expand" in hooks ) {
-			value = hooks.expand( value );
-			delete props[ name ];
-
-			// Not quite $.extend, this won't overwrite existing keys.
-			// Reusing 'index' because we have the correct "name"
-			for ( index in value ) {
-				if ( !( index in props ) ) {
-					props[ index ] = value[ index ];
-					specialEasing[ index ] = easing;
-				}
-			}
-		} else {
-			specialEasing[ name ] = easing;
-		}
-	}
-}
-
-function Animation( elem, properties, options ) {
-	var result,
-		stopped,
-		index = 0,
-		length = Animation.prefilters.length,
-		deferred = jQuery.Deferred().always( function() {
-
-			// Don't match elem in the :animated selector
-			delete tick.elem;
-		} ),
-		tick = function() {
-			if ( stopped ) {
-				return false;
-			}
-			var currentTime = fxNow || createFxNow(),
-				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-
-				// Support: Android 2.3 only
-				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
-				temp = remaining / animation.duration || 0,
-				percent = 1 - temp,
-				index = 0,
-				length = animation.tweens.length;
-
-			for ( ; index < length; index++ ) {
-				animation.tweens[ index ].run( percent );
-			}
-
-			deferred.notifyWith( elem, [ animation, percent, remaining ] );
-
-			if ( percent < 1 && length ) {
-				return remaining;
-			} else {
-				deferred.resolveWith( elem, [ animation ] );
-				return false;
-			}
-		},
-		animation = deferred.promise( {
-			elem: elem,
-			props: jQuery.extend( {}, properties ),
-			opts: jQuery.extend( true, {
-				specialEasing: {},
-				easing: jQuery.easing._default
-			}, options ),
-			originalProperties: properties,
-			originalOptions: options,
-			startTime: fxNow || createFxNow(),
-			duration: options.duration,
-			tweens: [],
-			createTween: function( prop, end ) {
-				var tween = jQuery.Tween( elem, animation.opts, prop, end,
-						animation.opts.specialEasing[ prop ] || animation.opts.easing );
-				animation.tweens.push( tween );
-				return tween;
-			},
-			stop: function( gotoEnd ) {
-				var index = 0,
-
-					// If we are going to the end, we want to run all the tweens
-					// otherwise we skip this part
-					length = gotoEnd ? animation.tweens.length : 0;
-				if ( stopped ) {
-					return this;
-				}
-				stopped = true;
-				for ( ; index < length; index++ ) {
-					animation.tweens[ index ].run( 1 );
-				}
-
-				// Resolve when we played the last frame; otherwise, reject
-				if ( gotoEnd ) {
-					deferred.notifyWith( elem, [ animation, 1, 0 ] );
-					deferred.resolveWith( elem, [ animation, gotoEnd ] );
-				} else {
-					deferred.rejectWith( elem, [ animation, gotoEnd ] );
-				}
-				return this;
-			}
-		} ),
-		props = animation.props;
-
-	propFilter( props, animation.opts.specialEasing );
-
-	for ( ; index < length; index++ ) {
-		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
-		if ( result ) {
-			if ( jQuery.isFunction( result.stop ) ) {
-				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
-					jQuery.proxy( result.stop, result );
-			}
-			return result;
-		}
-	}
-
-	jQuery.map( props, createTween, animation );
-
-	if ( jQuery.isFunction( animation.opts.start ) ) {
-		animation.opts.start.call( elem, animation );
-	}
-
-	jQuery.fx.timer(
-		jQuery.extend( tick, {
-			elem: elem,
-			anim: animation,
-			queue: animation.opts.queue
-		} )
-	);
-
-	// attach callbacks from options
-	return animation.progress( animation.opts.progress )
-		.done( animation.opts.done, animation.opts.complete )
-		.fail( animation.opts.fail )
-		.always( animation.opts.always );
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
-	tweeners: {
-		"*": [ function( prop, value ) {
-			var tween = this.createTween( prop, value );
-			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
-			return tween;
-		} ]
-	},
-
-	tweener: function( props, callback ) {
-		if ( jQuery.isFunction( props ) ) {
-			callback = props;
-			props = [ "*" ];
-		} else {
-			props = props.match( rnotwhite );
-		}
-
-		var prop,
-			index = 0,
-			length = props.length;
-
-		for ( ; index < length; index++ ) {
-			prop = props[ index ];
-			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
-			Animation.tweeners[ prop ].unshift( callback );
-		}
-	},
-
-	prefilters: [ defaultPrefilter ],
-
-	prefilter: function( callback, prepend ) {
-		if ( prepend ) {
-			Animation.prefilters.unshift( callback );
-		} else {
-			Animation.prefilters.push( callback );
-		}
-	}
-} );
-
-jQuery.speed = function( speed, easing, fn ) {
-	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-		complete: fn || !fn && easing ||
-			jQuery.isFunction( speed ) && speed,
-		duration: speed,
-		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-	};
-
-	// Go to the end state if fx are off or if document is hidden
-	if ( jQuery.fx.off || document.hidden ) {
-		opt.duration = 0;
-
-	} else {
-		opt.duration = typeof opt.duration === "number" ?
-			opt.duration : opt.duration in jQuery.fx.speeds ?
-				jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-	}
-
-	// Normalize opt.queue - true/undefined/null -> "fx"
-	if ( opt.queue == null || opt.queue === true ) {
-		opt.queue = "fx";
-	}
-
-	// Queueing
-	opt.old = opt.complete;
-
-	opt.complete = function() {
-		if ( jQuery.isFunction( opt.old ) ) {
-			opt.old.call( this );
-		}
-
-		if ( opt.queue ) {
-			jQuery.dequeue( this, opt.queue );
-		}
-	};
-
-	return opt;
-};
-
-jQuery.fn.extend( {
-	fadeTo: function( speed, to, easing, callback ) {
-
-		// Show any hidden elements after setting opacity to 0
-		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
-
-			// Animate to the value specified
-			.end().animate( { opacity: to }, speed, easing, callback );
-	},
-	animate: function( prop, speed, easing, callback ) {
-		var empty = jQuery.isEmptyObject( prop ),
-			optall = jQuery.speed( speed, easing, callback ),
-			doAnimation = function() {
-
-				// Operate on a copy of prop so per-property easing won't be lost
-				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
-				// Empty animations, or finishing resolves immediately
-				if ( empty || dataPriv.get( this, "finish" ) ) {
-					anim.stop( true );
-				}
-			};
-			doAnimation.finish = doAnimation;
-
-		return empty || optall.queue === false ?
-			this.each( doAnimation ) :
-			this.queue( optall.queue, doAnimation );
-	},
-	stop: function( type, clearQueue, gotoEnd ) {
-		var stopQueue = function( hooks ) {
-			var stop = hooks.stop;
-			delete hooks.stop;
-			stop( gotoEnd );
-		};
-
-		if ( typeof type !== "string" ) {
-			gotoEnd = clearQueue;
-			clearQueue = type;
-			type = undefined;
-		}
-		if ( clearQueue && type !== false ) {
-			this.queue( type || "fx", [] );
-		}
-
-		return this.each( function() {
-			var dequeue = true,
-				index = type != null && type + "queueHooks",
-				timers = jQuery.timers,
-				data = dataPriv.get( this );
-
-			if ( index ) {
-				if ( data[ index ] && data[ index ].stop ) {
-					stopQueue( data[ index ] );
-				}
-			} else {
-				for ( index in data ) {
-					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-						stopQueue( data[ index ] );
-					}
-				}
-			}
-
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this &&
-					( type == null || timers[ index ].queue === type ) ) {
-
-					timers[ index ].anim.stop( gotoEnd );
-					dequeue = false;
-					timers.splice( index, 1 );
-				}
-			}
-
-			// Start the next in the queue if the last step wasn't forced.
-			// Timers currently will call their complete callbacks, which
-			// will dequeue but only if they were gotoEnd.
-			if ( dequeue || !gotoEnd ) {
-				jQuery.dequeue( this, type );
-			}
-		} );
-	},
-	finish: function( type ) {
-		if ( type !== false ) {
-			type = type || "fx";
-		}
-		return this.each( function() {
-			var index,
-				data = dataPriv.get( this ),
-				queue = data[ type + "queue" ],
-				hooks = data[ type + "queueHooks" ],
-				timers = jQuery.timers,
-				length = queue ? queue.length : 0;
-
-			// Enable finishing flag on private data
-			data.finish = true;
-
-			// Empty the queue first
-			jQuery.queue( this, type, [] );
-
-			if ( hooks && hooks.stop ) {
-				hooks.stop.call( this, true );
-			}
-
-			// Look for any active animations, and finish them
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
-					timers[ index ].anim.stop( true );
-					timers.splice( index, 1 );
-				}
-			}
-
-			// Look for any animations in the old queue and finish them
-			for ( index = 0; index < length; index++ ) {
-				if ( queue[ index ] && queue[ index ].finish ) {
-					queue[ index ].finish.call( this );
-				}
-			}
-
-			// Turn off finishing flag
-			delete data.finish;
-		} );
-	}
-} );
-
-jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
-	var cssFn = jQuery.fn[ name ];
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return speed == null || typeof speed === "boolean" ?
-			cssFn.apply( this, arguments ) :
-			this.animate( genFx( name, true ), speed, easing, callback );
-	};
-} );
-
-// Generate shortcuts for custom animations
-jQuery.each( {
-	slideDown: genFx( "show" ),
-	slideUp: genFx( "hide" ),
-	slideToggle: genFx( "toggle" ),
-	fadeIn: { opacity: "show" },
-	fadeOut: { opacity: "hide" },
-	fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return this.animate( props, speed, easing, callback );
-	};
-} );
-
-jQuery.timers = [];
-jQuery.fx.tick = function() {
-	var timer,
-		i = 0,
-		timers = jQuery.timers;
-
-	fxNow = jQuery.now();
-
-	for ( ; i < timers.length; i++ ) {
-		timer = timers[ i ];
-
-		// Checks the timer has not already been removed
-		if ( !timer() && timers[ i ] === timer ) {
-			timers.splice( i--, 1 );
-		}
-	}
-
-	if ( !timers.length ) {
-		jQuery.fx.stop();
-	}
-	fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
-	jQuery.timers.push( timer );
-	if ( timer() ) {
-		jQuery.fx.start();
-	} else {
-		jQuery.timers.pop();
-	}
-};
-
-jQuery.fx.interval = 13;
-jQuery.fx.start = function() {
-	if ( !timerId ) {
-		timerId = window.requestAnimationFrame ?
-			window.requestAnimationFrame( raf ) :
-			window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
-	}
-};
-
-jQuery.fx.stop = function() {
-	if ( window.cancelAnimationFrame ) {
-		window.cancelAnimationFrame( timerId );
-	} else {
-		window.clearInterval( timerId );
-	}
-
-	timerId = null;
-};
-
-jQuery.fx.speeds = {
-	slow: 600,
-	fast: 200,
-
-	// Default speed
-	_default: 400
-};
-
-
-// Based off of the plugin by Clint Helfers, with permission.
-// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-jQuery.fn.delay = function( time, type ) {
-	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-	type = type || "fx";
-
-	return this.queue( type, function( next, hooks ) {
-		var timeout = window.setTimeout( next, time );
-		hooks.stop = function() {
-			window.clearTimeout( timeout );
-		};
-	} );
-};
-
-
-( function() {
-	var input = document.createElement( "input" ),
-		select = document.createElement( "select" ),
-		opt = select.appendChild( document.createElement( "option" ) );
-
-	input.type = "checkbox";
-
-	// Support: Android <=4.3 only
-	// Default value for a checkbox should be "on"
-	support.checkOn = input.value !== "";
-
-	// Support: IE <=11 only
-	// Must access selectedIndex to make default options select
-	support.optSelected = opt.selected;
-
-	// Support: IE <=11 only
-	// An input loses its value after becoming a radio
-	input = document.createElement( "input" );
-	input.value = "t";
-	input.type = "radio";
-	support.radioValue = input.value === "t";
-} )();
-
-
-var boolHook,
-	attrHandle = jQuery.expr.attrHandle;
-
-jQuery.fn.extend( {
-	attr: function( name, value ) {
-		return access( this, jQuery.attr, name, value, arguments.length > 1 );
-	},
-
-	removeAttr: function( name ) {
-		return this.each( function() {
-			jQuery.removeAttr( this, name );
-		} );
-	}
-} );
-
-jQuery.extend( {
-	attr: function( elem, name, value ) {
-		var ret, hooks,
-			nType = elem.nodeType;
-
-		// Don't get/set attributes on text, comment and attribute nodes
-		if ( nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		// Fallback to prop when attributes are not supported
-		if ( typeof elem.getAttribute === "undefined" ) {
-			return jQuery.prop( elem, name, value );
-		}
-
-		// Attribute hooks are determined by the lowercase version
-		// Grab necessary hook if one is defined
-		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
-				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
-		}
-
-		if ( value !== undefined ) {
-			if ( value === null ) {
-				jQuery.removeAttr( elem, name );
-				return;
-			}
-
-			if ( hooks && "set" in hooks &&
-				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-				return ret;
-			}
-
-			elem.setAttribute( name, value + "" );
-			return value;
-		}
-
-		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-			return ret;
-		}
-
-		ret = jQuery.find.attr( elem, name );
-
-		// Non-existent attributes return null, we normalize to undefined
-		return ret == null ? undefined : ret;
-	},
-
-	attrHooks: {
-		type: {
-			set: function( elem, value ) {
-				if ( !support.radioValue && value === "radio" &&
-					jQuery.nodeName( elem, "input" ) ) {
-					var val = elem.value;
-					elem.setAttribute( "type", value );
-					if ( val ) {
-						elem.value = val;
-					}
-					return value;
-				}
-			}
-		}
-	},
-
-	removeAttr: function( elem, value ) {
-		var name,
-			i = 0,
-			attrNames = value && value.match( rnotwhite );
-
-		if ( attrNames && elem.nodeType === 1 ) {
-			while ( ( name = attrNames[ i++ ] ) ) {
-				elem.removeAttribute( name );
-			}
-		}
-	}
-} );
-
-// Hooks for boolean attributes
-boolHook = {
-	set: function( elem, value, name ) {
-		if ( value === false ) {
-
-			// Remove boolean attributes when set to false
-			jQuery.removeAttr( elem, name );
-		} else {
-			elem.setAttribute( name, name );
-		}
-		return name;
-	}
-};
-
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
-	var getter = attrHandle[ name ] || jQuery.find.attr;
-
-	attrHandle[ name ] = function( elem, name, isXML ) {
-		var ret, handle,
-			lowercaseName = name.toLowerCase();
-
-		if ( !isXML ) {
-
-			// Avoid an infinite loop by temporarily removing this function from the getter
-			handle = attrHandle[ lowercaseName ];
-			attrHandle[ lowercaseName ] = ret;
-			ret = getter( elem, name, isXML ) != null ?
-				lowercaseName :
-				null;
-			attrHandle[ lowercaseName ] = handle;
-		}
-		return ret;
-	};
-} );
-
-
-
-
-var rfocusable = /^(?:input|select|textarea|button)$/i,
-	rclickable = /^(?:a|area)$/i;
-
-jQuery.fn.extend( {
-	prop: function( name, value ) {
-		return access( this, jQuery.prop, name, value, arguments.length > 1 );
-	},
-
-	removeProp: function( name ) {
-		return this.each( function() {
-			delete this[ jQuery.propFix[ name ] || name ];
-		} );
-	}
-} );
-
-jQuery.extend( {
-	prop: function( elem, name, value ) {
-		var ret, hooks,
-			nType = elem.nodeType;
-
-		// Don't get/set properties on text, comment and attribute nodes
-		if ( nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
-			// Fix name and attach hooks
-			name = jQuery.propFix[ name ] || name;
-			hooks = jQuery.propHooks[ name ];
-		}
-
-		if ( value !== undefined ) {
-			if ( hooks && "set" in hooks &&
-				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-				return ret;
-			}
-
-			return ( elem[ name ] = value );
-		}
-
-		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-			return ret;
-		}
-
-		return elem[ name ];
-	},
-
-	propHooks: {
-		tabIndex: {
-			get: function( elem ) {
-
-				// Support: IE <=9 - 11 only
-				// elem.tabIndex doesn't always return the
-				// correct value when it hasn't been explicitly set
-				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-				// Use proper attribute retrieval(#12072)
-				var tabindex = jQuery.find.attr( elem, "tabindex" );
-
-				return tabindex ?
-					parseInt( tabindex, 10 ) :
-					rfocusable.test( elem.nodeName ) ||
-						rclickable.test( elem.nodeName ) && elem.href ?
-							0 :
-							-1;
-			}
-		}
-	},
-
-	propFix: {
-		"for": "htmlFor",
-		"class": "className"
-	}
-} );
-
-// Support: IE <=11 only
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-if ( !support.optSelected ) {
-	jQuery.propHooks.selected = {
-		get: function( elem ) {
-			var parent = elem.parentNode;
-			if ( parent && parent.parentNode ) {
-				parent.parentNode.selectedIndex;
-			}
-			return null;
-		},
-		set: function( elem ) {
-			var parent = elem.parentNode;
-			if ( parent ) {
-				parent.selectedIndex;
-
-				if ( parent.parentNode ) {
-					parent.parentNode.selectedIndex;
-				}
-			}
-		}
-	};
-}
-
-jQuery.each( [
-	"tabIndex",
-	"readOnly",
-	"maxLength",
-	"cellSpacing",
-	"cellPadding",
-	"rowSpan",
-	"colSpan",
-	"useMap",
-	"frameBorder",
-	"contentEditable"
-], function() {
-	jQuery.propFix[ this.toLowerCase() ] = this;
-} );
-
-
-
-
-var rclass = /[\t\r\n\f]/g;
-
-function getClass( elem ) {
-	return elem.getAttribute && elem.getAttribute( "class" ) || "";
-}
-
-jQuery.fn.extend( {
-	addClass: function( value ) {
-		var classes, elem, cur, curValue, clazz, j, finalValue,
-			i = 0;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each( function( j ) {
-				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
-			} );
-		}
-
-		if ( typeof value === "string" && value ) {
-			classes = value.match( rnotwhite ) || [];
-
-			while ( ( elem = this[ i++ ] ) ) {
-				curValue = getClass( elem );
-				cur = elem.nodeType === 1 &&
-					( " " + curValue + " " ).replace( rclass, " " );
-
-				if ( cur ) {
-					j = 0;
-					while ( ( clazz = classes[ j++ ] ) ) {
-						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
-							cur += clazz + " ";
-						}
-					}
-
-					// Only assign if different to avoid unneeded rendering.
-					finalValue = jQuery.trim( cur );
-					if ( curValue !== finalValue ) {
-						elem.setAttribute( "class", finalValue );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	removeClass: function( value ) {
-		var classes, elem, cur, curValue, clazz, j, finalValue,
-			i = 0;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each( function( j ) {
-				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
-			} );
-		}
-
-		if ( !arguments.length ) {
-			return this.attr( "class", "" );
-		}
-
-		if ( typeof value === "string" && value ) {
-			classes = value.match( rnotwhite ) || [];
-
-			while ( ( elem = this[ i++ ] ) ) {
-				curValue = getClass( elem );
-
-				// This expression is here for better compressibility (see addClass)
-				cur = elem.nodeType === 1 &&
-					( " " + curValue + " " ).replace( rclass, " " );
-
-				if ( cur ) {
-					j = 0;
-					while ( ( clazz = classes[ j++ ] ) ) {
-
-						// Remove *all* instances
-						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
-							cur = cur.replace( " " + clazz + " ", " " );
-						}
-					}
-
-					// Only assign if different to avoid unneeded rendering.
-					finalValue = jQuery.trim( cur );
-					if ( curValue !== finalValue ) {
-						elem.setAttribute( "class", finalValue );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	toggleClass: function( value, stateVal ) {
-		var type = typeof value;
-
-		if ( typeof stateVal === "boolean" && type === "string" ) {
-			return stateVal ? this.addClass( value ) : this.removeClass( value );
-		}
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each( function( i ) {
-				jQuery( this ).toggleClass(
-					value.call( this, i, getClass( this ), stateVal ),
-					stateVal
-				);
-			} );
-		}
-
-		return this.each( function() {
-			var className, i, self, classNames;
-
-			if ( type === "string" ) {
-
-				// Toggle individual class names
-				i = 0;
-				self = jQuery( this );
-				classNames = value.match( rnotwhite ) || [];
-
-				while ( ( className = classNames[ i++ ] ) ) {
-
-					// Check each className given, space separated list
-					if ( self.hasClass( className ) ) {
-						self.removeClass( className );
-					} else {
-						self.addClass( className );
-					}
-				}
-
-			// Toggle whole class name
-			} else if ( value === undefined || type === "boolean" ) {
-				className = getClass( this );
-				if ( className ) {
-
-					// Store className if set
-					dataPriv.set( this, "__className__", className );
-				}
-
-				// If the element has a class name or if we're passed `false`,
-				// then remove the whole classname (if there was one, the above saved it).
-				// Otherwise bring back whatever was previously saved (if anything),
-				// falling back to the empty string if nothing was stored.
-				if ( this.setAttribute ) {
-					this.setAttribute( "class",
-						className || value === false ?
-						"" :
-						dataPriv.get( this, "__className__" ) || ""
-					);
-				}
-			}
-		} );
-	},
-
-	hasClass: function( selector ) {
-		var className, elem,
-			i = 0;
-
-		className = " " + selector + " ";
-		while ( ( elem = this[ i++ ] ) ) {
-			if ( elem.nodeType === 1 &&
-				( " " + getClass( elem ) + " " ).replace( rclass, " " )
-					.indexOf( className ) > -1
-			) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-} );
-
-
-
-
-var rreturn = /\r/g,
-	rspaces = /[\x20\t\r\n\f]+/g;
-
-jQuery.fn.extend( {
-	val: function( value ) {
-		var hooks, ret, isFunction,
-			elem = this[ 0 ];
-
-		if ( !arguments.length ) {
-			if ( elem ) {
-				hooks = jQuery.valHooks[ elem.type ] ||
-					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-				if ( hooks &&
-					"get" in hooks &&
-					( ret = hooks.get( elem, "value" ) ) !== undefined
-				) {
-					return ret;
-				}
-
-				ret = elem.value;
-
-				return typeof ret === "string" ?
-
-					// Handle most common string cases
-					ret.replace( rreturn, "" ) :
-
-					// Handle cases where value is null/undef or number
-					ret == null ? "" : ret;
-			}
-
-			return;
-		}
-
-		isFunction = jQuery.isFunction( value );
-
-		return this.each( function( i ) {
-			var val;
-
-			if ( this.nodeType !== 1 ) {
-				return;
-			}
-
-			if ( isFunction ) {
-				val = value.call( this, i, jQuery( this ).val() );
-			} else {
-				val = value;
-			}
-
-			// Treat null/undefined as ""; convert numbers to string
-			if ( val == null ) {
-				val = "";
-
-			} else if ( typeof val === "number" ) {
-				val += "";
-
-			} else if ( jQuery.isArray( val ) ) {
-				val = jQuery.map( val, function( value ) {
-					return value == null ? "" : value + "";
-				} );
-			}
-
-			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-			// If set returns undefined, fall back to normal setting
-			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
-				this.value = val;
-			}
-		} );
-	}
-} );
-
-jQuery.extend( {
-	valHooks: {
-		option: {
-			get: function( elem ) {
-
-				var val = jQuery.find.attr( elem, "value" );
-				return val != null ?
-					val :
-
-					// Support: IE <=10 - 11 only
-					// option.text throws exceptions (#14686, #14858)
-					// Strip and collapse whitespace
-					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
-					jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
-			}
-		},
-		select: {
-			get: function( elem ) {
-				var value, option,
-					options = elem.options,
-					index = elem.selectedIndex,
-					one = elem.type === "select-one",
-					values = one ? null : [],
-					max = one ? index + 1 : options.length,
-					i = index < 0 ?
-						max :
-						one ? index : 0;
-
-				// Loop through all the selected options
-				for ( ; i < max; i++ ) {
-					option = options[ i ];
-
-					// Support: IE <=9 only
-					// IE8-9 doesn't update selected after form reset (#2551)
-					if ( ( option.selected || i === index ) &&
-
-							// Don't return options that are disabled or in a disabled optgroup
-							!option.disabled &&
-							( !option.parentNode.disabled ||
-								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
-						// Get the specific value for the option
-						value = jQuery( option ).val();
-
-						// We don't need an array for one selects
-						if ( one ) {
-							return value;
-						}
-
-						// Multi-Selects return an array
-						values.push( value );
-					}
-				}
-
-				return values;
-			},
-
-			set: function( elem, value ) {
-				var optionSet, option,
-					options = elem.options,
-					values = jQuery.makeArray( value ),
-					i = options.length;
-
-				while ( i-- ) {
-					option = options[ i ];
-
-					/* eslint-disable no-cond-assign */
-
-					if ( option.selected =
-						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
-					) {
-						optionSet = true;
-					}
-
-					/* eslint-enable no-cond-assign */
-				}
-
-				// Force browsers to behave consistently when non-matching value is set
-				if ( !optionSet ) {
-					elem.selectedIndex = -1;
-				}
-				return values;
-			}
-		}
-	}
-} );
-
-// Radios and checkboxes getter/setter
-jQuery.each( [ "radio", "checkbox" ], function() {
-	jQuery.valHooks[ this ] = {
-		set: function( elem, value ) {
-			if ( jQuery.isArray( value ) ) {
-				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
-			}
-		}
-	};
-	if ( !support.checkOn ) {
-		jQuery.valHooks[ this ].get = function( elem ) {
-			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
-		};
-	}
-} );
-
-
-
-
-// Return jQuery for attributes-only inclusion
-
-
-var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
-
-jQuery.extend( jQuery.event, {
-
-	trigger: function( event, data, elem, onlyHandlers ) {
-
-		var i, cur, tmp, bubbleType, ontype, handle, special,
-			eventPath = [ elem || document ],
-			type = hasOwn.call( event, "type" ) ? event.type : event,
-			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
-
-		cur = tmp = elem = elem || document;
-
-		// Don't do events on text and comment nodes
-		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-			return;
-		}
-
-		// focus/blur morphs to focusin/out; ensure we're not firing them right now
-		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-			return;
-		}
-
-		if ( type.indexOf( "." ) > -1 ) {
-
-			// Namespaced trigger; create a regexp to match event type in handle()
-			namespaces = type.split( "." );
-			type = namespaces.shift();
-			namespaces.sort();
-		}
-		ontype = type.indexOf( ":" ) < 0 && "on" + type;
-
-		// Caller can pass in a jQuery.Event object, Object, or just an event type string
-		event = event[ jQuery.expando ] ?
-			event :
-			new jQuery.Event( type, typeof event === "object" && event );
-
-		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
-		event.isTrigger = onlyHandlers ? 2 : 3;
-		event.namespace = namespaces.join( "." );
-		event.rnamespace = event.namespace ?
-			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
-			null;
-
-		// Clean up the event in case it is being reused
-		event.result = undefined;
-		if ( !event.target ) {
-			event.target = elem;
-		}
-
-		// Clone any incoming data and prepend the event, creating the handler arg list
-		data = data == null ?
-			[ event ] :
-			jQuery.makeArray( data, [ event ] );
-
-		// Allow special events to draw outside the lines
-		special = jQuery.event.special[ type ] || {};
-		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
-			return;
-		}
-
-		// Determine event propagation path in advance, per W3C events spec (#9951)
-		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-			bubbleType = special.delegateType || type;
-			if ( !rfocusMorph.test( bubbleType + type ) ) {
-				cur = cur.parentNode;
-			}
-			for ( ; cur; cur = cur.parentNode ) {
-				eventPath.push( cur );
-				tmp = cur;
-			}
-
-			// Only add window if we got to document (e.g., not plain obj or detached DOM)
-			if ( tmp === ( elem.ownerDocument || document ) ) {
-				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
-			}
-		}
-
-		// Fire handlers on the event path
-		i = 0;
-		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
-
-			event.type = i > 1 ?
-				bubbleType :
-				special.bindType || type;
-
-			// jQuery handler
-			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
-				dataPriv.get( cur, "handle" );
-			if ( handle ) {
-				handle.apply( cur, data );
-			}
-
-			// Native handler
-			handle = ontype && cur[ ontype ];
-			if ( handle && handle.apply && acceptData( cur ) ) {
-				event.result = handle.apply( cur, data );
-				if ( event.result === false ) {
-					event.preventDefault();
-				}
-			}
-		}
-		event.type = type;
-
-		// If nobody prevented the default action, do it now
-		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-			if ( ( !special._default ||
-				special._default.apply( eventPath.pop(), data ) === false ) &&
-				acceptData( elem ) ) {
-
-				// Call a native DOM method on the target with the same name as the event.
-				// Don't do default actions on window, that's where global variables be (#6170)
-				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
-
-					// Don't re-trigger an onFOO event when we call its FOO() method
-					tmp = elem[ ontype ];
-
-					if ( tmp ) {
-						elem[ ontype ] = null;
-					}
-
-					// Prevent re-triggering of the same event, since we already bubbled it above
-					jQuery.event.triggered = type;
-					elem[ type ]();
-					jQuery.event.triggered = undefined;
-
-					if ( tmp ) {
-						elem[ ontype ] = tmp;
-					}
-				}
-			}
-		}
-
-		return event.result;
-	},
-
-	// Piggyback on a donor event to simulate a different one
-	// Used only for `focus(in | out)` events
-	simulate: function( type, elem, event ) {
-		var e = jQuery.extend(
-			new jQuery.Event(),
-			event,
-			{
-				type: type,
-				isSimulated: true
-			}
-		);
-
-		jQuery.event.trigger( e, null, elem );
-	}
-
-} );
-
-jQuery.fn.extend( {
-
-	trigger: function( type, data ) {
-		return this.each( function() {
-			jQuery.event.trigger( type, data, this );
-		} );
-	},
-	triggerHandler: function( type, data ) {
-		var elem = this[ 0 ];
-		if ( elem ) {
-			return jQuery.event.trigger( type, data, elem, true );
-		}
-	}
-} );
-
-
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
-	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
-	function( i, name ) {
-
-	// Handle event binding
-	jQuery.fn[ name ] = function( data, fn ) {
-		return arguments.length > 0 ?
-			this.on( name, null, data, fn ) :
-			this.trigger( name );
-	};
-} );
-
-jQuery.fn.extend( {
-	hover: function( fnOver, fnOut ) {
-		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-	}
-} );
-
-
-
-
-support.focusin = "onfocusin" in window;
-
-
-// Support: Firefox <=44
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
-if ( !support.focusin ) {
-	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-		// Attach a single capturing handler on the document while someone wants focusin/focusout
-		var handler = function( event ) {
-			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
-		};
-
-		jQuery.event.special[ fix ] = {
-			setup: function() {
-				var doc = this.ownerDocument || this,
-					attaches = dataPriv.access( doc, fix );
-
-				if ( !attaches ) {
-					doc.addEventListener( orig, handler, true );
-				}
-				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
-			},
-			teardown: function() {
-				var doc = this.ownerDocument || this,
-					attaches = dataPriv.access( doc, fix ) - 1;
-
-				if ( !attaches ) {
-					doc.removeEventListener( orig, handler, true );
-					dataPriv.remove( doc, fix );
-
-				} else {
-					dataPriv.access( doc, fix, attaches );
-				}
-			}
-		};
-	} );
-}
-var location = window.location;
-
-var nonce = jQuery.now();
-
-var rquery = ( /\?/ );
-
-
-
-// Cross-browser xml parsing
-jQuery.parseXML = function( data ) {
-	var xml;
-	if ( !data || typeof data !== "string" ) {
-		return null;
-	}
-
-	// Support: IE 9 - 11 only
-	// IE throws on parseFromString with invalid input.
-	try {
-		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
-	} catch ( e ) {
-		xml = undefined;
-	}
-
-	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
-		jQuery.error( "Invalid XML: " + data );
-	}
-	return xml;
-};
-
-
-var
-	rbracket = /\[\]$/,
-	rCRLF = /\r?\n/g,
-	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
-	rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-function buildParams( prefix, obj, traditional, add ) {
-	var name;
-
-	if ( jQuery.isArray( obj ) ) {
-
-		// Serialize array item.
-		jQuery.each( obj, function( i, v ) {
-			if ( traditional || rbracket.test( prefix ) ) {
-
-				// Treat each array item as a scalar.
-				add( prefix, v );
-
-			} else {
-
-				// Item is non-scalar (array or object), encode its numeric index.
-				buildParams(
-					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
-					v,
-					traditional,
-					add
-				);
-			}
-		} );
-
-	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
-
-		// Serialize object item.
-		for ( name in obj ) {
-			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-		}
-
-	} else {
-
-		// Serialize scalar item.
-		add( prefix, obj );
-	}
-}
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-jQuery.param = function( a, traditional ) {
-	var prefix,
-		s = [],
-		add = function( key, valueOrFunction ) {
-
-			// If value is a function, invoke it and use its return value
-			var value = jQuery.isFunction( valueOrFunction ) ?
-				valueOrFunction() :
-				valueOrFunction;
-
-			s[ s.length ] = encodeURIComponent( key ) + "=" +
-				encodeURIComponent( value == null ? "" : value );
-		};
-
-	// If an array was passed in, assume that it is an array of form elements.
-	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-
-		// Serialize the form elements
-		jQuery.each( a, function() {
-			add( this.name, this.value );
-		} );
-
-	} else {
-
-		// If traditional, encode the "old" way (the way 1.3.2 or older
-		// did it), otherwise encode params recursively.
-		for ( prefix in a ) {
-			buildParams( prefix, a[ prefix ], traditional, add );
-		}
-	}
-
-	// Return the resulting serialization
-	return s.join( "&" );
-};
-
-jQuery.fn.extend( {
-	serialize: function() {
-		return jQuery.param( this.serializeArray() );
-	},
-	serializeArray: function() {
-		return this.map( function() {
-
-			// Can add propHook for "elements" to filter or add form elements
-			var elements = jQuery.prop( this, "elements" );
-			return elements ? jQuery.makeArray( elements ) : this;
-		} )
-		.filter( function() {
-			var type = this.type;
-
-			// Use .is( ":disabled" ) so that fieldset[disabled] works
-			return this.name && !jQuery( this ).is( ":disabled" ) &&
-				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
-				( this.checked || !rcheckableType.test( type ) );
-		} )
-		.map( function( i, elem ) {
-			var val = jQuery( this ).val();
-
-			return val == null ?
-				null :
-				jQuery.isArray( val ) ?
-					jQuery.map( val, function( val ) {
-						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-					} ) :
-					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-		} ).get();
-	}
-} );
-
-
-var
-	r20 = /%20/g,
-	rhash = /#.*$/,
-	rts = /([?&])_=[^&]*/,
-	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
-
-	// #7653, #8125, #8152: local protocol detection
-	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
-	rnoContent = /^(?:GET|HEAD)$/,
-	rprotocol = /^\/\//,
-
-	/* Prefilters
-	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-	 * 2) These are called:
-	 *    - BEFORE asking for a transport
-	 *    - AFTER param serialization (s.data is a string if s.processData is true)
-	 * 3) key is the dataType
-	 * 4) the catchall symbol "*" can be used
-	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-	 */
-	prefilters = {},
-
-	/* Transports bindings
-	 * 1) key is the dataType
-	 * 2) the catchall symbol "*" can be used
-	 * 3) selection will start with transport dataType and THEN go to "*" if needed
-	 */
-	transports = {},
-
-	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-	allTypes = "*/".concat( "*" ),
-
-	// Anchor tag for parsing the document origin
-	originAnchor = document.createElement( "a" );
-	originAnchor.href = location.href;
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
-	// dataTypeExpression is optional and defaults to "*"
-	return function( dataTypeExpression, func ) {
-
-		if ( typeof dataTypeExpression !== "string" ) {
-			func = dataTypeExpression;
-			dataTypeExpression = "*";
-		}
-
-		var dataType,
-			i = 0,
-			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
-
-		if ( jQuery.isFunction( func ) ) {
-
-			// For each dataType in the dataTypeExpression
-			while ( ( dataType = dataTypes[ i++ ] ) ) {
-
-				// Prepend if requested
-				if ( dataType[ 0 ] === "+" ) {
-					dataType = dataType.slice( 1 ) || "*";
-					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
-
-				// Otherwise append
-				} else {
-					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
-				}
-			}
-		}
-	};
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
-	var inspected = {},
-		seekingTransport = ( structure === transports );
-
-	function inspect( dataType ) {
-		var selected;
-		inspected[ dataType ] = true;
-		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
-			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
-			if ( typeof dataTypeOrTransport === "string" &&
-				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-
-				options.dataTypes.unshift( dataTypeOrTransport );
-				inspect( dataTypeOrTransport );
-				return false;
-			} else if ( seekingTransport ) {
-				return !( selected = dataTypeOrTransport );
-			}
-		} );
-		return selected;
-	}
-
-	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
-	var key, deep,
-		flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
-	for ( key in src ) {
-		if ( src[ key ] !== undefined ) {
-			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
-		}
-	}
-	if ( deep ) {
-		jQuery.extend( true, target, deep );
-	}
-
-	return target;
-}
-
-/* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
-	var ct, type, finalDataType, firstDataType,
-		contents = s.contents,
-		dataTypes = s.dataTypes;
-
-	// Remove auto dataType and get content-type in the process
-	while ( dataTypes[ 0 ] === "*" ) {
-		dataTypes.shift();
-		if ( ct === undefined ) {
-			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
-		}
-	}
-
-	// Check if we're dealing with a known content-type
-	if ( ct ) {
-		for ( type in contents ) {
-			if ( contents[ type ] && contents[ type ].test( ct ) ) {
-				dataTypes.unshift( type );
-				break;
-			}
-		}
-	}
-
-	// Check to see if we have a response for the expected dataType
-	if ( dataTypes[ 0 ] in responses ) {
-		finalDataType = dataTypes[ 0 ];
-	} else {
-
-		// Try convertible dataTypes
-		for ( type in responses ) {
-			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
-				finalDataType = type;
-				break;
-			}
-			if ( !firstDataType ) {
-				firstDataType = type;
-			}
-		}
-
-		// Or just use first one
-		finalDataType = finalDataType || firstDataType;
-	}
-
-	// If we found a dataType
-	// We add the dataType to the list if needed
-	// and return the corresponding response
-	if ( finalDataType ) {
-		if ( finalDataType !== dataTypes[ 0 ] ) {
-			dataTypes.unshift( finalDataType );
-		}
-		return responses[ finalDataType ];
-	}
-}
-
-/* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-function ajaxConvert( s, response, jqXHR, isSuccess ) {
-	var conv2, current, conv, tmp, prev,
-		converters = {},
-
-		// Work with a copy of dataTypes in case we need to modify it for conversion
-		dataTypes = s.dataTypes.slice();
-
-	// Create converters map with lowercased keys
-	if ( dataTypes[ 1 ] ) {
-		for ( conv in s.converters ) {
-			converters[ conv.toLowerCase() ] = s.converters[ conv ];
-		}
-	}
-
-	current = dataTypes.shift();
-
-	// Convert to each sequential dataType
-	while ( current ) {
-
-		if ( s.responseFields[ current ] ) {
-			jqXHR[ s.responseFields[ current ] ] = response;
-		}
-
-		// Apply the dataFilter if provided
-		if ( !prev && isSuccess && s.dataFilter ) {
-			response = s.dataFilter( response, s.dataType );
-		}
-
-		prev = current;
-		current = dataTypes.shift();
-
-		if ( current ) {
-
-			// There's only work to do if current dataType is non-auto
-			if ( current === "*" ) {
-
-				current = prev;
-
-			// Convert response if prev dataType is non-auto and differs from current
-			} else if ( prev !== "*" && prev !== current ) {
-
-				// Seek a direct converter
-				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
-				// If none found, seek a pair
-				if ( !conv ) {
-					for ( conv2 in converters ) {
-
-						// If conv2 outputs current
-						tmp = conv2.split( " " );
-						if ( tmp[ 1 ] === current ) {
-
-							// If prev can be converted to accepted input
-							conv = converters[ prev + " " + tmp[ 0 ] ] ||
-								converters[ "* " + tmp[ 0 ] ];
-							if ( conv ) {
-
-								// Condense equivalence converters
-								if ( conv === true ) {
-									conv = converters[ conv2 ];
-
-								// Otherwise, insert the intermediate dataType
-								} else if ( converters[ conv2 ] !== true ) {
-									current = tmp[ 0 ];
-									dataTypes.unshift( tmp[ 1 ] );
-								}
-								break;
-							}
-						}
-					}
-				}
-
-				// Apply converter (if not an equivalence)
-				if ( conv !== true ) {
-
-					// Unless errors are allowed to bubble, catch and return them
-					if ( conv && s.throws ) {
-						response = conv( response );
-					} else {
-						try {
-							response = conv( response );
-						} catch ( e ) {
-							return {
-								state: "parsererror",
-								error: conv ? e : "No conversion from " + prev + " to " + current
-							};
-						}
-					}
-				}
-			}
-		}
-	}
-
-	return { state: "success", data: response };
-}
-
-jQuery.extend( {
-
-	// Counter for holding the number of active queries
-	active: 0,
-
-	// Last-Modified header cache for next request
-	lastModified: {},
-	etag: {},
-
-	ajaxSettings: {
-		url: location.href,
-		type: "GET",
-		isLocal: rlocalProtocol.test( location.protocol ),
-		global: true,
-		processData: true,
-		async: true,
-		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-
-		/*
-		timeout: 0,
-		data: null,
-		dataType: null,
-		username: null,
-		password: null,
-		cache: null,
-		throws: false,
-		traditional: false,
-		headers: {},
-		*/
-
-		accepts: {
-			"*": allTypes,
-			text: "text/plain",
-			html: "text/html",
-			xml: "application/xml, text/xml",
-			json: "application/json, text/javascript"
-		},
-
-		contents: {
-			xml: /\bxml\b/,
-			html: /\bhtml/,
-			json: /\bjson\b/
-		},
-
-		responseFields: {
-			xml: "responseXML",
-			text: "responseText",
-			json: "responseJSON"
-		},
-
-		// Data converters
-		// Keys separate source (or catchall "*") and destination types with a single space
-		converters: {
-
-			// Convert anything to text
-			"* text": String,
-
-			// Text to html (true = no transformation)
-			"text html": true,
-
-			// Evaluate text as a json expression
-			"text json": JSON.parse,
-
-			// Parse text as xml
-			"text xml": jQuery.parseXML
-		},
-
-		// For options that shouldn't be deep extended:
-		// you can add your own custom options here if
-		// and when you create one that shouldn't be
-		// deep extended (see ajaxExtend)
-		flatOptions: {
-			url: true,
-			context: true
-		}
-	},
-
-	// Creates a full fledged settings object into target
-	// with both ajaxSettings and settings fields.
-	// If target is omitted, writes into ajaxSettings.
-	ajaxSetup: function( target, settings ) {
-		return settings ?
-
-			// Building a settings object
-			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
-			// Extending ajaxSettings
-			ajaxExtend( jQuery.ajaxSettings, target );
-	},
-
-	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-	ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-	// Main method
-	ajax: function( url, options ) {
-
-		// If url is an object, simulate pre-1.5 signature
-		if ( typeof url === "object" ) {
-			options = url;
-			url = undefined;
-		}
-
-		// Force options to be an object
-		options = options || {};
-
-		var transport,
-
-			// URL without anti-cache param
-			cacheURL,
-
-			// Response headers
-			responseHeadersString,
-			responseHeaders,
-
-			// timeout handle
-			timeoutTimer,
-
-			// Url cleanup var
-			urlAnchor,
-
-			// Request state (becomes false upon send and true upon completion)
-			completed,
-
-			// To know if global events are to be dispatched
-			fireGlobals,
-
-			// Loop variable
-			i,
-
-			// uncached part of the url
-			uncached,
-
-			// Create the final options object
-			s = jQuery.ajaxSetup( {}, options ),
-
-			// Callbacks context
-			callbackContext = s.context || s,
-
-			// Context for global events is callbackContext if it is a DOM node or jQuery collection
-			globalEventContext = s.context &&
-				( callbackContext.nodeType || callbackContext.jquery ) ?
-					jQuery( callbackContext ) :
-					jQuery.event,
-
-			// Deferreds
-			deferred = jQuery.Deferred(),
-			completeDeferred = jQuery.Callbacks( "once memory" ),
-
-			// Status-dependent callbacks
-			statusCode = s.statusCode || {},
-
-			// Headers (they are sent all at once)
-			requestHeaders = {},
-			requestHeadersNames = {},
-
-			// Default abort message
-			strAbort = "canceled",
-
-			// Fake xhr
-			jqXHR = {
-				readyState: 0,
-
-				// Builds headers hashtable if needed
-				getResponseHeader: function( key ) {
-					var match;
-					if ( completed ) {
-						if ( !responseHeaders ) {
-							responseHeaders = {};
-							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
-								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
-							}
-						}
-						match = responseHeaders[ key.toLowerCase() ];
-					}
-					return match == null ? null : match;
-				},
-
-				// Raw string
-				getAllResponseHeaders: function() {
-					return completed ? responseHeadersString : null;
-				},
-
-				// Caches the header
-				setRequestHeader: function( name, value ) {
-					if ( completed == null ) {
-						name = requestHeadersNames[ name.toLowerCase() ] =
-							requestHeadersNames[ name.toLowerCase() ] || name;
-						requestHeaders[ name ] = value;
-					}
-					return this;
-				},
-
-				// Overrides response content-type header
-				overrideMimeType: function( type ) {
-					if ( completed == null ) {
-						s.mimeType = type;
-					}
-					return this;
-				},
-
-				// Status-dependent callbacks
-				statusCode: function( map ) {
-					var code;
-					if ( map ) {
-						if ( completed ) {
-
-							// Execute the appropriate callbacks
-							jqXHR.always( map[ jqXHR.status ] );
-						} else {
-
-							// Lazy-add the new callbacks in a way that preserves old ones
-							for ( code in map ) {
-								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
-							}
-						}
-					}
-					return this;
-				},
-
-				// Cancel the request
-				abort: function( statusText ) {
-					var finalText = statusText || strAbort;
-					if ( transport ) {
-						transport.abort( finalText );
-					}
-					done( 0, finalText );
-					return this;
-				}
-			};
-
-		// Attach deferreds
-		deferred.promise( jqXHR );
-
-		// Add protocol if not provided (prefilters might expect it)
-		// Handle falsy url in the settings object (#10093: consistency with old signature)
-		// We also use the url parameter if available
-		s.url = ( ( url || s.url || location.href ) + "" )
-			.replace( rprotocol, location.protocol + "//" );
-
-		// Alias method option to type as per ticket #12004
-		s.type = options.method || options.type || s.method || s.type;
-
-		// Extract dataTypes list
-		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
-
-		// A cross-domain request is in order when the origin doesn't match the current origin.
-		if ( s.crossDomain == null ) {
-			urlAnchor = document.createElement( "a" );
-
-			// Support: IE <=8 - 11, Edge 12 - 13
-			// IE throws exception on accessing the href property if url is malformed,
-			// e.g. http://example.com:80x/
-			try {
-				urlAnchor.href = s.url;
-
-				// Support: IE <=8 - 11 only
-				// Anchor's host property isn't correctly set when s.url is relative
-				urlAnchor.href = urlAnchor.href;
-				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
-					urlAnchor.protocol + "//" + urlAnchor.host;
-			} catch ( e ) {
-
-				// If there is an error parsing the URL, assume it is crossDomain,
-				// it can be rejected by the transport if it is invalid
-				s.crossDomain = true;
-			}
-		}
-
-		// Convert data if not already a string
-		if ( s.data && s.processData && typeof s.data !== "string" ) {
-			s.data = jQuery.param( s.data, s.traditional );
-		}
-
-		// Apply prefilters
-		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-		// If request was aborted inside a prefilter, stop there
-		if ( completed ) {
-			return jqXHR;
-		}
-
-		// We can fire global events as of now if asked to
-		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
-		fireGlobals = jQuery.event && s.global;
-
-		// Watch for a new set of requests
-		if ( fireGlobals && jQuery.active++ === 0 ) {
-			jQuery.event.trigger( "ajaxStart" );
-		}
-
-		// Uppercase the type
-		s.type = s.type.toUpperCase();
-
-		// Determine if request has content
-		s.hasContent = !rnoContent.test( s.type );
-
-		// Save the URL in case we're toying with the If-Modified-Since
-		// and/or If-None-Match header later on
-		// Remove hash to simplify url manipulation
-		cacheURL = s.url.replace( rhash, "" );
-
-		// More options handling for requests with no content
-		if ( !s.hasContent ) {
-
-			// Remember the hash so we can put it back
-			uncached = s.url.slice( cacheURL.length );
-
-			// If data is available, append data to url
-			if ( s.data ) {
-				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
-
-				// #9682: remove data so that it's not used in an eventual retry
-				delete s.data;
-			}
-
-			// Add anti-cache in uncached url if needed
-			if ( s.cache === false ) {
-				cacheURL = cacheURL.replace( rts, "" );
-				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
-			}
-
-			// Put hash and anti-cache on the URL that will be requested (gh-1732)
-			s.url = cacheURL + uncached;
-
-		// Change '%20' to '+' if this is encoded form body content (gh-2658)
-		} else if ( s.data && s.processData &&
-			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
-			s.data = s.data.replace( r20, "+" );
-		}
-
-		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-		if ( s.ifModified ) {
-			if ( jQuery.lastModified[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
-			}
-			if ( jQuery.etag[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
-			}
-		}
-
-		// Set the correct header, if data is being sent
-		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-			jqXHR.setRequestHeader( "Content-Type", s.contentType );
-		}
-
-		// Set the Accepts header for the server, depending on the dataType
-		jqXHR.setRequestHeader(
-			"Accept",
-			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
-				s.accepts[ s.dataTypes[ 0 ] ] +
-					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-				s.accepts[ "*" ]
-		);
-
-		// Check for headers option
-		for ( i in s.headers ) {
-			jqXHR.setRequestHeader( i, s.headers[ i ] );
-		}
-
-		// Allow custom headers/mimetypes and early abort
-		if ( s.beforeSend &&
-			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
-
-			// Abort if not done already and return
-			return jqXHR.abort();
-		}
-
-		// Aborting is no longer a cancellation
-		strAbort = "abort";
-
-		// Install callbacks on deferreds
-		completeDeferred.add( s.complete );
-		jqXHR.done( s.success );
-		jqXHR.fail( s.error );
-
-		// Get transport
-		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-		// If no transport, we auto-abort
-		if ( !transport ) {
-			done( -1, "No Transport" );
-		} else {
-			jqXHR.readyState = 1;
-
-			// Send global event
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-			}
-
-			// If request was aborted inside ajaxSend, stop there
-			if ( completed ) {
-				return jqXHR;
-			}
-
-			// Timeout
-			if ( s.async && s.timeout > 0 ) {
-				timeoutTimer = window.setTimeout( function() {
-					jqXHR.abort( "timeout" );
-				}, s.timeout );
-			}
-
-			try {
-				completed = false;
-				transport.send( requestHeaders, done );
-			} catch ( e ) {
-
-				// Rethrow post-completion exceptions
-				if ( completed ) {
-					throw e;
-				}
-
-				// Propagate others as results
-				done( -1, e );
-			}
-		}
-
-		// Callback for when everything is done
-		function done( status, nativeStatusText, responses, headers ) {
-			var isSuccess, success, error, response, modified,
-				statusText = nativeStatusText;
-
-			// Ignore repeat invocations
-			if ( completed ) {
-				return;
-			}
-
-			completed = true;
-
-			// Clear timeout if it exists
-			if ( timeoutTimer ) {
-				window.clearTimeout( timeoutTimer );
-			}
-
-			// Dereference transport for early garbage collection
-			// (no matter how long the jqXHR object will be used)
-			transport = undefined;
-
-			// Cache response headers
-			responseHeadersString = headers || "";
-
-			// Set readyState
-			jqXHR.readyState = status > 0 ? 4 : 0;
-
-			// Determine if successful
-			isSuccess = status >= 200 && status < 300 || status === 304;
-
-			// Get response data
-			if ( responses ) {
-				response = ajaxHandleResponses( s, jqXHR, responses );
-			}
-
-			// Convert no matter what (that way responseXXX fields are always set)
-			response = ajaxConvert( s, response, jqXHR, isSuccess );
-
-			// If successful, handle type chaining
-			if ( isSuccess ) {
-
-				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-				if ( s.ifModified ) {
-					modified = jqXHR.getResponseHeader( "Last-Modified" );
-					if ( modified ) {
-						jQuery.lastModified[ cacheURL ] = modified;
-					}
-					modified = jqXHR.getResponseHeader( "etag" );
-					if ( modified ) {
-						jQuery.etag[ cacheURL ] = modified;
-					}
-				}
-
-				// if no content
-				if ( status === 204 || s.type === "HEAD" ) {
-					statusText = "nocontent";
-
-				// if not modified
-				} else if ( status === 304 ) {
-					statusText = "notmodified";
-
-				// If we have data, let's convert it
-				} else {
-					statusText = response.state;
-					success = response.data;
-					error = response.error;
-					isSuccess = !error;
-				}
-			} else {
-
-				// Extract error from statusText and normalize for non-aborts
-				error = statusText;
-				if ( status || !statusText ) {
-					statusText = "error";
-					if ( status < 0 ) {
-						status = 0;
-					}
-				}
-			}
-
-			// Set data for the fake xhr object
-			jqXHR.status = status;
-			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
-			// Success/Error
-			if ( isSuccess ) {
-				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-			} else {
-				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-			}
-
-			// Status-dependent callbacks
-			jqXHR.statusCode( statusCode );
-			statusCode = undefined;
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
-					[ jqXHR, s, isSuccess ? success : error ] );
-			}
-
-			// Complete
-			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-
-				// Handle the global AJAX counter
-				if ( !( --jQuery.active ) ) {
-					jQuery.event.trigger( "ajaxStop" );
-				}
-			}
-		}
-
-		return jqXHR;
-	},
-
-	getJSON: function( url, data, callback ) {
-		return jQuery.get( url, data, callback, "json" );
-	},
-
-	getScript: function( url, callback ) {
-		return jQuery.get( url, undefined, callback, "script" );
-	}
-} );
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-	jQuery[ method ] = function( url, data, callback, type ) {
-
-		// Shift arguments if data argument was omitted
-		if ( jQuery.isFunction( data ) ) {
-			type = type || callback;
-			callback = data;
-			data = undefined;
-		}
-
-		// The url can be an options object (which then must have .url)
-		return jQuery.ajax( jQuery.extend( {
-			url: url,
-			type: method,
-			dataType: type,
-			data: data,
-			success: callback
-		}, jQuery.isPlainObject( url ) && url ) );
-	};
-} );
-
-
-jQuery._evalUrl = function( url ) {
-	return jQuery.ajax( {
-		url: url,
-
-		// Make this explicit, since user can override this through ajaxSetup (#11264)
-		type: "GET",
-		dataType: "script",
-		cache: true,
-		async: false,
-		global: false,
-		"throws": true
-	} );
-};
-
-
-jQuery.fn.extend( {
-	wrapAll: function( html ) {
-		var wrap;
-
-		if ( this[ 0 ] ) {
-			if ( jQuery.isFunction( html ) ) {
-				html = html.call( this[ 0 ] );
-			}
-
-			// The elements to wrap the target around
-			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
-
-			if ( this[ 0 ].parentNode ) {
-				wrap.insertBefore( this[ 0 ] );
-			}
-
-			wrap.map( function() {
-				var elem = this;
-
-				while ( elem.firstElementChild ) {
-					elem = elem.firstElementChild;
-				}
-
-				return elem;
-			} ).append( this );
-		}
-
-		return this;
-	},
-
-	wrapInner: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each( function( i ) {
-				jQuery( this ).wrapInner( html.call( this, i ) );
-			} );
-		}
-
-		return this.each( function() {
-			var self = jQuery( this ),
-				contents = self.contents();
-
-			if ( contents.length ) {
-				contents.wrapAll( html );
-
-			} else {
-				self.append( html );
-			}
-		} );
-	},
-
-	wrap: function( html ) {
-		var isFunction = jQuery.isFunction( html );
-
-		return this.each( function( i ) {
-			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
-		} );
-	},
-
-	unwrap: function( selector ) {
-		this.parent( selector ).not( "body" ).each( function() {
-			jQuery( this ).replaceWith( this.childNodes );
-		} );
-		return this;
-	}
-} );
-
-
-jQuery.expr.pseudos.hidden = function( elem ) {
-	return !jQuery.expr.pseudos.visible( elem );
-};
-jQuery.expr.pseudos.visible = function( elem ) {
-	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
-};
-
-
-
-
-jQuery.ajaxSettings.xhr = function() {
-	try {
-		return new window.XMLHttpRequest();
-	} catch ( e ) {}
-};
-
-var xhrSuccessStatus = {
-
-		// File protocol always yields status code 0, assume 200
-		0: 200,
-
-		// Support: IE <=9 only
-		// #1450: sometimes IE returns 1223 when it should be 204
-		1223: 204
-	},
-	xhrSupported = jQuery.ajaxSettings.xhr();
-
-support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-support.ajax = xhrSupported = !!xhrSupported;
-
-jQuery.ajaxTransport( function( options ) {
-	var callback, errorCallback;
-
-	// Cross domain only allowed if supported through XMLHttpRequest
-	if ( support.cors || xhrSupported && !options.crossDomain ) {
-		return {
-			send: function( headers, complete ) {
-				var i,
-					xhr = options.xhr();
-
-				xhr.open(
-					options.type,
-					options.url,
-					options.async,
-					options.username,
-					options.password
-				);
-
-				// Apply custom fields if provided
-				if ( options.xhrFields ) {
-					for ( i in options.xhrFields ) {
-						xhr[ i ] = options.xhrFields[ i ];
-					}
-				}
-
-				// Override mime type if needed
-				if ( options.mimeType && xhr.overrideMimeType ) {
-					xhr.overrideMimeType( options.mimeType );
-				}
-
-				// X-Requested-With header
-				// For cross-domain requests, seeing as conditions for a preflight are
-				// akin to a jigsaw puzzle, we simply never set it to be sure.
-				// (it can always be set on a per-request basis or even using ajaxSetup)
-				// For same-domain requests, won't change header if already provided.
-				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
-					headers[ "X-Requested-With" ] = "XMLHttpRequest";
-				}
-
-				// Set headers
-				for ( i in headers ) {
-					xhr.setRequestHeader( i, headers[ i ] );
-				}
-
-				// Callback
-				callback = function( type ) {
-					return function() {
-						if ( callback ) {
-							callback = errorCallback = xhr.onload =
-								xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
-
-							if ( type === "abort" ) {
-								xhr.abort();
-							} else if ( type === "error" ) {
-
-								// Support: IE <=9 only
-								// On a manual native abort, IE9 throws
-								// errors on any property access that is not readyState
-								if ( typeof xhr.status !== "number" ) {
-									complete( 0, "error" );
-								} else {
-									complete(
-
-										// File: protocol always yields status 0; see #8605, #14207
-										xhr.status,
-										xhr.statusText
-									);
-								}
-							} else {
-								complete(
-									xhrSuccessStatus[ xhr.status ] || xhr.status,
-									xhr.statusText,
-
-									// Support: IE <=9 only
-									// IE9 has no XHR2 but throws on binary (trac-11426)
-									// For XHR2 non-text, let the caller handle it (gh-2498)
-									( xhr.responseType || "text" ) !== "text"  ||
-									typeof xhr.responseText !== "string" ?
-										{ binary: xhr.response } :
-										{ text: xhr.responseText },
-									xhr.getAllResponseHeaders()
-								);
-							}
-						}
-					};
-				};
-
-				// Listen to events
-				xhr.onload = callback();
-				errorCallback = xhr.onerror = callback( "error" );
-
-				// Support: IE 9 only
-				// Use onreadystatechange to replace onabort
-				// to handle uncaught aborts
-				if ( xhr.onabort !== undefined ) {
-					xhr.onabort = errorCallback;
-				} else {
-					xhr.onreadystatechange = function() {
-
-						// Check readyState before timeout as it changes
-						if ( xhr.readyState === 4 ) {
-
-							// Allow onerror to be called first,
-							// but that will not handle a native abort
-							// Also, save errorCallback to a variable
-							// as xhr.onerror cannot be accessed
-							window.setTimeout( function() {
-								if ( callback ) {
-									errorCallback();
-								}
-							} );
-						}
-					};
-				}
-
-				// Create the abort callback
-				callback = callback( "abort" );
-
-				try {
-
-					// Do send the request (this may raise an exception)
-					xhr.send( options.hasContent && options.data || null );
-				} catch ( e ) {
-
-					// #14683: Only rethrow if this hasn't been notified as an error yet
-					if ( callback ) {
-						throw e;
-					}
-				}
-			},
-
-			abort: function() {
-				if ( callback ) {
-					callback();
-				}
-			}
-		};
-	}
-} );
-
-
-
-
-// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
-jQuery.ajaxPrefilter( function( s ) {
-	if ( s.crossDomain ) {
-		s.contents.script = false;
-	}
-} );
-
-// Install script dataType
-jQuery.ajaxSetup( {
-	accepts: {
-		script: "text/javascript, application/javascript, " +
-			"application/ecmascript, application/x-ecmascript"
-	},
-	contents: {
-		script: /\b(?:java|ecma)script\b/
-	},
-	converters: {
-		"text script": function( text ) {
-			jQuery.globalEval( text );
-			return text;
-		}
-	}
-} );
-
-// Handle cache's special case and crossDomain
-jQuery.ajaxPrefilter( "script", function( s ) {
-	if ( s.cache === undefined ) {
-		s.cache = false;
-	}
-	if ( s.crossDomain ) {
-		s.type = "GET";
-	}
-} );
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function( s ) {
-
-	// This transport only deals with cross domain requests
-	if ( s.crossDomain ) {
-		var script, callback;
-		return {
-			send: function( _, complete ) {
-				script = jQuery( "<script>" ).prop( {
-					charset: s.scriptCharset,
-					src: s.url
-				} ).on(
-					"load error",
-					callback = function( evt ) {
-						script.remove();
-						callback = null;
-						if ( evt ) {
-							complete( evt.type === "error" ? 404 : 200, evt.type );
-						}
-					}
-				);
-
-				// Use native DOM manipulation to avoid our domManip AJAX trickery
-				document.head.appendChild( script[ 0 ] );
-			},
-			abort: function() {
-				if ( callback ) {
-					callback();
-				}
-			}
-		};
-	}
-} );
-
-
-
-
-var oldCallbacks = [],
-	rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup( {
-	jsonp: "callback",
-	jsonpCallback: function() {
-		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-		this[ callback ] = true;
-		return callback;
-	}
-} );
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-	var callbackName, overwritten, responseContainer,
-		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
-			"url" :
-			typeof s.data === "string" &&
-				( s.contentType || "" )
-					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
-				rjsonp.test( s.data ) && "data"
-		);
-
-	// Handle iff the expected data type is "jsonp" or we have a parameter to set
-	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
-		// Get callback name, remembering preexisting value associated with it
-		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-			s.jsonpCallback() :
-			s.jsonpCallback;
-
-		// Insert callback into url or form data
-		if ( jsonProp ) {
-			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
-		} else if ( s.jsonp !== false ) {
-			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-		}
-
-		// Use data converter to retrieve json after script execution
-		s.converters[ "script json" ] = function() {
-			if ( !responseContainer ) {
-				jQuery.error( callbackName + " was not called" );
-			}
-			return responseContainer[ 0 ];
-		};
-
-		// Force json dataType
-		s.dataTypes[ 0 ] = "json";
-
-		// Install callback
-		overwritten = window[ callbackName ];
-		window[ callbackName ] = function() {
-			responseContainer = arguments;
-		};
-
-		// Clean-up function (fires after converters)
-		jqXHR.always( function() {
-
-			// If previous value didn't exist - remove it
-			if ( overwritten === undefined ) {
-				jQuery( window ).removeProp( callbackName );
-
-			// Otherwise restore preexisting value
-			} else {
-				window[ callbackName ] = overwritten;
-			}
-
-			// Save back as free
-			if ( s[ callbackName ] ) {
-
-				// Make sure that re-using the options doesn't screw things around
-				s.jsonpCallback = originalSettings.jsonpCallback;
-
-				// Save the callback name for future use
-				oldCallbacks.push( callbackName );
-			}
-
-			// Call if it was a function and we have a response
-			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-				overwritten( responseContainer[ 0 ] );
-			}
-
-			responseContainer = overwritten = undefined;
-		} );
-
-		// Delegate to script
-		return "script";
-	}
-} );
-
-
-
-
-// Support: Safari 8 only
-// In Safari 8 documents created via document.implementation.createHTMLDocument
-// collapse sibling forms: the second one becomes a child of the first one.
-// Because of that, this security measure has to be disabled in Safari 8.
-// https://bugs.webkit.org/show_bug.cgi?id=137337
-support.createHTMLDocument = ( function() {
-	var body = document.implementation.createHTMLDocument( "" ).body;
-	body.innerHTML = "<form></form><form></form>";
-	return body.childNodes.length === 2;
-} )();
-
-
-// Argument "data" should be string of html
-// context (optional): If specified, the fragment will be created in this context,
-// defaults to document
-// keepScripts (optional): If true, will include scripts passed in the html string
-jQuery.parseHTML = function( data, context, keepScripts ) {
-	if ( typeof data !== "string" ) {
-		return [];
-	}
-	if ( typeof context === "boolean" ) {
-		keepScripts = context;
-		context = false;
-	}
-
-	var base, parsed, scripts;
-
-	if ( !context ) {
-
-		// Stop scripts or inline event handlers from being executed immediately
-		// by using document.implementation
-		if ( support.createHTMLDocument ) {
-			context = document.implementation.createHTMLDocument( "" );
-
-			// Set the base href for the created document
-			// so any parsed elements with URLs
-			// are based on the document's URL (gh-2965)
-			base = context.createElement( "base" );
-			base.href = document.location.href;
-			context.head.appendChild( base );
-		} else {
-			context = document;
-		}
-	}
-
-	parsed = rsingleTag.exec( data );
-	scripts = !keepScripts && [];
-
-	// Single tag
-	if ( parsed ) {
-		return [ context.createElement( parsed[ 1 ] ) ];
-	}
-
-	parsed = buildFragment( [ data ], context, scripts );
-
-	if ( scripts && scripts.length ) {
-		jQuery( scripts ).remove();
-	}
-
-	return jQuery.merge( [], parsed.childNodes );
-};
-
-
-/**
- * Load a url into a page
- */
-jQuery.fn.load = function( url, params, callback ) {
-	var selector, type, response,
-		self = this,
-		off = url.indexOf( " " );
-
-	if ( off > -1 ) {
-		selector = jQuery.trim( url.slice( off ) );
-		url = url.slice( 0, off );
-	}
-
-	// If it's a function
-	if ( jQuery.isFunction( params ) ) {
-
-		// We assume that it's the callback
-		callback = params;
-		params = undefined;
-
-	// Otherwise, build a param string
-	} else if ( params && typeof params === "object" ) {
-		type = "POST";
-	}
-
-	// If we have elements to modify, make the request
-	if ( self.length > 0 ) {
-		jQuery.ajax( {
-			url: url,
-
-			// If "type" variable is undefined, then "GET" method will be used.
-			// Make value of this field explicit since
-			// user can override it through ajaxSetup method
-			type: type || "GET",
-			dataType: "html",
-			data: params
-		} ).done( function( responseText ) {
-
-			// Save response for use in complete callback
-			response = arguments;
-
-			self.html( selector ?
-
-				// If a selector was specified, locate the right elements in a dummy div
-				// Exclude scripts to avoid IE 'Permission Denied' errors
-				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
-				// Otherwise use the full result
-				responseText );
-
-		// If the request succeeds, this function gets "data", "status", "jqXHR"
-		// but they are ignored because response was set above.
-		// If it fails, this function gets "jqXHR", "status", "error"
-		} ).always( callback && function( jqXHR, status ) {
-			self.each( function() {
-				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
-			} );
-		} );
-	}
-
-	return this;
-};
-
-
-
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [
-	"ajaxStart",
-	"ajaxStop",
-	"ajaxComplete",
-	"ajaxError",
-	"ajaxSuccess",
-	"ajaxSend"
-], function( i, type ) {
-	jQuery.fn[ type ] = function( fn ) {
-		return this.on( type, fn );
-	};
-} );
-
-
-
-
-jQuery.expr.pseudos.animated = function( elem ) {
-	return jQuery.grep( jQuery.timers, function( fn ) {
-		return elem === fn.elem;
-	} ).length;
-};
-
-
-
-
-/**
- * Gets a window from an element
- */
-function getWindow( elem ) {
-	return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
-}
-
-jQuery.offset = {
-	setOffset: function( elem, options, i ) {
-		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
-			position = jQuery.css( elem, "position" ),
-			curElem = jQuery( elem ),
-			props = {};
-
-		// Set position first, in-case top/left are set even on static elem
-		if ( position === "static" ) {
-			elem.style.position = "relative";
-		}
-
-		curOffset = curElem.offset();
-		curCSSTop = jQuery.css( elem, "top" );
-		curCSSLeft = jQuery.css( elem, "left" );
-		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
-			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
-
-		// Need to be able to calculate position if either
-		// top or left is auto and position is either absolute or fixed
-		if ( calculatePosition ) {
-			curPosition = curElem.position();
-			curTop = curPosition.top;
-			curLeft = curPosition.left;
-
-		} else {
-			curTop = parseFloat( curCSSTop ) || 0;
-			curLeft = parseFloat( curCSSLeft ) || 0;
-		}
-
-		if ( jQuery.isFunction( options ) ) {
-
-			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
-			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
-		}
-
-		if ( options.top != null ) {
-			props.top = ( options.top - curOffset.top ) + curTop;
-		}
-		if ( options.left != null ) {
-			props.left = ( options.left - curOffset.left ) + curLeft;
-		}
-
-		if ( "using" in options ) {
-			options.using.call( elem, props );
-
-		} else {
-			curElem.css( props );
-		}
-	}
-};
-
-jQuery.fn.extend( {
-	offset: function( options ) {
-
-		// Preserve chaining for setter
-		if ( arguments.length ) {
-			return options === undefined ?
-				this :
-				this.each( function( i ) {
-					jQuery.offset.setOffset( this, options, i );
-				} );
-		}
-
-		var docElem, win, rect, doc,
-			elem = this[ 0 ];
-
-		if ( !elem ) {
-			return;
-		}
-
-		// Support: IE <=11 only
-		// Running getBoundingClientRect on a
-		// disconnected node in IE throws an error
-		if ( !elem.getClientRects().length ) {
-			return { top: 0, left: 0 };
-		}
-
-		rect = elem.getBoundingClientRect();
-
-		// Make sure element is not hidden (display: none)
-		if ( rect.width || rect.height ) {
-			doc = elem.ownerDocument;
-			win = getWindow( doc );
-			docElem = doc.documentElement;
-
-			return {
-				top: rect.top + win.pageYOffset - docElem.clientTop,
-				left: rect.left + win.pageXOffset - docElem.clientLeft
-			};
-		}
-
-		// Return zeros for disconnected and hidden elements (gh-2310)
-		return rect;
-	},
-
-	position: function() {
-		if ( !this[ 0 ] ) {
-			return;
-		}
-
-		var offsetParent, offset,
-			elem = this[ 0 ],
-			parentOffset = { top: 0, left: 0 };
-
-		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
-		// because it is its only offset parent
-		if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
-			// Assume getBoundingClientRect is there when computed position is fixed
-			offset = elem.getBoundingClientRect();
-
-		} else {
-
-			// Get *real* offsetParent
-			offsetParent = this.offsetParent();
-
-			// Get correct offsets
-			offset = this.offset();
-			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
-				parentOffset = offsetParent.offset();
-			}
-
-			// Add offsetParent borders
-			parentOffset = {
-				top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
-				left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
-			};
-		}
-
-		// Subtract parent offsets and element margins
-		return {
-			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
-			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
-		};
-	},
-
-	// This method will return documentElement in the following cases:
-	// 1) For the element inside the iframe without offsetParent, this method will return
-	//    documentElement of the parent window
-	// 2) For the hidden or detached element
-	// 3) For body or html element, i.e. in case of the html node - it will return itself
-	//
-	// but those exceptions were never presented as a real life use-cases
-	// and might be considered as more preferable results.
-	//
-	// This logic, however, is not guaranteed and can change at any point in the future
-	offsetParent: function() {
-		return this.map( function() {
-			var offsetParent = this.offsetParent;
-
-			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
-				offsetParent = offsetParent.offsetParent;
-			}
-
-			return offsetParent || documentElement;
-		} );
-	}
-} );
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
-	var top = "pageYOffset" === prop;
-
-	jQuery.fn[ method ] = function( val ) {
-		return access( this, function( elem, method, val ) {
-			var win = getWindow( elem );
-
-			if ( val === undefined ) {
-				return win ? win[ prop ] : elem[ method ];
-			}
-
-			if ( win ) {
-				win.scrollTo(
-					!top ? val : win.pageXOffset,
-					top ? val : win.pageYOffset
-				);
-
-			} else {
-				elem[ method ] = val;
-			}
-		}, method, val, arguments.length );
-	};
-} );
-
-// Support: Safari <=7 - 9.1, Chrome <=37 - 49
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
-// getComputedStyle returns percent when specified for top/left/bottom/right;
-// rather than make the css module depend on the offset module, just check for it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
-	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
-		function( elem, computed ) {
-			if ( computed ) {
-				computed = curCSS( elem, prop );
-
-				// If curCSS returns percentage, fallback to offset
-				return rnumnonpx.test( computed ) ?
-					jQuery( elem ).position()[ prop ] + "px" :
-					computed;
-			}
-		}
-	);
-} );
-
-
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
-		function( defaultExtra, funcName ) {
-
-		// Margin is only for outerHeight, outerWidth
-		jQuery.fn[ funcName ] = function( margin, value ) {
-			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-			return access( this, function( elem, type, value ) {
-				var doc;
-
-				if ( jQuery.isWindow( elem ) ) {
-
-					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
-					return funcName.indexOf( "outer" ) === 0 ?
-						elem[ "inner" + name ] :
-						elem.document.documentElement[ "client" + name ];
-				}
-
-				// Get document width or height
-				if ( elem.nodeType === 9 ) {
-					doc = elem.documentElement;
-
-					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
-					// whichever is greatest
-					return Math.max(
-						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-						elem.body[ "offset" + name ], doc[ "offset" + name ],
-						doc[ "client" + name ]
-					);
-				}
-
-				return value === undefined ?
-
-					// Get width or height on the element, requesting but not forcing parseFloat
-					jQuery.css( elem, type, extra ) :
-
-					// Set width or height on the element
-					jQuery.style( elem, type, value, extra );
-			}, type, chainable ? margin : undefined, chainable );
-		};
-	} );
-} );
-
-
-jQuery.fn.extend( {
-
-	bind: function( types, data, fn ) {
-		return this.on( types, null, data, fn );
-	},
-	unbind: function( types, fn ) {
-		return this.off( types, null, fn );
-	},
-
-	delegate: function( selector, types, data, fn ) {
-		return this.on( types, selector, data, fn );
-	},
-	undelegate: function( selector, types, fn ) {
-
-		// ( namespace ) or ( selector, types [, fn] )
-		return arguments.length === 1 ?
-			this.off( selector, "**" ) :
-			this.off( types, selector || "**", fn );
-	}
-} );
-
-jQuery.parseJSON = JSON.parse;
-
-
-
-
-// Register as a named AMD module, since jQuery can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase jquery is used because AMD module names are
-// derived from file names, and jQuery is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of jQuery, it will work.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-if ( typeof define === "function" && define.amd ) {
-	define( "jquery", [], function() {
-		return jQuery;
-	} );
-}
-
-
-
-
-
-var
-
-	// Map over jQuery in case of overwrite
-	_jQuery = window.jQuery,
-
-	// Map over the $ in case of overwrite
-	_$ = window.$;
-
-jQuery.noConflict = function( deep ) {
-	if ( window.$ === jQuery ) {
-		window.$ = _$;
-	}
-
-	if ( deep && window.jQuery === jQuery ) {
-		window.jQuery = _jQuery;
-	}
-
-	return jQuery;
-};
-
-// Expose jQuery and $ identifiers, even in AMD
-// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
-	window.jQuery = window.$ = jQuery;
-}
-
-
-return jQuery;
-} );
diff --git a/extension/Documentation/html/_static/jquery.js b/extension/Documentation/html/_static/jquery.js
deleted file mode 100644
index f6a6a99e6..000000000
--- a/extension/Documentation/html/_static/jquery.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v3.1.0 | (c) jQuery Foundation | jquery.org/license */
-!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?a<0?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,
-r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var $=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,_=new RegExp("^(?:([+-])=|)("+$+")([a-z%]*)$","i"),aa=["Top","Right","Bottom","Left"],ba=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ca=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function da(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&_.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ea={};function fa(a){var b,c=a.ownerDocument,d=a.nodeName,e=ea[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ea[d]=e,e)}function ga(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;c<h;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==va()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===va()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ta:ua,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:ua,isPropagationStopped:ua,isImmediatePropagationStopped:ua,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ta,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ta,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ta,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&qa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ra.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return wa(this,a,b,c,d)},one:function(a,b,c,d){return wa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ua),this.each(function(){r.event.remove(this,a,c,b)})}});var xa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/<script|<style|<link/i,za=/checked\s*(?:[^=]|=\s*.checked.)/i,Aa=/^true\/(.*)/,Ba=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;l<i;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;d<e;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Ma(a,b,f),(d<0||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)})},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);f<g;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Ya=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){Za||(Za=a.requestAnimationFrame?a.requestAnimationFrame(ab):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame(Za):a.clearInterval(Za),Za=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var hb,ib=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);
-if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i<h;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=oa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=r.trim(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||pa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Na(o.pixelPosition,function(a,c){if(c)return c=Ma(a,b),Ka.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
diff --git a/extension/Documentation/html/_static/minus.png b/extension/Documentation/html/_static/minus.png
deleted file mode 100644
index d96755fdaf8bb2214971e0db9c1fd3077d7c419d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 90
zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj
kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK

diff --git a/extension/Documentation/html/_static/plus.png b/extension/Documentation/html/_static/plus.png
deleted file mode 100644
index 7107cec93a979b9a5f64843235a16651d563ce2d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 90
zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2
m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz

diff --git a/extension/Documentation/html/_static/pygments.css b/extension/Documentation/html/_static/pygments.css
deleted file mode 100644
index 20c4814dc..000000000
--- a/extension/Documentation/html/_static/pygments.css
+++ /dev/null
@@ -1,69 +0,0 @@
-.highlight .hll { background-color: #ffffcc }
-.highlight  { background: #eeffcc; }
-.highlight .c { color: #408090; font-style: italic } /* Comment */
-.highlight .err { border: 1px solid #FF0000 } /* Error */
-.highlight .k { color: #007020; font-weight: bold } /* Keyword */
-.highlight .o { color: #666666 } /* Operator */
-.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
-.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
-.highlight .cp { color: #007020 } /* Comment.Preproc */
-.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
-.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
-.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
-.highlight .gd { color: #A00000 } /* Generic.Deleted */
-.highlight .ge { font-style: italic } /* Generic.Emph */
-.highlight .gr { color: #FF0000 } /* Generic.Error */
-.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
-.highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #333333 } /* Generic.Output */
-.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
-.highlight .gs { font-weight: bold } /* Generic.Strong */
-.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: #0044DD } /* Generic.Traceback */
-.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
-.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
-.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
-.highlight .kp { color: #007020 } /* Keyword.Pseudo */
-.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
-.highlight .kt { color: #902000 } /* Keyword.Type */
-.highlight .m { color: #208050 } /* Literal.Number */
-.highlight .s { color: #4070a0 } /* Literal.String */
-.highlight .na { color: #4070a0 } /* Name.Attribute */
-.highlight .nb { color: #007020 } /* Name.Builtin */
-.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
-.highlight .no { color: #60add5 } /* Name.Constant */
-.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
-.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
-.highlight .ne { color: #007020 } /* Name.Exception */
-.highlight .nf { color: #06287e } /* Name.Function */
-.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
-.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
-.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
-.highlight .nv { color: #bb60d5 } /* Name.Variable */
-.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
-.highlight .w { color: #bbbbbb } /* Text.Whitespace */
-.highlight .mb { color: #208050 } /* Literal.Number.Bin */
-.highlight .mf { color: #208050 } /* Literal.Number.Float */
-.highlight .mh { color: #208050 } /* Literal.Number.Hex */
-.highlight .mi { color: #208050 } /* Literal.Number.Integer */
-.highlight .mo { color: #208050 } /* Literal.Number.Oct */
-.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
-.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
-.highlight .sc { color: #4070a0 } /* Literal.String.Char */
-.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
-.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
-.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
-.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
-.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
-.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
-.highlight .sx { color: #c65d09 } /* Literal.String.Other */
-.highlight .sr { color: #235388 } /* Literal.String.Regex */
-.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
-.highlight .ss { color: #517918 } /* Literal.String.Symbol */
-.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
-.highlight .fm { color: #06287e } /* Name.Function.Magic */
-.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
-.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
-.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
-.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
-.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/extension/Documentation/html/_static/searchtools.js b/extension/Documentation/html/_static/searchtools.js
deleted file mode 100644
index c82157380..000000000
--- a/extension/Documentation/html/_static/searchtools.js
+++ /dev/null
@@ -1,758 +0,0 @@
-/*
- * searchtools.js_t
- * ~~~~~~~~~~~~~~~~
- *
- * Sphinx JavaScript utilities for the full-text search.
- *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-
-/* Non-minified version JS is _stemmer.js if file is provided */ 
-/**
- * Porter Stemmer
- */
-var Stemmer = function() {
-
-  var step2list = {
-    ational: 'ate',
-    tional: 'tion',
-    enci: 'ence',
-    anci: 'ance',
-    izer: 'ize',
-    bli: 'ble',
-    alli: 'al',
-    entli: 'ent',
-    eli: 'e',
-    ousli: 'ous',
-    ization: 'ize',
-    ation: 'ate',
-    ator: 'ate',
-    alism: 'al',
-    iveness: 'ive',
-    fulness: 'ful',
-    ousness: 'ous',
-    aliti: 'al',
-    iviti: 'ive',
-    biliti: 'ble',
-    logi: 'log'
-  };
-
-  var step3list = {
-    icate: 'ic',
-    ative: '',
-    alize: 'al',
-    iciti: 'ic',
-    ical: 'ic',
-    ful: '',
-    ness: ''
-  };
-
-  var c = "[^aeiou]";          // consonant
-  var v = "[aeiouy]";          // vowel
-  var C = c + "[^aeiouy]*";    // consonant sequence
-  var V = v + "[aeiou]*";      // vowel sequence
-
-  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
-  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
-  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
-  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
-
-  this.stemWord = function (w) {
-    var stem;
-    var suffix;
-    var firstch;
-    var origword = w;
-
-    if (w.length < 3)
-      return w;
-
-    var re;
-    var re2;
-    var re3;
-    var re4;
-
-    firstch = w.substr(0,1);
-    if (firstch == "y")
-      w = firstch.toUpperCase() + w.substr(1);
-
-    // Step 1a
-    re = /^(.+?)(ss|i)es$/;
-    re2 = /^(.+?)([^s])s$/;
-
-    if (re.test(w))
-      w = w.replace(re,"$1$2");
-    else if (re2.test(w))
-      w = w.replace(re2,"$1$2");
-
-    // Step 1b
-    re = /^(.+?)eed$/;
-    re2 = /^(.+?)(ed|ing)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      re = new RegExp(mgr0);
-      if (re.test(fp[1])) {
-        re = /.$/;
-        w = w.replace(re,"");
-      }
-    }
-    else if (re2.test(w)) {
-      var fp = re2.exec(w);
-      stem = fp[1];
-      re2 = new RegExp(s_v);
-      if (re2.test(stem)) {
-        w = stem;
-        re2 = /(at|bl|iz)$/;
-        re3 = new RegExp("([^aeiouylsz])\\1$");
-        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-        if (re2.test(w))
-          w = w + "e";
-        else if (re3.test(w)) {
-          re = /.$/;
-          w = w.replace(re,"");
-        }
-        else if (re4.test(w))
-          w = w + "e";
-      }
-    }
-
-    // Step 1c
-    re = /^(.+?)y$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(s_v);
-      if (re.test(stem))
-        w = stem + "i";
-    }
-
-    // Step 2
-    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      suffix = fp[2];
-      re = new RegExp(mgr0);
-      if (re.test(stem))
-        w = stem + step2list[suffix];
-    }
-
-    // Step 3
-    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      suffix = fp[2];
-      re = new RegExp(mgr0);
-      if (re.test(stem))
-        w = stem + step3list[suffix];
-    }
-
-    // Step 4
-    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
-    re2 = /^(.+?)(s|t)(ion)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(mgr1);
-      if (re.test(stem))
-        w = stem;
-    }
-    else if (re2.test(w)) {
-      var fp = re2.exec(w);
-      stem = fp[1] + fp[2];
-      re2 = new RegExp(mgr1);
-      if (re2.test(stem))
-        w = stem;
-    }
-
-    // Step 5
-    re = /^(.+?)e$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(mgr1);
-      re2 = new RegExp(meq1);
-      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
-        w = stem;
-    }
-    re = /ll$/;
-    re2 = new RegExp(mgr1);
-    if (re.test(w) && re2.test(w)) {
-      re = /.$/;
-      w = w.replace(re,"");
-    }
-
-    // and turn initial Y back to y
-    if (firstch == "y")
-      w = firstch.toLowerCase() + w.substr(1);
-    return w;
-  }
-}
-
-
-
-/**
- * Simple result scoring code.
- */
-var Scorer = {
-  // Implement the following function to further tweak the score for each result
-  // The function takes a result array [filename, title, anchor, descr, score]
-  // and returns the new score.
-  /*
-  score: function(result) {
-    return result[4];
-  },
-  */
-
-  // query matches the full name of an object
-  objNameMatch: 11,
-  // or matches in the last dotted part of the object name
-  objPartialMatch: 6,
-  // Additive scores depending on the priority of the object
-  objPrio: {0:  15,   // used to be importantResults
-            1:  5,   // used to be objectResults
-            2: -5},  // used to be unimportantResults
-  //  Used when the priority is not in the mapping.
-  objPrioDefault: 0,
-
-  // query found in title
-  title: 15,
-  // query found in terms
-  term: 5
-};
-
-
-
-
-
-var splitChars = (function() {
-    var result = {};
-    var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
-         1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
-         2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
-         2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
-         3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
-         3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
-         4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
-         8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
-         11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
-         43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
-    var i, j, start, end;
-    for (i = 0; i < singles.length; i++) {
-        result[singles[i]] = true;
-    }
-    var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
-         [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
-         [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
-         [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
-         [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
-         [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
-         [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
-         [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
-         [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
-         [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
-         [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
-         [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
-         [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
-         [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
-         [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
-         [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
-         [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
-         [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
-         [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
-         [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
-         [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
-         [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
-         [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
-         [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
-         [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
-         [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
-         [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
-         [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
-         [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
-         [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
-         [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
-         [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
-         [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
-         [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
-         [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
-         [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
-         [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
-         [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
-         [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
-         [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
-         [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
-         [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
-         [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
-         [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
-         [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
-         [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
-         [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
-         [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
-         [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
-    for (i = 0; i < ranges.length; i++) {
-        start = ranges[i][0];
-        end = ranges[i][1];
-        for (j = start; j <= end; j++) {
-            result[j] = true;
-        }
-    }
-    return result;
-})();
-
-function splitQuery(query) {
-    var result = [];
-    var start = -1;
-    for (var i = 0; i < query.length; i++) {
-        if (splitChars[query.charCodeAt(i)]) {
-            if (start !== -1) {
-                result.push(query.slice(start, i));
-                start = -1;
-            }
-        } else if (start === -1) {
-            start = i;
-        }
-    }
-    if (start !== -1) {
-        result.push(query.slice(start));
-    }
-    return result;
-}
-
-
-
-
-/**
- * Search Module
- */
-var Search = {
-
-  _index : null,
-  _queued_query : null,
-  _pulse_status : -1,
-
-  init : function() {
-      var params = $.getQueryParameters();
-      if (params.q) {
-          var query = params.q[0];
-          $('input[name="q"]')[0].value = query;
-          this.performSearch(query);
-      }
-  },
-
-  loadIndex : function(url) {
-    $.ajax({type: "GET", url: url, data: null,
-            dataType: "script", cache: true,
-            complete: function(jqxhr, textstatus) {
-              if (textstatus != "success") {
-                document.getElementById("searchindexloader").src = url;
-              }
-            }});
-  },
-
-  setIndex : function(index) {
-    var q;
-    this._index = index;
-    if ((q = this._queued_query) !== null) {
-      this._queued_query = null;
-      Search.query(q);
-    }
-  },
-
-  hasIndex : function() {
-      return this._index !== null;
-  },
-
-  deferQuery : function(query) {
-      this._queued_query = query;
-  },
-
-  stopPulse : function() {
-      this._pulse_status = 0;
-  },
-
-  startPulse : function() {
-    if (this._pulse_status >= 0)
-        return;
-    function pulse() {
-      var i;
-      Search._pulse_status = (Search._pulse_status + 1) % 4;
-      var dotString = '';
-      for (i = 0; i < Search._pulse_status; i++)
-        dotString += '.';
-      Search.dots.text(dotString);
-      if (Search._pulse_status > -1)
-        window.setTimeout(pulse, 500);
-    }
-    pulse();
-  },
-
-  /**
-   * perform a search for something (or wait until index is loaded)
-   */
-  performSearch : function(query) {
-    // create the required interface elements
-    this.out = $('#search-results');
-    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
-    this.dots = $('<span></span>').appendTo(this.title);
-    this.status = $('<p style="display: none"></p>').appendTo(this.out);
-    this.output = $('<ul class="search"/>').appendTo(this.out);
-
-    $('#search-progress').text(_('Preparing search...'));
-    this.startPulse();
-
-    // index already loaded, the browser was quick!
-    if (this.hasIndex())
-      this.query(query);
-    else
-      this.deferQuery(query);
-  },
-
-  /**
-   * execute search (requires search index to be loaded)
-   */
-  query : function(query) {
-    var i;
-    var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
-
-    // stem the searchterms and add them to the correct list
-    var stemmer = new Stemmer();
-    var searchterms = [];
-    var excluded = [];
-    var hlterms = [];
-    var tmp = splitQuery(query);
-    var objectterms = [];
-    for (i = 0; i < tmp.length; i++) {
-      if (tmp[i] !== "") {
-          objectterms.push(tmp[i].toLowerCase());
-      }
-
-      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
-          tmp[i] === "") {
-        // skip this "word"
-        continue;
-      }
-      // stem the word
-      var word = stemmer.stemWord(tmp[i].toLowerCase());
-      // prevent stemmer from cutting word smaller than two chars
-      if(word.length < 3 && tmp[i].length >= 3) {
-        word = tmp[i];
-      }
-      var toAppend;
-      // select the correct list
-      if (word[0] == '-') {
-        toAppend = excluded;
-        word = word.substr(1);
-      }
-      else {
-        toAppend = searchterms;
-        hlterms.push(tmp[i].toLowerCase());
-      }
-      // only add if not already in the list
-      if (!$u.contains(toAppend, word))
-        toAppend.push(word);
-    }
-    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
-
-    // console.debug('SEARCH: searching for:');
-    // console.info('required: ', searchterms);
-    // console.info('excluded: ', excluded);
-
-    // prepare search
-    var terms = this._index.terms;
-    var titleterms = this._index.titleterms;
-
-    // array of [filename, title, anchor, descr, score]
-    var results = [];
-    $('#search-progress').empty();
-
-    // lookup as object
-    for (i = 0; i < objectterms.length; i++) {
-      var others = [].concat(objectterms.slice(0, i),
-                             objectterms.slice(i+1, objectterms.length));
-      results = results.concat(this.performObjectSearch(objectterms[i], others));
-    }
-
-    // lookup as search terms in fulltext
-    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
-
-    // let the scorer override scores with a custom scoring function
-    if (Scorer.score) {
-      for (i = 0; i < results.length; i++)
-        results[i][4] = Scorer.score(results[i]);
-    }
-
-    // now sort the results by score (in opposite order of appearance, since the
-    // display function below uses pop() to retrieve items) and then
-    // alphabetically
-    results.sort(function(a, b) {
-      var left = a[4];
-      var right = b[4];
-      if (left > right) {
-        return 1;
-      } else if (left < right) {
-        return -1;
-      } else {
-        // same score: sort alphabetically
-        left = a[1].toLowerCase();
-        right = b[1].toLowerCase();
-        return (left > right) ? -1 : ((left < right) ? 1 : 0);
-      }
-    });
-
-    // for debugging
-    //Search.lastresults = results.slice();  // a copy
-    //console.info('search results:', Search.lastresults);
-
-    // print the results
-    var resultCount = results.length;
-    function displayNextItem() {
-      // results left, load the summary and display it
-      if (results.length) {
-        var item = results.pop();
-        var listItem = $('<li style="display:none"></li>');
-        if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') {
-          // dirhtml builder
-          var dirname = item[0] + '/';
-          if (dirname.match(/\/index\/$/)) {
-            dirname = dirname.substring(0, dirname.length-6);
-          } else if (dirname == 'index/') {
-            dirname = '';
-          }
-          listItem.append($('<a/>').attr('href',
-            DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
-            highlightstring + item[2]).html(item[1]));
-        } else {
-          // normal html builders
-          listItem.append($('<a/>').attr('href',
-            item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
-            highlightstring + item[2]).html(item[1]));
-        }
-        if (item[3]) {
-          listItem.append($('<span> (' + item[3] + ')</span>'));
-          Search.output.append(listItem);
-          listItem.slideDown(5, function() {
-            displayNextItem();
-          });
-        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
-          var suffix = DOCUMENTATION_OPTIONS.SOURCELINK_SUFFIX;
-          $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[5] + (item[5].slice(-suffix.length) === suffix ? '' : suffix),
-                  dataType: "text",
-                  complete: function(jqxhr, textstatus) {
-                    var data = jqxhr.responseText;
-                    if (data !== '' && data !== undefined) {
-                      listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
-                    }
-                    Search.output.append(listItem);
-                    listItem.slideDown(5, function() {
-                      displayNextItem();
-                    });
-                  }});
-        } else {
-          // no source available, just display title
-          Search.output.append(listItem);
-          listItem.slideDown(5, function() {
-            displayNextItem();
-          });
-        }
-      }
-      // search finished, update title and status message
-      else {
-        Search.stopPulse();
-        Search.title.text(_('Search Results'));
-        if (!resultCount)
-          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
-        else
-            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
-        Search.status.fadeIn(500);
-      }
-    }
-    displayNextItem();
-  },
-
-  /**
-   * search for object names
-   */
-  performObjectSearch : function(object, otherterms) {
-    var filenames = this._index.filenames;
-    var docnames = this._index.docnames;
-    var objects = this._index.objects;
-    var objnames = this._index.objnames;
-    var titles = this._index.titles;
-
-    var i;
-    var results = [];
-
-    for (var prefix in objects) {
-      for (var name in objects[prefix]) {
-        var fullname = (prefix ? prefix + '.' : '') + name;
-        if (fullname.toLowerCase().indexOf(object) > -1) {
-          var score = 0;
-          var parts = fullname.split('.');
-          // check for different match types: exact matches of full name or
-          // "last name" (i.e. last dotted part)
-          if (fullname == object || parts[parts.length - 1] == object) {
-            score += Scorer.objNameMatch;
-          // matches in last name
-          } else if (parts[parts.length - 1].indexOf(object) > -1) {
-            score += Scorer.objPartialMatch;
-          }
-          var match = objects[prefix][name];
-          var objname = objnames[match[1]][2];
-          var title = titles[match[0]];
-          // If more than one term searched for, we require other words to be
-          // found in the name/title/description
-          if (otherterms.length > 0) {
-            var haystack = (prefix + ' ' + name + ' ' +
-                            objname + ' ' + title).toLowerCase();
-            var allfound = true;
-            for (i = 0; i < otherterms.length; i++) {
-              if (haystack.indexOf(otherterms[i]) == -1) {
-                allfound = false;
-                break;
-              }
-            }
-            if (!allfound) {
-              continue;
-            }
-          }
-          var descr = objname + _(', in ') + title;
-
-          var anchor = match[3];
-          if (anchor === '')
-            anchor = fullname;
-          else if (anchor == '-')
-            anchor = objnames[match[1]][1] + '-' + fullname;
-          // add custom score for some objects according to scorer
-          if (Scorer.objPrio.hasOwnProperty(match[2])) {
-            score += Scorer.objPrio[match[2]];
-          } else {
-            score += Scorer.objPrioDefault;
-          }
-          results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
-        }
-      }
-    }
-
-    return results;
-  },
-
-  /**
-   * search for full-text terms in the index
-   */
-  performTermsSearch : function(searchterms, excluded, terms, titleterms) {
-    var docnames = this._index.docnames;
-    var filenames = this._index.filenames;
-    var titles = this._index.titles;
-
-    var i, j, file;
-    var fileMap = {};
-    var scoreMap = {};
-    var results = [];
-
-    // perform the search on the required terms
-    for (i = 0; i < searchterms.length; i++) {
-      var word = searchterms[i];
-      var files = [];
-      var _o = [
-        {files: terms[word], score: Scorer.term},
-        {files: titleterms[word], score: Scorer.title}
-      ];
-
-      // no match but word was a required one
-      if ($u.every(_o, function(o){return o.files === undefined;})) {
-        break;
-      }
-      // found search word in contents
-      $u.each(_o, function(o) {
-        var _files = o.files;
-        if (_files === undefined)
-          return
-
-        if (_files.length === undefined)
-          _files = [_files];
-        files = files.concat(_files);
-
-        // set score for the word in each file to Scorer.term
-        for (j = 0; j < _files.length; j++) {
-          file = _files[j];
-          if (!(file in scoreMap))
-            scoreMap[file] = {}
-          scoreMap[file][word] = o.score;
-        }
-      });
-
-      // create the mapping
-      for (j = 0; j < files.length; j++) {
-        file = files[j];
-        if (file in fileMap)
-          fileMap[file].push(word);
-        else
-          fileMap[file] = [word];
-      }
-    }
-
-    // now check if the files don't contain excluded terms
-    for (file in fileMap) {
-      var valid = true;
-
-      // check if all requirements are matched
-      if (fileMap[file].length != searchterms.length)
-          continue;
-
-      // ensure that none of the excluded terms is in the search result
-      for (i = 0; i < excluded.length; i++) {
-        if (terms[excluded[i]] == file ||
-            titleterms[excluded[i]] == file ||
-            $u.contains(terms[excluded[i]] || [], file) ||
-            $u.contains(titleterms[excluded[i]] || [], file)) {
-          valid = false;
-          break;
-        }
-      }
-
-      // if we have still a valid result we can add it to the result list
-      if (valid) {
-        // select one (max) score for the file.
-        // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
-        var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
-        results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
-      }
-    }
-    return results;
-  },
-
-  /**
-   * helper function to return a node containing the
-   * search summary for a given text. keywords is a list
-   * of stemmed words, hlwords is the list of normal, unstemmed
-   * words. the first one is used to find the occurrence, the
-   * latter for highlighting it.
-   */
-  makeSearchSummary : function(text, keywords, hlwords) {
-    var textLower = text.toLowerCase();
-    var start = 0;
-    $.each(keywords, function() {
-      var i = textLower.indexOf(this.toLowerCase());
-      if (i > -1)
-        start = i;
-    });
-    start = Math.max(start - 120, 0);
-    var excerpt = ((start > 0) ? '...' : '') +
-      $.trim(text.substr(start, 240)) +
-      ((start + 240 - text.length) ? '...' : '');
-    var rv = $('<div class="context"></div>').text(excerpt);
-    $.each(hlwords, function() {
-      rv = rv.highlightText(this, 'highlighted');
-    });
-    return rv;
-  }
-};
-
-$(document).ready(function() {
-  Search.init();
-});
\ No newline at end of file
diff --git a/extension/Documentation/html/_static/sidebar.js b/extension/Documentation/html/_static/sidebar.js
deleted file mode 100644
index 332bbf246..000000000
--- a/extension/Documentation/html/_static/sidebar.js
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * sidebar.js
- * ~~~~~~~~~~
- *
- * This script makes the Sphinx sidebar collapsible.
- *
- * .sphinxsidebar contains .sphinxsidebarwrapper.  This script adds
- * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
- * used to collapse and expand the sidebar.
- *
- * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
- * and the width of the sidebar and the margin-left of the document
- * are decreased. When the sidebar is expanded the opposite happens.
- * This script saves a per-browser/per-session cookie used to
- * remember the position of the sidebar among the pages.
- * Once the browser is closed the cookie is deleted and the position
- * reset to the default (expanded).
- *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-$(function() {
-  
-  
-  
-  
-  
-  
-  
-
-  // global elements used by the functions.
-  // the 'sidebarbutton' element is defined as global after its
-  // creation, in the add_sidebar_button function
-  var bodywrapper = $('.bodywrapper');
-  var sidebar = $('.sphinxsidebar');
-  var sidebarwrapper = $('.sphinxsidebarwrapper');
-
-  // for some reason, the document has no sidebar; do not run into errors
-  if (!sidebar.length) return;
-
-  // original margin-left of the bodywrapper and width of the sidebar
-  // with the sidebar expanded
-  var bw_margin_expanded = bodywrapper.css('margin-left');
-  var ssb_width_expanded = sidebar.width();
-
-  // margin-left of the bodywrapper and width of the sidebar
-  // with the sidebar collapsed
-  var bw_margin_collapsed = '.8em';
-  var ssb_width_collapsed = '.8em';
-
-  // colors used by the current theme
-  var dark_color = $('.related').css('background-color');
-  var light_color = $('.document').css('background-color');
-
-  function sidebar_is_collapsed() {
-    return sidebarwrapper.is(':not(:visible)');
-  }
-
-  function toggle_sidebar() {
-    if (sidebar_is_collapsed())
-      expand_sidebar();
-    else
-      collapse_sidebar();
-  }
-
-  function collapse_sidebar() {
-    sidebarwrapper.hide();
-    sidebar.css('width', ssb_width_collapsed);
-    bodywrapper.css('margin-left', bw_margin_collapsed);
-    sidebarbutton.css({
-        'margin-left': '0',
-        'height': bodywrapper.height()
-    });
-    sidebarbutton.find('span').text('»');
-    sidebarbutton.attr('title', _('Expand sidebar'));
-    document.cookie = 'sidebar=collapsed';
-  }
-
-  function expand_sidebar() {
-    bodywrapper.css('margin-left', bw_margin_expanded);
-    sidebar.css('width', ssb_width_expanded);
-    sidebarwrapper.show();
-    sidebarbutton.css({
-        'margin-left': ssb_width_expanded-12,
-        'height': bodywrapper.height()
-    });
-    sidebarbutton.find('span').text('«');
-    sidebarbutton.attr('title', _('Collapse sidebar'));
-    document.cookie = 'sidebar=expanded';
-  }
-
-  function add_sidebar_button() {
-    sidebarwrapper.css({
-        'float': 'left',
-        'margin-right': '0',
-        'width': ssb_width_expanded - 28
-    });
-    // create the button
-    sidebar.append(
-        '<div id="sidebarbutton"><span>&laquo;</span></div>'
-    );
-    var sidebarbutton = $('#sidebarbutton');
-    light_color = sidebarbutton.css('background-color');
-    // find the height of the viewport to center the '<<' in the page
-    var viewport_height;
-    if (window.innerHeight)
- 	  viewport_height = window.innerHeight;
-    else
-	  viewport_height = $(window).height();
-    sidebarbutton.find('span').css({
-        'display': 'block',
-        'margin-top': (viewport_height - sidebar.position().top - 20) / 2
-    });
-
-    sidebarbutton.click(toggle_sidebar);
-    sidebarbutton.attr('title', _('Collapse sidebar'));
-    sidebarbutton.css({
-        'color': '#FFFFFF',
-        'border-left': '1px solid ' + dark_color,
-        'font-size': '1.2em',
-        'cursor': 'pointer',
-        'height': bodywrapper.height(),
-        'padding-top': '1px',
-        'margin-left': ssb_width_expanded - 12
-    });
-
-    sidebarbutton.hover(
-      function () {
-          $(this).css('background-color', dark_color);
-      },
-      function () {
-          $(this).css('background-color', light_color);
-      }
-    );
-  }
-
-  function set_position_from_cookie() {
-    if (!document.cookie)
-      return;
-    var items = document.cookie.split(';');
-    for(var k=0; k<items.length; k++) {
-      var key_val = items[k].split('=');
-      var key = key_val[0].replace(/ /, "");  // strip leading spaces
-      if (key == 'sidebar') {
-        var value = key_val[1];
-        if ((value == 'collapsed') && (!sidebar_is_collapsed()))
-          collapse_sidebar();
-        else if ((value == 'expanded') && (sidebar_is_collapsed()))
-          expand_sidebar();
-      }
-    }
-  }
-
-  add_sidebar_button();
-  var sidebarbutton = $('#sidebarbutton');
-  set_position_from_cookie();
-});
\ No newline at end of file
diff --git a/extension/Documentation/html/_static/underscore-1.3.1.js b/extension/Documentation/html/_static/underscore-1.3.1.js
deleted file mode 100644
index 208d4cd89..000000000
--- a/extension/Documentation/html/_static/underscore-1.3.1.js
+++ /dev/null
@@ -1,999 +0,0 @@
-//     Underscore.js 1.3.1
-//     (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-//     Underscore is freely distributable under the MIT license.
-//     Portions of Underscore are inspired or borrowed from Prototype,
-//     Oliver Steele's Functional, and John Resig's Micro-Templating.
-//     For all details and documentation:
-//     http://documentcloud.github.com/underscore
-
-(function() {
-
-  // Baseline setup
-  // --------------
-
-  // Establish the root object, `window` in the browser, or `global` on the server.
-  var root = this;
-
-  // Save the previous value of the `_` variable.
-  var previousUnderscore = root._;
-
-  // Establish the object that gets returned to break out of a loop iteration.
-  var breaker = {};
-
-  // Save bytes in the minified (but not gzipped) version:
-  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
-
-  // Create quick reference variables for speed access to core prototypes.
-  var slice            = ArrayProto.slice,
-      unshift          = ArrayProto.unshift,
-      toString         = ObjProto.toString,
-      hasOwnProperty   = ObjProto.hasOwnProperty;
-
-  // All **ECMAScript 5** native function implementations that we hope to use
-  // are declared here.
-  var
-    nativeForEach      = ArrayProto.forEach,
-    nativeMap          = ArrayProto.map,
-    nativeReduce       = ArrayProto.reduce,
-    nativeReduceRight  = ArrayProto.reduceRight,
-    nativeFilter       = ArrayProto.filter,
-    nativeEvery        = ArrayProto.every,
-    nativeSome         = ArrayProto.some,
-    nativeIndexOf      = ArrayProto.indexOf,
-    nativeLastIndexOf  = ArrayProto.lastIndexOf,
-    nativeIsArray      = Array.isArray,
-    nativeKeys         = Object.keys,
-    nativeBind         = FuncProto.bind;
-
-  // Create a safe reference to the Underscore object for use below.
-  var _ = function(obj) { return new wrapper(obj); };
-
-  // Export the Underscore object for **Node.js**, with
-  // backwards-compatibility for the old `require()` API. If we're in
-  // the browser, add `_` as a global object via a string identifier,
-  // for Closure Compiler "advanced" mode.
-  if (typeof exports !== 'undefined') {
-    if (typeof module !== 'undefined' && module.exports) {
-      exports = module.exports = _;
-    }
-    exports._ = _;
-  } else {
-    root['_'] = _;
-  }
-
-  // Current version.
-  _.VERSION = '1.3.1';
-
-  // Collection Functions
-  // --------------------
-
-  // The cornerstone, an `each` implementation, aka `forEach`.
-  // Handles objects with the built-in `forEach`, arrays, and raw objects.
-  // Delegates to **ECMAScript 5**'s native `forEach` if available.
-  var each = _.each = _.forEach = function(obj, iterator, context) {
-    if (obj == null) return;
-    if (nativeForEach && obj.forEach === nativeForEach) {
-      obj.forEach(iterator, context);
-    } else if (obj.length === +obj.length) {
-      for (var i = 0, l = obj.length; i < l; i++) {
-        if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
-      }
-    } else {
-      for (var key in obj) {
-        if (_.has(obj, key)) {
-          if (iterator.call(context, obj[key], key, obj) === breaker) return;
-        }
-      }
-    }
-  };
-
-  // Return the results of applying the iterator to each element.
-  // Delegates to **ECMAScript 5**'s native `map` if available.
-  _.map = _.collect = function(obj, iterator, context) {
-    var results = [];
-    if (obj == null) return results;
-    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
-    each(obj, function(value, index, list) {
-      results[results.length] = iterator.call(context, value, index, list);
-    });
-    if (obj.length === +obj.length) results.length = obj.length;
-    return results;
-  };
-
-  // **Reduce** builds up a single result from a list of values, aka `inject`,
-  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
-  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
-    var initial = arguments.length > 2;
-    if (obj == null) obj = [];
-    if (nativeReduce && obj.reduce === nativeReduce) {
-      if (context) iterator = _.bind(iterator, context);
-      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
-    }
-    each(obj, function(value, index, list) {
-      if (!initial) {
-        memo = value;
-        initial = true;
-      } else {
-        memo = iterator.call(context, memo, value, index, list);
-      }
-    });
-    if (!initial) throw new TypeError('Reduce of empty array with no initial value');
-    return memo;
-  };
-
-  // The right-associative version of reduce, also known as `foldr`.
-  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
-  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
-    var initial = arguments.length > 2;
-    if (obj == null) obj = [];
-    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
-      if (context) iterator = _.bind(iterator, context);
-      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
-    }
-    var reversed = _.toArray(obj).reverse();
-    if (context && !initial) iterator = _.bind(iterator, context);
-    return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
-  };
-
-  // Return the first value which passes a truth test. Aliased as `detect`.
-  _.find = _.detect = function(obj, iterator, context) {
-    var result;
-    any(obj, function(value, index, list) {
-      if (iterator.call(context, value, index, list)) {
-        result = value;
-        return true;
-      }
-    });
-    return result;
-  };
-
-  // Return all the elements that pass a truth test.
-  // Delegates to **ECMAScript 5**'s native `filter` if available.
-  // Aliased as `select`.
-  _.filter = _.select = function(obj, iterator, context) {
-    var results = [];
-    if (obj == null) return results;
-    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
-    each(obj, function(value, index, list) {
-      if (iterator.call(context, value, index, list)) results[results.length] = value;
-    });
-    return results;
-  };
-
-  // Return all the elements for which a truth test fails.
-  _.reject = function(obj, iterator, context) {
-    var results = [];
-    if (obj == null) return results;
-    each(obj, function(value, index, list) {
-      if (!iterator.call(context, value, index, list)) results[results.length] = value;
-    });
-    return results;
-  };
-
-  // Determine whether all of the elements match a truth test.
-  // Delegates to **ECMAScript 5**'s native `every` if available.
-  // Aliased as `all`.
-  _.every = _.all = function(obj, iterator, context) {
-    var result = true;
-    if (obj == null) return result;
-    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
-    each(obj, function(value, index, list) {
-      if (!(result = result && iterator.call(context, value, index, list))) return breaker;
-    });
-    return result;
-  };
-
-  // Determine if at least one element in the object matches a truth test.
-  // Delegates to **ECMAScript 5**'s native `some` if available.
-  // Aliased as `any`.
-  var any = _.some = _.any = function(obj, iterator, context) {
-    iterator || (iterator = _.identity);
-    var result = false;
-    if (obj == null) return result;
-    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
-    each(obj, function(value, index, list) {
-      if (result || (result = iterator.call(context, value, index, list))) return breaker;
-    });
-    return !!result;
-  };
-
-  // Determine if a given value is included in the array or object using `===`.
-  // Aliased as `contains`.
-  _.include = _.contains = function(obj, target) {
-    var found = false;
-    if (obj == null) return found;
-    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
-    found = any(obj, function(value) {
-      return value === target;
-    });
-    return found;
-  };
-
-  // Invoke a method (with arguments) on every item in a collection.
-  _.invoke = function(obj, method) {
-    var args = slice.call(arguments, 2);
-    return _.map(obj, function(value) {
-      return (_.isFunction(method) ? method || value : value[method]).apply(value, args);
-    });
-  };
-
-  // Convenience version of a common use case of `map`: fetching a property.
-  _.pluck = function(obj, key) {
-    return _.map(obj, function(value){ return value[key]; });
-  };
-
-  // Return the maximum element or (element-based computation).
-  _.max = function(obj, iterator, context) {
-    if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
-    if (!iterator && _.isEmpty(obj)) return -Infinity;
-    var result = {computed : -Infinity};
-    each(obj, function(value, index, list) {
-      var computed = iterator ? iterator.call(context, value, index, list) : value;
-      computed >= result.computed && (result = {value : value, computed : computed});
-    });
-    return result.value;
-  };
-
-  // Return the minimum element (or element-based computation).
-  _.min = function(obj, iterator, context) {
-    if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
-    if (!iterator && _.isEmpty(obj)) return Infinity;
-    var result = {computed : Infinity};
-    each(obj, function(value, index, list) {
-      var computed = iterator ? iterator.call(context, value, index, list) : value;
-      computed < result.computed && (result = {value : value, computed : computed});
-    });
-    return result.value;
-  };
-
-  // Shuffle an array.
-  _.shuffle = function(obj) {
-    var shuffled = [], rand;
-    each(obj, function(value, index, list) {
-      if (index == 0) {
-        shuffled[0] = value;
-      } else {
-        rand = Math.floor(Math.random() * (index + 1));
-        shuffled[index] = shuffled[rand];
-        shuffled[rand] = value;
-      }
-    });
-    return shuffled;
-  };
-
-  // Sort the object's values by a criterion produced by an iterator.
-  _.sortBy = function(obj, iterator, context) {
-    return _.pluck(_.map(obj, function(value, index, list) {
-      return {
-        value : value,
-        criteria : iterator.call(context, value, index, list)
-      };
-    }).sort(function(left, right) {
-      var a = left.criteria, b = right.criteria;
-      return a < b ? -1 : a > b ? 1 : 0;
-    }), 'value');
-  };
-
-  // Groups the object's values by a criterion. Pass either a string attribute
-  // to group by, or a function that returns the criterion.
-  _.groupBy = function(obj, val) {
-    var result = {};
-    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
-    each(obj, function(value, index) {
-      var key = iterator(value, index);
-      (result[key] || (result[key] = [])).push(value);
-    });
-    return result;
-  };
-
-  // Use a comparator function to figure out at what index an object should
-  // be inserted so as to maintain order. Uses binary search.
-  _.sortedIndex = function(array, obj, iterator) {
-    iterator || (iterator = _.identity);
-    var low = 0, high = array.length;
-    while (low < high) {
-      var mid = (low + high) >> 1;
-      iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
-    }
-    return low;
-  };
-
-  // Safely convert anything iterable into a real, live array.
-  _.toArray = function(iterable) {
-    if (!iterable)                return [];
-    if (iterable.toArray)         return iterable.toArray();
-    if (_.isArray(iterable))      return slice.call(iterable);
-    if (_.isArguments(iterable))  return slice.call(iterable);
-    return _.values(iterable);
-  };
-
-  // Return the number of elements in an object.
-  _.size = function(obj) {
-    return _.toArray(obj).length;
-  };
-
-  // Array Functions
-  // ---------------
-
-  // Get the first element of an array. Passing **n** will return the first N
-  // values in the array. Aliased as `head`. The **guard** check allows it to work
-  // with `_.map`.
-  _.first = _.head = function(array, n, guard) {
-    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
-  };
-
-  // Returns everything but the last entry of the array. Especcialy useful on
-  // the arguments object. Passing **n** will return all the values in
-  // the array, excluding the last N. The **guard** check allows it to work with
-  // `_.map`.
-  _.initial = function(array, n, guard) {
-    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
-  };
-
-  // Get the last element of an array. Passing **n** will return the last N
-  // values in the array. The **guard** check allows it to work with `_.map`.
-  _.last = function(array, n, guard) {
-    if ((n != null) && !guard) {
-      return slice.call(array, Math.max(array.length - n, 0));
-    } else {
-      return array[array.length - 1];
-    }
-  };
-
-  // Returns everything but the first entry of the array. Aliased as `tail`.
-  // Especially useful on the arguments object. Passing an **index** will return
-  // the rest of the values in the array from that index onward. The **guard**
-  // check allows it to work with `_.map`.
-  _.rest = _.tail = function(array, index, guard) {
-    return slice.call(array, (index == null) || guard ? 1 : index);
-  };
-
-  // Trim out all falsy values from an array.
-  _.compact = function(array) {
-    return _.filter(array, function(value){ return !!value; });
-  };
-
-  // Return a completely flattened version of an array.
-  _.flatten = function(array, shallow) {
-    return _.reduce(array, function(memo, value) {
-      if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
-      memo[memo.length] = value;
-      return memo;
-    }, []);
-  };
-
-  // Return a version of the array that does not contain the specified value(s).
-  _.without = function(array) {
-    return _.difference(array, slice.call(arguments, 1));
-  };
-
-  // Produce a duplicate-free version of the array. If the array has already
-  // been sorted, you have the option of using a faster algorithm.
-  // Aliased as `unique`.
-  _.uniq = _.unique = function(array, isSorted, iterator) {
-    var initial = iterator ? _.map(array, iterator) : array;
-    var result = [];
-    _.reduce(initial, function(memo, el, i) {
-      if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {
-        memo[memo.length] = el;
-        result[result.length] = array[i];
-      }
-      return memo;
-    }, []);
-    return result;
-  };
-
-  // Produce an array that contains the union: each distinct element from all of
-  // the passed-in arrays.
-  _.union = function() {
-    return _.uniq(_.flatten(arguments, true));
-  };
-
-  // Produce an array that contains every item shared between all the
-  // passed-in arrays. (Aliased as "intersect" for back-compat.)
-  _.intersection = _.intersect = function(array) {
-    var rest = slice.call(arguments, 1);
-    return _.filter(_.uniq(array), function(item) {
-      return _.every(rest, function(other) {
-        return _.indexOf(other, item) >= 0;
-      });
-    });
-  };
-
-  // Take the difference between one array and a number of other arrays.
-  // Only the elements present in just the first array will remain.
-  _.difference = function(array) {
-    var rest = _.flatten(slice.call(arguments, 1));
-    return _.filter(array, function(value){ return !_.include(rest, value); });
-  };
-
-  // Zip together multiple lists into a single array -- elements that share
-  // an index go together.
-  _.zip = function() {
-    var args = slice.call(arguments);
-    var length = _.max(_.pluck(args, 'length'));
-    var results = new Array(length);
-    for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
-    return results;
-  };
-
-  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
-  // we need this function. Return the position of the first occurrence of an
-  // item in an array, or -1 if the item is not included in the array.
-  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
-  // If the array is large and already in sort order, pass `true`
-  // for **isSorted** to use binary search.
-  _.indexOf = function(array, item, isSorted) {
-    if (array == null) return -1;
-    var i, l;
-    if (isSorted) {
-      i = _.sortedIndex(array, item);
-      return array[i] === item ? i : -1;
-    }
-    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
-    for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
-    return -1;
-  };
-
-  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
-  _.lastIndexOf = function(array, item) {
-    if (array == null) return -1;
-    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
-    var i = array.length;
-    while (i--) if (i in array && array[i] === item) return i;
-    return -1;
-  };
-
-  // Generate an integer Array containing an arithmetic progression. A port of
-  // the native Python `range()` function. See
-  // [the Python documentation](http://docs.python.org/library/functions.html#range).
-  _.range = function(start, stop, step) {
-    if (arguments.length <= 1) {
-      stop = start || 0;
-      start = 0;
-    }
-    step = arguments[2] || 1;
-
-    var len = Math.max(Math.ceil((stop - start) / step), 0);
-    var idx = 0;
-    var range = new Array(len);
-
-    while(idx < len) {
-      range[idx++] = start;
-      start += step;
-    }
-
-    return range;
-  };
-
-  // Function (ahem) Functions
-  // ------------------
-
-  // Reusable constructor function for prototype setting.
-  var ctor = function(){};
-
-  // Create a function bound to a given object (assigning `this`, and arguments,
-  // optionally). Binding with arguments is also known as `curry`.
-  // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
-  // We check for `func.bind` first, to fail fast when `func` is undefined.
-  _.bind = function bind(func, context) {
-    var bound, args;
-    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
-    if (!_.isFunction(func)) throw new TypeError;
-    args = slice.call(arguments, 2);
-    return bound = function() {
-      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
-      ctor.prototype = func.prototype;
-      var self = new ctor;
-      var result = func.apply(self, args.concat(slice.call(arguments)));
-      if (Object(result) === result) return result;
-      return self;
-    };
-  };
-
-  // Bind all of an object's methods to that object. Useful for ensuring that
-  // all callbacks defined on an object belong to it.
-  _.bindAll = function(obj) {
-    var funcs = slice.call(arguments, 1);
-    if (funcs.length == 0) funcs = _.functions(obj);
-    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
-    return obj;
-  };
-
-  // Memoize an expensive function by storing its results.
-  _.memoize = function(func, hasher) {
-    var memo = {};
-    hasher || (hasher = _.identity);
-    return function() {
-      var key = hasher.apply(this, arguments);
-      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
-    };
-  };
-
-  // Delays a function for the given number of milliseconds, and then calls
-  // it with the arguments supplied.
-  _.delay = function(func, wait) {
-    var args = slice.call(arguments, 2);
-    return setTimeout(function(){ return func.apply(func, args); }, wait);
-  };
-
-  // Defers a function, scheduling it to run after the current call stack has
-  // cleared.
-  _.defer = function(func) {
-    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
-  };
-
-  // Returns a function, that, when invoked, will only be triggered at most once
-  // during a given window of time.
-  _.throttle = function(func, wait) {
-    var context, args, timeout, throttling, more;
-    var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
-    return function() {
-      context = this; args = arguments;
-      var later = function() {
-        timeout = null;
-        if (more) func.apply(context, args);
-        whenDone();
-      };
-      if (!timeout) timeout = setTimeout(later, wait);
-      if (throttling) {
-        more = true;
-      } else {
-        func.apply(context, args);
-      }
-      whenDone();
-      throttling = true;
-    };
-  };
-
-  // Returns a function, that, as long as it continues to be invoked, will not
-  // be triggered. The function will be called after it stops being called for
-  // N milliseconds.
-  _.debounce = function(func, wait) {
-    var timeout;
-    return function() {
-      var context = this, args = arguments;
-      var later = function() {
-        timeout = null;
-        func.apply(context, args);
-      };
-      clearTimeout(timeout);
-      timeout = setTimeout(later, wait);
-    };
-  };
-
-  // Returns a function that will be executed at most one time, no matter how
-  // often you call it. Useful for lazy initialization.
-  _.once = function(func) {
-    var ran = false, memo;
-    return function() {
-      if (ran) return memo;
-      ran = true;
-      return memo = func.apply(this, arguments);
-    };
-  };
-
-  // Returns the first function passed as an argument to the second,
-  // allowing you to adjust arguments, run code before and after, and
-  // conditionally execute the original function.
-  _.wrap = function(func, wrapper) {
-    return function() {
-      var args = [func].concat(slice.call(arguments, 0));
-      return wrapper.apply(this, args);
-    };
-  };
-
-  // Returns a function that is the composition of a list of functions, each
-  // consuming the return value of the function that follows.
-  _.compose = function() {
-    var funcs = arguments;
-    return function() {
-      var args = arguments;
-      for (var i = funcs.length - 1; i >= 0; i--) {
-        args = [funcs[i].apply(this, args)];
-      }
-      return args[0];
-    };
-  };
-
-  // Returns a function that will only be executed after being called N times.
-  _.after = function(times, func) {
-    if (times <= 0) return func();
-    return function() {
-      if (--times < 1) { return func.apply(this, arguments); }
-    };
-  };
-
-  // Object Functions
-  // ----------------
-
-  // Retrieve the names of an object's properties.
-  // Delegates to **ECMAScript 5**'s native `Object.keys`
-  _.keys = nativeKeys || function(obj) {
-    if (obj !== Object(obj)) throw new TypeError('Invalid object');
-    var keys = [];
-    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
-    return keys;
-  };
-
-  // Retrieve the values of an object's properties.
-  _.values = function(obj) {
-    return _.map(obj, _.identity);
-  };
-
-  // Return a sorted list of the function names available on the object.
-  // Aliased as `methods`
-  _.functions = _.methods = function(obj) {
-    var names = [];
-    for (var key in obj) {
-      if (_.isFunction(obj[key])) names.push(key);
-    }
-    return names.sort();
-  };
-
-  // Extend a given object with all the properties in passed-in object(s).
-  _.extend = function(obj) {
-    each(slice.call(arguments, 1), function(source) {
-      for (var prop in source) {
-        obj[prop] = source[prop];
-      }
-    });
-    return obj;
-  };
-
-  // Fill in a given object with default properties.
-  _.defaults = function(obj) {
-    each(slice.call(arguments, 1), function(source) {
-      for (var prop in source) {
-        if (obj[prop] == null) obj[prop] = source[prop];
-      }
-    });
-    return obj;
-  };
-
-  // Create a (shallow-cloned) duplicate of an object.
-  _.clone = function(obj) {
-    if (!_.isObject(obj)) return obj;
-    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
-  };
-
-  // Invokes interceptor with the obj, and then returns obj.
-  // The primary purpose of this method is to "tap into" a method chain, in
-  // order to perform operations on intermediate results within the chain.
-  _.tap = function(obj, interceptor) {
-    interceptor(obj);
-    return obj;
-  };
-
-  // Internal recursive comparison function.
-  function eq(a, b, stack) {
-    // Identical objects are equal. `0 === -0`, but they aren't identical.
-    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
-    if (a === b) return a !== 0 || 1 / a == 1 / b;
-    // A strict comparison is necessary because `null == undefined`.
-    if (a == null || b == null) return a === b;
-    // Unwrap any wrapped objects.
-    if (a._chain) a = a._wrapped;
-    if (b._chain) b = b._wrapped;
-    // Invoke a custom `isEqual` method if one is provided.
-    if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
-    if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
-    // Compare `[[Class]]` names.
-    var className = toString.call(a);
-    if (className != toString.call(b)) return false;
-    switch (className) {
-      // Strings, numbers, dates, and booleans are compared by value.
-      case '[object String]':
-        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
-        // equivalent to `new String("5")`.
-        return a == String(b);
-      case '[object Number]':
-        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
-        // other numeric values.
-        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
-      case '[object Date]':
-      case '[object Boolean]':
-        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
-        // millisecond representations. Note that invalid dates with millisecond representations
-        // of `NaN` are not equivalent.
-        return +a == +b;
-      // RegExps are compared by their source patterns and flags.
-      case '[object RegExp]':
-        return a.source == b.source &&
-               a.global == b.global &&
-               a.multiline == b.multiline &&
-               a.ignoreCase == b.ignoreCase;
-    }
-    if (typeof a != 'object' || typeof b != 'object') return false;
-    // Assume equality for cyclic structures. The algorithm for detecting cyclic
-    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-    var length = stack.length;
-    while (length--) {
-      // Linear search. Performance is inversely proportional to the number of
-      // unique nested structures.
-      if (stack[length] == a) return true;
-    }
-    // Add the first object to the stack of traversed objects.
-    stack.push(a);
-    var size = 0, result = true;
-    // Recursively compare objects and arrays.
-    if (className == '[object Array]') {
-      // Compare array lengths to determine if a deep comparison is necessary.
-      size = a.length;
-      result = size == b.length;
-      if (result) {
-        // Deep compare the contents, ignoring non-numeric properties.
-        while (size--) {
-          // Ensure commutative equality for sparse arrays.
-          if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
-        }
-      }
-    } else {
-      // Objects with different constructors are not equivalent.
-      if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
-      // Deep compare objects.
-      for (var key in a) {
-        if (_.has(a, key)) {
-          // Count the expected number of properties.
-          size++;
-          // Deep compare each member.
-          if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;
-        }
-      }
-      // Ensure that both objects contain the same number of properties.
-      if (result) {
-        for (key in b) {
-          if (_.has(b, key) && !(size--)) break;
-        }
-        result = !size;
-      }
-    }
-    // Remove the first object from the stack of traversed objects.
-    stack.pop();
-    return result;
-  }
-
-  // Perform a deep comparison to check if two objects are equal.
-  _.isEqual = function(a, b) {
-    return eq(a, b, []);
-  };
-
-  // Is a given array, string, or object empty?
-  // An "empty" object has no enumerable own-properties.
-  _.isEmpty = function(obj) {
-    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
-    for (var key in obj) if (_.has(obj, key)) return false;
-    return true;
-  };
-
-  // Is a given value a DOM element?
-  _.isElement = function(obj) {
-    return !!(obj && obj.nodeType == 1);
-  };
-
-  // Is a given value an array?
-  // Delegates to ECMA5's native Array.isArray
-  _.isArray = nativeIsArray || function(obj) {
-    return toString.call(obj) == '[object Array]';
-  };
-
-  // Is a given variable an object?
-  _.isObject = function(obj) {
-    return obj === Object(obj);
-  };
-
-  // Is a given variable an arguments object?
-  _.isArguments = function(obj) {
-    return toString.call(obj) == '[object Arguments]';
-  };
-  if (!_.isArguments(arguments)) {
-    _.isArguments = function(obj) {
-      return !!(obj && _.has(obj, 'callee'));
-    };
-  }
-
-  // Is a given value a function?
-  _.isFunction = function(obj) {
-    return toString.call(obj) == '[object Function]';
-  };
-
-  // Is a given value a string?
-  _.isString = function(obj) {
-    return toString.call(obj) == '[object String]';
-  };
-
-  // Is a given value a number?
-  _.isNumber = function(obj) {
-    return toString.call(obj) == '[object Number]';
-  };
-
-  // Is the given value `NaN`?
-  _.isNaN = function(obj) {
-    // `NaN` is the only value for which `===` is not reflexive.
-    return obj !== obj;
-  };
-
-  // Is a given value a boolean?
-  _.isBoolean = function(obj) {
-    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
-  };
-
-  // Is a given value a date?
-  _.isDate = function(obj) {
-    return toString.call(obj) == '[object Date]';
-  };
-
-  // Is the given value a regular expression?
-  _.isRegExp = function(obj) {
-    return toString.call(obj) == '[object RegExp]';
-  };
-
-  // Is a given value equal to null?
-  _.isNull = function(obj) {
-    return obj === null;
-  };
-
-  // Is a given variable undefined?
-  _.isUndefined = function(obj) {
-    return obj === void 0;
-  };
-
-  // Has own property?
-  _.has = function(obj, key) {
-    return hasOwnProperty.call(obj, key);
-  };
-
-  // Utility Functions
-  // -----------------
-
-  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
-  // previous owner. Returns a reference to the Underscore object.
-  _.noConflict = function() {
-    root._ = previousUnderscore;
-    return this;
-  };
-
-  // Keep the identity function around for default iterators.
-  _.identity = function(value) {
-    return value;
-  };
-
-  // Run a function **n** times.
-  _.times = function (n, iterator, context) {
-    for (var i = 0; i < n; i++) iterator.call(context, i);
-  };
-
-  // Escape a string for HTML interpolation.
-  _.escape = function(string) {
-    return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g,'&#x2F;');
-  };
-
-  // Add your own custom functions to the Underscore object, ensuring that
-  // they're correctly added to the OOP wrapper as well.
-  _.mixin = function(obj) {
-    each(_.functions(obj), function(name){
-      addToWrapper(name, _[name] = obj[name]);
-    });
-  };
-
-  // Generate a unique integer id (unique within the entire client session).
-  // Useful for temporary DOM ids.
-  var idCounter = 0;
-  _.uniqueId = function(prefix) {
-    var id = idCounter++;
-    return prefix ? prefix + id : id;
-  };
-
-  // By default, Underscore uses ERB-style template delimiters, change the
-  // following template settings to use alternative delimiters.
-  _.templateSettings = {
-    evaluate    : /<%([\s\S]+?)%>/g,
-    interpolate : /<%=([\s\S]+?)%>/g,
-    escape      : /<%-([\s\S]+?)%>/g
-  };
-
-  // When customizing `templateSettings`, if you don't want to define an
-  // interpolation, evaluation or escaping regex, we need one that is
-  // guaranteed not to match.
-  var noMatch = /.^/;
-
-  // Within an interpolation, evaluation, or escaping, remove HTML escaping
-  // that had been previously added.
-  var unescape = function(code) {
-    return code.replace(/\\\\/g, '\\').replace(/\\'/g, "'");
-  };
-
-  // JavaScript micro-templating, similar to John Resig's implementation.
-  // Underscore templating handles arbitrary delimiters, preserves whitespace,
-  // and correctly escapes quotes within interpolated code.
-  _.template = function(str, data) {
-    var c  = _.templateSettings;
-    var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
-      'with(obj||{}){__p.push(\'' +
-      str.replace(/\\/g, '\\\\')
-         .replace(/'/g, "\\'")
-         .replace(c.escape || noMatch, function(match, code) {
-           return "',_.escape(" + unescape(code) + "),'";
-         })
-         .replace(c.interpolate || noMatch, function(match, code) {
-           return "'," + unescape(code) + ",'";
-         })
-         .replace(c.evaluate || noMatch, function(match, code) {
-           return "');" + unescape(code).replace(/[\r\n\t]/g, ' ') + ";__p.push('";
-         })
-         .replace(/\r/g, '\\r')
-         .replace(/\n/g, '\\n')
-         .replace(/\t/g, '\\t')
-         + "');}return __p.join('');";
-    var func = new Function('obj', '_', tmpl);
-    if (data) return func(data, _);
-    return function(data) {
-      return func.call(this, data, _);
-    };
-  };
-
-  // Add a "chain" function, which will delegate to the wrapper.
-  _.chain = function(obj) {
-    return _(obj).chain();
-  };
-
-  // The OOP Wrapper
-  // ---------------
-
-  // If Underscore is called as a function, it returns a wrapped object that
-  // can be used OO-style. This wrapper holds altered versions of all the
-  // underscore functions. Wrapped objects may be chained.
-  var wrapper = function(obj) { this._wrapped = obj; };
-
-  // Expose `wrapper.prototype` as `_.prototype`
-  _.prototype = wrapper.prototype;
-
-  // Helper function to continue chaining intermediate results.
-  var result = function(obj, chain) {
-    return chain ? _(obj).chain() : obj;
-  };
-
-  // A method to easily add functions to the OOP wrapper.
-  var addToWrapper = function(name, func) {
-    wrapper.prototype[name] = function() {
-      var args = slice.call(arguments);
-      unshift.call(args, this._wrapped);
-      return result(func.apply(_, args), this._chain);
-    };
-  };
-
-  // Add all of the Underscore functions to the wrapper object.
-  _.mixin(_);
-
-  // Add all mutator Array functions to the wrapper.
-  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
-    var method = ArrayProto[name];
-    wrapper.prototype[name] = function() {
-      var wrapped = this._wrapped;
-      method.apply(wrapped, arguments);
-      var length = wrapped.length;
-      if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];
-      return result(wrapped, this._chain);
-    };
-  });
-
-  // Add all accessor Array functions to the wrapper.
-  each(['concat', 'join', 'slice'], function(name) {
-    var method = ArrayProto[name];
-    wrapper.prototype[name] = function() {
-      return result(method.apply(this._wrapped, arguments), this._chain);
-    };
-  });
-
-  // Start chaining a wrapped Underscore object.
-  wrapper.prototype.chain = function() {
-    this._chain = true;
-    return this;
-  };
-
-  // Extracts the result from a wrapped and chained object.
-  wrapper.prototype.value = function() {
-    return this._wrapped;
-  };
-
-}).call(this);
diff --git a/extension/Documentation/html/_static/underscore.js b/extension/Documentation/html/_static/underscore.js
deleted file mode 100644
index 5b55f32be..000000000
--- a/extension/Documentation/html/_static/underscore.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Underscore.js 1.3.1
-// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the MIT license.
-// Portions of Underscore are inspired or borrowed from Prototype,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore
-(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
-c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
-h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
-b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==
-null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
-function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
-e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
-function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});
-return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
-c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=
-b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);
-return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,
-d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
-var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
-c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
-a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};
-b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
-1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
-b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
-b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
-function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
-u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
-function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
-true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
diff --git a/extension/Documentation/html/_static/up-pressed.png b/extension/Documentation/html/_static/up-pressed.png
deleted file mode 100644
index acee3b68efbbfb9de3bfa73fce2531380f4bd820..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 214
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b3I)gLn;`PCGIF3$k*oP2u^Cy
z1QG|_1=PYnb1D4eKdS9<Rfpq9eZvoV4(FRqOC&yU<ykZBR|+eZ3^{Bs(0fczS?$)o
z1zBzqOjDB&rXLWUki_(ZOYf}S3_te-6HD<NwmmIcKX{MqZ}`C=pw3iiGvzP0)_49T
zVzHmSR(wuwn8DsJUb!G^UBj0HEK?h9OzUY$<G#e5WDq>z%1p*-hql&#Z9G*2bSQ(T
LtDnm{r-UW|Tp3Nf

diff --git a/extension/Documentation/html/_static/up.png b/extension/Documentation/html/_static/up.png
deleted file mode 100644
index 2a940a7da7c14e6a36901e83306849ba7efad4d4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CV9FzhEy=Fov?Lbi-SbV{M7eb
zSgRCN7I%METfw=?;;+>WH3cj0g7WUX+WNUO*ZcGT`ytIgVd8OSIh$j5tP~Z0O{ng4
zcW5}i$^L-SndMiXU*q89_#FKDQg!+}n<sY{bt~lf29~d`d|30$ek+#&XF;JwVZw1v
z_UR0p3#2)&`AF%iuMw0u8SEq};^+A5QF+L(`y7{#wyduS<qiY7j=|H_&t;ucLK6TJ
CK~C2I

diff --git a/extension/Documentation/html/_static/websupport.js b/extension/Documentation/html/_static/websupport.js
deleted file mode 100644
index 53f6a4525..000000000
--- a/extension/Documentation/html/_static/websupport.js
+++ /dev/null
@@ -1,808 +0,0 @@
-/*
- * websupport.js
- * ~~~~~~~~~~~~~
- *
- * sphinx.websupport utilities for all documentation.
- *
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-(function($) {
-  $.fn.autogrow = function() {
-    return this.each(function() {
-    var textarea = this;
-
-    $.fn.autogrow.resize(textarea);
-
-    $(textarea)
-      .focus(function() {
-        textarea.interval = setInterval(function() {
-          $.fn.autogrow.resize(textarea);
-        }, 500);
-      })
-      .blur(function() {
-        clearInterval(textarea.interval);
-      });
-    });
-  };
-
-  $.fn.autogrow.resize = function(textarea) {
-    var lineHeight = parseInt($(textarea).css('line-height'), 10);
-    var lines = textarea.value.split('\n');
-    var columns = textarea.cols;
-    var lineCount = 0;
-    $.each(lines, function() {
-      lineCount += Math.ceil(this.length / columns) || 1;
-    });
-    var height = lineHeight * (lineCount + 1);
-    $(textarea).css('height', height);
-  };
-})(jQuery);
-
-(function($) {
-  var comp, by;
-
-  function init() {
-    initEvents();
-    initComparator();
-  }
-
-  function initEvents() {
-    $(document).on("click", 'a.comment-close', function(event) {
-      event.preventDefault();
-      hide($(this).attr('id').substring(2));
-    });
-    $(document).on("click", 'a.vote', function(event) {
-      event.preventDefault();
-      handleVote($(this));
-    });
-    $(document).on("click", 'a.reply', function(event) {
-      event.preventDefault();
-      openReply($(this).attr('id').substring(2));
-    });
-    $(document).on("click", 'a.close-reply', function(event) {
-      event.preventDefault();
-      closeReply($(this).attr('id').substring(2));
-    });
-    $(document).on("click", 'a.sort-option', function(event) {
-      event.preventDefault();
-      handleReSort($(this));
-    });
-    $(document).on("click", 'a.show-proposal', function(event) {
-      event.preventDefault();
-      showProposal($(this).attr('id').substring(2));
-    });
-    $(document).on("click", 'a.hide-proposal', function(event) {
-      event.preventDefault();
-      hideProposal($(this).attr('id').substring(2));
-    });
-    $(document).on("click", 'a.show-propose-change', function(event) {
-      event.preventDefault();
-      showProposeChange($(this).attr('id').substring(2));
-    });
-    $(document).on("click", 'a.hide-propose-change', function(event) {
-      event.preventDefault();
-      hideProposeChange($(this).attr('id').substring(2));
-    });
-    $(document).on("click", 'a.accept-comment', function(event) {
-      event.preventDefault();
-      acceptComment($(this).attr('id').substring(2));
-    });
-    $(document).on("click", 'a.delete-comment', function(event) {
-      event.preventDefault();
-      deleteComment($(this).attr('id').substring(2));
-    });
-    $(document).on("click", 'a.comment-markup', function(event) {
-      event.preventDefault();
-      toggleCommentMarkupBox($(this).attr('id').substring(2));
-    });
-  }
-
-  /**
-   * Set comp, which is a comparator function used for sorting and
-   * inserting comments into the list.
-   */
-  function setComparator() {
-    // If the first three letters are "asc", sort in ascending order
-    // and remove the prefix.
-    if (by.substring(0,3) == 'asc') {
-      var i = by.substring(3);
-      comp = function(a, b) { return a[i] - b[i]; };
-    } else {
-      // Otherwise sort in descending order.
-      comp = function(a, b) { return b[by] - a[by]; };
-    }
-
-    // Reset link styles and format the selected sort option.
-    $('a.sel').attr('href', '#').removeClass('sel');
-    $('a.by' + by).removeAttr('href').addClass('sel');
-  }
-
-  /**
-   * Create a comp function. If the user has preferences stored in
-   * the sortBy cookie, use those, otherwise use the default.
-   */
-  function initComparator() {
-    by = 'rating'; // Default to sort by rating.
-    // If the sortBy cookie is set, use that instead.
-    if (document.cookie.length > 0) {
-      var start = document.cookie.indexOf('sortBy=');
-      if (start != -1) {
-        start = start + 7;
-        var end = document.cookie.indexOf(";", start);
-        if (end == -1) {
-          end = document.cookie.length;
-          by = unescape(document.cookie.substring(start, end));
-        }
-      }
-    }
-    setComparator();
-  }
-
-  /**
-   * Show a comment div.
-   */
-  function show(id) {
-    $('#ao' + id).hide();
-    $('#ah' + id).show();
-    var context = $.extend({id: id}, opts);
-    var popup = $(renderTemplate(popupTemplate, context)).hide();
-    popup.find('textarea[name="proposal"]').hide();
-    popup.find('a.by' + by).addClass('sel');
-    var form = popup.find('#cf' + id);
-    form.submit(function(event) {
-      event.preventDefault();
-      addComment(form);
-    });
-    $('#s' + id).after(popup);
-    popup.slideDown('fast', function() {
-      getComments(id);
-    });
-  }
-
-  /**
-   * Hide a comment div.
-   */
-  function hide(id) {
-    $('#ah' + id).hide();
-    $('#ao' + id).show();
-    var div = $('#sc' + id);
-    div.slideUp('fast', function() {
-      div.remove();
-    });
-  }
-
-  /**
-   * Perform an ajax request to get comments for a node
-   * and insert the comments into the comments tree.
-   */
-  function getComments(id) {
-    $.ajax({
-     type: 'GET',
-     url: opts.getCommentsURL,
-     data: {node: id},
-     success: function(data, textStatus, request) {
-       var ul = $('#cl' + id);
-       var speed = 100;
-       $('#cf' + id)
-         .find('textarea[name="proposal"]')
-         .data('source', data.source);
-
-       if (data.comments.length === 0) {
-         ul.html('<li>No comments yet.</li>');
-         ul.data('empty', true);
-       } else {
-         // If there are comments, sort them and put them in the list.
-         var comments = sortComments(data.comments);
-         speed = data.comments.length * 100;
-         appendComments(comments, ul);
-         ul.data('empty', false);
-       }
-       $('#cn' + id).slideUp(speed + 200);
-       ul.slideDown(speed);
-     },
-     error: function(request, textStatus, error) {
-       showError('Oops, there was a problem retrieving the comments.');
-     },
-     dataType: 'json'
-    });
-  }
-
-  /**
-   * Add a comment via ajax and insert the comment into the comment tree.
-   */
-  function addComment(form) {
-    var node_id = form.find('input[name="node"]').val();
-    var parent_id = form.find('input[name="parent"]').val();
-    var text = form.find('textarea[name="comment"]').val();
-    var proposal = form.find('textarea[name="proposal"]').val();
-
-    if (text == '') {
-      showError('Please enter a comment.');
-      return;
-    }
-
-    // Disable the form that is being submitted.
-    form.find('textarea,input').attr('disabled', 'disabled');
-
-    // Send the comment to the server.
-    $.ajax({
-      type: "POST",
-      url: opts.addCommentURL,
-      dataType: 'json',
-      data: {
-        node: node_id,
-        parent: parent_id,
-        text: text,
-        proposal: proposal
-      },
-      success: function(data, textStatus, error) {
-        // Reset the form.
-        if (node_id) {
-          hideProposeChange(node_id);
-        }
-        form.find('textarea')
-          .val('')
-          .add(form.find('input'))
-          .removeAttr('disabled');
-	var ul = $('#cl' + (node_id || parent_id));
-        if (ul.data('empty')) {
-          $(ul).empty();
-          ul.data('empty', false);
-        }
-        insertComment(data.comment);
-        var ao = $('#ao' + node_id);
-        ao.find('img').attr({'src': opts.commentBrightImage});
-        if (node_id) {
-          // if this was a "root" comment, remove the commenting box
-          // (the user can get it back by reopening the comment popup)
-          $('#ca' + node_id).slideUp();
-        }
-      },
-      error: function(request, textStatus, error) {
-        form.find('textarea,input').removeAttr('disabled');
-        showError('Oops, there was a problem adding the comment.');
-      }
-    });
-  }
-
-  /**
-   * Recursively append comments to the main comment list and children
-   * lists, creating the comment tree.
-   */
-  function appendComments(comments, ul) {
-    $.each(comments, function() {
-      var div = createCommentDiv(this);
-      ul.append($(document.createElement('li')).html(div));
-      appendComments(this.children, div.find('ul.comment-children'));
-      // To avoid stagnating data, don't store the comments children in data.
-      this.children = null;
-      div.data('comment', this);
-    });
-  }
-
-  /**
-   * After adding a new comment, it must be inserted in the correct
-   * location in the comment tree.
-   */
-  function insertComment(comment) {
-    var div = createCommentDiv(comment);
-
-    // To avoid stagnating data, don't store the comments children in data.
-    comment.children = null;
-    div.data('comment', comment);
-
-    var ul = $('#cl' + (comment.node || comment.parent));
-    var siblings = getChildren(ul);
-
-    var li = $(document.createElement('li'));
-    li.hide();
-
-    // Determine where in the parents children list to insert this comment.
-    for(i=0; i < siblings.length; i++) {
-      if (comp(comment, siblings[i]) <= 0) {
-        $('#cd' + siblings[i].id)
-          .parent()
-          .before(li.html(div));
-        li.slideDown('fast');
-        return;
-      }
-    }
-
-    // If we get here, this comment rates lower than all the others,
-    // or it is the only comment in the list.
-    ul.append(li.html(div));
-    li.slideDown('fast');
-  }
-
-  function acceptComment(id) {
-    $.ajax({
-      type: 'POST',
-      url: opts.acceptCommentURL,
-      data: {id: id},
-      success: function(data, textStatus, request) {
-        $('#cm' + id).fadeOut('fast');
-        $('#cd' + id).removeClass('moderate');
-      },
-      error: function(request, textStatus, error) {
-        showError('Oops, there was a problem accepting the comment.');
-      }
-    });
-  }
-
-  function deleteComment(id) {
-    $.ajax({
-      type: 'POST',
-      url: opts.deleteCommentURL,
-      data: {id: id},
-      success: function(data, textStatus, request) {
-        var div = $('#cd' + id);
-        if (data == 'delete') {
-          // Moderator mode: remove the comment and all children immediately
-          div.slideUp('fast', function() {
-            div.remove();
-          });
-          return;
-        }
-        // User mode: only mark the comment as deleted
-        div
-          .find('span.user-id:first')
-          .text('[deleted]').end()
-          .find('div.comment-text:first')
-          .text('[deleted]').end()
-          .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
-                ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
-          .remove();
-        var comment = div.data('comment');
-        comment.username = '[deleted]';
-        comment.text = '[deleted]';
-        div.data('comment', comment);
-      },
-      error: function(request, textStatus, error) {
-        showError('Oops, there was a problem deleting the comment.');
-      }
-    });
-  }
-
-  function showProposal(id) {
-    $('#sp' + id).hide();
-    $('#hp' + id).show();
-    $('#pr' + id).slideDown('fast');
-  }
-
-  function hideProposal(id) {
-    $('#hp' + id).hide();
-    $('#sp' + id).show();
-    $('#pr' + id).slideUp('fast');
-  }
-
-  function showProposeChange(id) {
-    $('#pc' + id).hide();
-    $('#hc' + id).show();
-    var textarea = $('#pt' + id);
-    textarea.val(textarea.data('source'));
-    $.fn.autogrow.resize(textarea[0]);
-    textarea.slideDown('fast');
-  }
-
-  function hideProposeChange(id) {
-    $('#hc' + id).hide();
-    $('#pc' + id).show();
-    var textarea = $('#pt' + id);
-    textarea.val('').removeAttr('disabled');
-    textarea.slideUp('fast');
-  }
-
-  function toggleCommentMarkupBox(id) {
-    $('#mb' + id).toggle();
-  }
-
-  /** Handle when the user clicks on a sort by link. */
-  function handleReSort(link) {
-    var classes = link.attr('class').split(/\s+/);
-    for (var i=0; i<classes.length; i++) {
-      if (classes[i] != 'sort-option') {
-	by = classes[i].substring(2);
-      }
-    }
-    setComparator();
-    // Save/update the sortBy cookie.
-    var expiration = new Date();
-    expiration.setDate(expiration.getDate() + 365);
-    document.cookie= 'sortBy=' + escape(by) +
-                     ';expires=' + expiration.toUTCString();
-    $('ul.comment-ul').each(function(index, ul) {
-      var comments = getChildren($(ul), true);
-      comments = sortComments(comments);
-      appendComments(comments, $(ul).empty());
-    });
-  }
-
-  /**
-   * Function to process a vote when a user clicks an arrow.
-   */
-  function handleVote(link) {
-    if (!opts.voting) {
-      showError("You'll need to login to vote.");
-      return;
-    }
-
-    var id = link.attr('id');
-    if (!id) {
-      // Didn't click on one of the voting arrows.
-      return;
-    }
-    // If it is an unvote, the new vote value is 0,
-    // Otherwise it's 1 for an upvote, or -1 for a downvote.
-    var value = 0;
-    if (id.charAt(1) != 'u') {
-      value = id.charAt(0) == 'u' ? 1 : -1;
-    }
-    // The data to be sent to the server.
-    var d = {
-      comment_id: id.substring(2),
-      value: value
-    };
-
-    // Swap the vote and unvote links.
-    link.hide();
-    $('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
-      .show();
-
-    // The div the comment is displayed in.
-    var div = $('div#cd' + d.comment_id);
-    var data = div.data('comment');
-
-    // If this is not an unvote, and the other vote arrow has
-    // already been pressed, unpress it.
-    if ((d.value !== 0) && (data.vote === d.value * -1)) {
-      $('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
-      $('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
-    }
-
-    // Update the comments rating in the local data.
-    data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
-    data.vote = d.value;
-    div.data('comment', data);
-
-    // Change the rating text.
-    div.find('.rating:first')
-      .text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
-
-    // Send the vote information to the server.
-    $.ajax({
-      type: "POST",
-      url: opts.processVoteURL,
-      data: d,
-      error: function(request, textStatus, error) {
-        showError('Oops, there was a problem casting that vote.');
-      }
-    });
-  }
-
-  /**
-   * Open a reply form used to reply to an existing comment.
-   */
-  function openReply(id) {
-    // Swap out the reply link for the hide link
-    $('#rl' + id).hide();
-    $('#cr' + id).show();
-
-    // Add the reply li to the children ul.
-    var div = $(renderTemplate(replyTemplate, {id: id})).hide();
-    $('#cl' + id)
-      .prepend(div)
-      // Setup the submit handler for the reply form.
-      .find('#rf' + id)
-      .submit(function(event) {
-        event.preventDefault();
-        addComment($('#rf' + id));
-        closeReply(id);
-      })
-      .find('input[type=button]')
-      .click(function() {
-        closeReply(id);
-      });
-    div.slideDown('fast', function() {
-      $('#rf' + id).find('textarea').focus();
-    });
-  }
-
-  /**
-   * Close the reply form opened with openReply.
-   */
-  function closeReply(id) {
-    // Remove the reply div from the DOM.
-    $('#rd' + id).slideUp('fast', function() {
-      $(this).remove();
-    });
-
-    // Swap out the hide link for the reply link
-    $('#cr' + id).hide();
-    $('#rl' + id).show();
-  }
-
-  /**
-   * Recursively sort a tree of comments using the comp comparator.
-   */
-  function sortComments(comments) {
-    comments.sort(comp);
-    $.each(comments, function() {
-      this.children = sortComments(this.children);
-    });
-    return comments;
-  }
-
-  /**
-   * Get the children comments from a ul. If recursive is true,
-   * recursively include childrens' children.
-   */
-  function getChildren(ul, recursive) {
-    var children = [];
-    ul.children().children("[id^='cd']")
-      .each(function() {
-        var comment = $(this).data('comment');
-        if (recursive)
-          comment.children = getChildren($(this).find('#cl' + comment.id), true);
-        children.push(comment);
-      });
-    return children;
-  }
-
-  /** Create a div to display a comment in. */
-  function createCommentDiv(comment) {
-    if (!comment.displayed && !opts.moderator) {
-      return $('<div class="moderate">Thank you!  Your comment will show up '
-               + 'once it is has been approved by a moderator.</div>');
-    }
-    // Prettify the comment rating.
-    comment.pretty_rating = comment.rating + ' point' +
-      (comment.rating == 1 ? '' : 's');
-    // Make a class (for displaying not yet moderated comments differently)
-    comment.css_class = comment.displayed ? '' : ' moderate';
-    // Create a div for this comment.
-    var context = $.extend({}, opts, comment);
-    var div = $(renderTemplate(commentTemplate, context));
-
-    // If the user has voted on this comment, highlight the correct arrow.
-    if (comment.vote) {
-      var direction = (comment.vote == 1) ? 'u' : 'd';
-      div.find('#' + direction + 'v' + comment.id).hide();
-      div.find('#' + direction + 'u' + comment.id).show();
-    }
-
-    if (opts.moderator || comment.text != '[deleted]') {
-      div.find('a.reply').show();
-      if (comment.proposal_diff)
-        div.find('#sp' + comment.id).show();
-      if (opts.moderator && !comment.displayed)
-        div.find('#cm' + comment.id).show();
-      if (opts.moderator || (opts.username == comment.username))
-        div.find('#dc' + comment.id).show();
-    }
-    return div;
-  }
-
-  /**
-   * A simple template renderer. Placeholders such as <%id%> are replaced
-   * by context['id'] with items being escaped. Placeholders such as <#id#>
-   * are not escaped.
-   */
-  function renderTemplate(template, context) {
-    var esc = $(document.createElement('div'));
-
-    function handle(ph, escape) {
-      var cur = context;
-      $.each(ph.split('.'), function() {
-        cur = cur[this];
-      });
-      return escape ? esc.text(cur || "").html() : cur;
-    }
-
-    return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
-      return handle(arguments[2], arguments[1] == '%' ? true : false);
-    });
-  }
-
-  /** Flash an error message briefly. */
-  function showError(message) {
-    $(document.createElement('div')).attr({'class': 'popup-error'})
-      .append($(document.createElement('div'))
-               .attr({'class': 'error-message'}).text(message))
-      .appendTo('body')
-      .fadeIn("slow")
-      .delay(2000)
-      .fadeOut("slow");
-  }
-
-  /** Add a link the user uses to open the comments popup. */
-  $.fn.comment = function() {
-    return this.each(function() {
-      var id = $(this).attr('id').substring(1);
-      var count = COMMENT_METADATA[id];
-      var title = count + ' comment' + (count == 1 ? '' : 's');
-      var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
-      var addcls = count == 0 ? ' nocomment' : '';
-      $(this)
-        .append(
-          $(document.createElement('a')).attr({
-            href: '#',
-            'class': 'sphinx-comment-open' + addcls,
-            id: 'ao' + id
-          })
-            .append($(document.createElement('img')).attr({
-              src: image,
-              alt: 'comment',
-              title: title
-            }))
-            .click(function(event) {
-              event.preventDefault();
-              show($(this).attr('id').substring(2));
-            })
-        )
-        .append(
-          $(document.createElement('a')).attr({
-            href: '#',
-            'class': 'sphinx-comment-close hidden',
-            id: 'ah' + id
-          })
-            .append($(document.createElement('img')).attr({
-              src: opts.closeCommentImage,
-              alt: 'close',
-              title: 'close'
-            }))
-            .click(function(event) {
-              event.preventDefault();
-              hide($(this).attr('id').substring(2));
-            })
-        );
-    });
-  };
-
-  var opts = {
-    processVoteURL: '/_process_vote',
-    addCommentURL: '/_add_comment',
-    getCommentsURL: '/_get_comments',
-    acceptCommentURL: '/_accept_comment',
-    deleteCommentURL: '/_delete_comment',
-    commentImage: '/static/_static/comment.png',
-    closeCommentImage: '/static/_static/comment-close.png',
-    loadingImage: '/static/_static/ajax-loader.gif',
-    commentBrightImage: '/static/_static/comment-bright.png',
-    upArrow: '/static/_static/up.png',
-    downArrow: '/static/_static/down.png',
-    upArrowPressed: '/static/_static/up-pressed.png',
-    downArrowPressed: '/static/_static/down-pressed.png',
-    voting: false,
-    moderator: false
-  };
-
-  if (typeof COMMENT_OPTIONS != "undefined") {
-    opts = jQuery.extend(opts, COMMENT_OPTIONS);
-  }
-
-  var popupTemplate = '\
-    <div class="sphinx-comments" id="sc<%id%>">\
-      <p class="sort-options">\
-        Sort by:\
-        <a href="#" class="sort-option byrating">best rated</a>\
-        <a href="#" class="sort-option byascage">newest</a>\
-        <a href="#" class="sort-option byage">oldest</a>\
-      </p>\
-      <div class="comment-header">Comments</div>\
-      <div class="comment-loading" id="cn<%id%>">\
-        loading comments... <img src="<%loadingImage%>" alt="" /></div>\
-      <ul id="cl<%id%>" class="comment-ul"></ul>\
-      <div id="ca<%id%>">\
-      <p class="add-a-comment">Add a comment\
-        (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
-      <div class="comment-markup-box" id="mb<%id%>">\
-        reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
-        <code>``code``</code>, \
-        code blocks: <code>::</code> and an indented block after blank line</div>\
-      <form method="post" id="cf<%id%>" class="comment-form" action="">\
-        <textarea name="comment" cols="80"></textarea>\
-        <p class="propose-button">\
-          <a href="#" id="pc<%id%>" class="show-propose-change">\
-            Propose a change &#9657;\
-          </a>\
-          <a href="#" id="hc<%id%>" class="hide-propose-change">\
-            Propose a change &#9663;\
-          </a>\
-        </p>\
-        <textarea name="proposal" id="pt<%id%>" cols="80"\
-                  spellcheck="false"></textarea>\
-        <input type="submit" value="Add comment" />\
-        <input type="hidden" name="node" value="<%id%>" />\
-        <input type="hidden" name="parent" value="" />\
-      </form>\
-      </div>\
-    </div>';
-
-  var commentTemplate = '\
-    <div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
-      <div class="vote">\
-        <div class="arrow">\
-          <a href="#" id="uv<%id%>" class="vote" title="vote up">\
-            <img src="<%upArrow%>" />\
-          </a>\
-          <a href="#" id="uu<%id%>" class="un vote" title="vote up">\
-            <img src="<%upArrowPressed%>" />\
-          </a>\
-        </div>\
-        <div class="arrow">\
-          <a href="#" id="dv<%id%>" class="vote" title="vote down">\
-            <img src="<%downArrow%>" id="da<%id%>" />\
-          </a>\
-          <a href="#" id="du<%id%>" class="un vote" title="vote down">\
-            <img src="<%downArrowPressed%>" />\
-          </a>\
-        </div>\
-      </div>\
-      <div class="comment-content">\
-        <p class="tagline comment">\
-          <span class="user-id"><%username%></span>\
-          <span class="rating"><%pretty_rating%></span>\
-          <span class="delta"><%time.delta%></span>\
-        </p>\
-        <div class="comment-text comment"><#text#></div>\
-        <p class="comment-opts comment">\
-          <a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
-          <a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
-          <a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
-          <a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
-          <a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
-          <span id="cm<%id%>" class="moderation hidden">\
-            <a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
-          </span>\
-        </p>\
-        <pre class="proposal" id="pr<%id%>">\
-<#proposal_diff#>\
-        </pre>\
-          <ul class="comment-children" id="cl<%id%>"></ul>\
-        </div>\
-        <div class="clearleft"></div>\
-      </div>\
-    </div>';
-
-  var replyTemplate = '\
-    <li>\
-      <div class="reply-div" id="rd<%id%>">\
-        <form id="rf<%id%>">\
-          <textarea name="comment" cols="80"></textarea>\
-          <input type="submit" value="Add reply" />\
-          <input type="button" value="Cancel" />\
-          <input type="hidden" name="parent" value="<%id%>" />\
-          <input type="hidden" name="node" value="" />\
-        </form>\
-      </div>\
-    </li>';
-
-  $(document).ready(function() {
-    init();
-  });
-})(jQuery);
-
-$(document).ready(function() {
-  // add comment anchors for all paragraphs that are commentable
-  $('.sphinx-has-comment').comment();
-
-  // highlight search words in search results
-  $("div.context").each(function() {
-    var params = $.getQueryParameters();
-    var terms = (params.q) ? params.q[0].split(/\s+/) : [];
-    var result = $(this);
-    $.each(terms, function() {
-      result.highlightText(this.toLowerCase(), 'highlighted');
-    });
-  });
-
-  // directly open comment window if requested
-  var anchor = document.location.hash;
-  if (anchor.substring(0, 9) == '#comment-') {
-    $('#ao' + anchor.substring(9)).click();
-    document.location.hash = '#s' + anchor.substring(9);
-  }
-});
diff --git a/extension/Documentation/html/genindex.html b/extension/Documentation/html/genindex.html
deleted file mode 100644
index 577174a01..000000000
--- a/extension/Documentation/html/genindex.html
+++ /dev/null
@@ -1,91 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Index &#8212; QFQ Extension 0.25.0 documentation</title>
-    
-    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    './',
-        VERSION:     '0.25.0',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true,
-        SOURCELINK_SUFFIX: '.txt'
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="index" title="Index" href="#" />
-    <link rel="search" title="Search" href="search.html" /> 
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="#" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-
-<h1 id="index">Index</h1>
-
-<div class="genindex-jumpbox">
- 
-</div>
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-
-   
-
-<div id="searchbox" style="display: none" role="search">
-  <h3>Quick search</h3>
-    <form class="search" action="search.html" method="get">
-      <div><input type="text" name="q" /></div>
-      <div><input type="submit" value="Go" /></div>
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="#" title="General Index"
-             >index</a></li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &#169; Copyright 2017, Carsten Rose.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.5.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/extension/Documentation/html/objects.inv b/extension/Documentation/html/objects.inv
deleted file mode 100644
index 8b9ae6872fc06eb975c46ee6f562cd59b6073a85..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1825
zcmV++2j2K2AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkWMo}O|
zcywiMb7^mG3L_v^WpZ<AZ*DpuFfKAR3L_v?Xk{RBWo=<;Ze(S0Aa7<MbZBXFAZBT7
zWguyDAY*TBaB^jHb7f>8b#rNMXCQiPX<{x4c-oDa%WmT~6o&VF3Sv4ak_D$IW|v(q
za_Yjl*-oZe3A9ApY-mv-sW=|=;d{tK$@U<jv<YJA`+thJa}GJKO7TvuE6++@Q1&Ms
z`v>3FZlmbK=z(VMPE=OvicDnnVh_pi07*t}c-3%q_!^(!`)g4N!xg!!l&r*56peJU
zTFtdSl6>$Q_4tCq8-uT?e@CX-`PEH!=zvd9G=ILo`%bTP(QHKJxPwm6nd8O@L%-ZN
z3ndHa?NWasQ=tU6;>ZXewcX=IA*^MER?VhjZ(KD3$3pRiP``Bdx3Ba(@DzE9JSh|h
z4_<^XNr*2!cLp9FjH*II7hnv`0O4iJMr{Rse-i_Qw*e%vmoVfnNm0PgXzoGM4ULg}
zq0*ys*$zu&LA>#E#B9wA!HP9EFiJgrjS|YMlK!Ftzp4<mOX~yT(WP9m*X1jdl}ss+
z{08JVAVFB~*ixHKx|MoIM*xwcu}*J>4NpK1hNoOKR+!qzH>t!bExx*-kF#t__cSTR
zqFE(19so=UCzuh1Hf0+3px=!El2UIgrFmKrnGR+(Ow|Tl3|q>c;ka+nFx4l}xS#k_
zYIS1@-@RSMH?m+&U2>OP=2uA4$3PPC&NsCZdDtbn6Yv8b=PRR|`g5D8Vz{?j6+_h+
z7Kx?v_>f-vhtQ5+X|R_!{9TD^<<_Z>%vzel;-a(c@^LzzKj+ukJij^rC!b`u*Ym%?
z(;2>KoYR$r7?v^&=tV$%xI2_8UAzpGP5?cW*3kQH&q6tn-$$G*#lhTj=Zpluo?yDC
zO0k5%R#I6}w-&T>qDv_hnEStMVS^Dyq@**8iefE_7q_d$5Li@&E(ei==DUR}?FO0l
zjCqT}0xZN@t1=x%TiobvAY@fHZs@02`EwBG_(FDdMjs1_-N||g8q#VC9A#(p$wMGe
zDpw`1a|o>_A@U&eAVY8jzv*m#H_hne>inLbjAoNl;=?`@r356|K44j(Pyv6oJUx9Q
zM9%1pL(2XGGPAY<)r#+Q<NDg8lYpUQ17$!ulEZeAq0B%Y7B*Wcy@;h;svXZ#WKj&U
zwQn^9tbcKNY`?XKq=u*wW+PoCwti|-Is|XUmi`|9_tS(XM!YuCh;q;eOe1`dq`>vR
zy_;R@Ee6b#ji)e9qRRQaKX5#qbgGA2Vfmec+6o=e54LLi6wBdoL?9tjVB}or<kp@;
zU_GNP8HN432W7}bkq(KG@y6*T)b+{O-a%1ocqw&%djX3Q3$;e!`ZdT!k%O$)FY#0>
zfCqdn(iN0f(Q{8lRa5sBUDyzEAhM1t#rw`4;{%TT%ip*yjI3R4G_1&Esrz>a(?}B^
zM^h3XQ3I3@7=sX$_uRbu?__>{N>q0`?Zo@@sc*{vAW-jc#mb{2Ve0!letd%T7B6rB
z9Z)7ukc@RQ#PV<sfUx<&27{wS`vUjajV>G5*0|L+4WvYf|JADDE75!CxbZmT0mQLc
z9Zt}uJ3zbk=-qjIcK8OvPmbRZIVF5_*%N7j8JDDnD2c^ecSZ~uBVGD;qV6<AgUH+Y
z0Npo(_j`=I!Wq1ee~1jh>CNM8e=b3espGkhKf$Gh>`=HIwp0$uSmjQqypU!<`_!$V
z7=q|+4sItp-QoR2$V1^Lu&`iE$m8j><*|^$K~ihu(zGXt<-Sz-8Babb!7P$Aki-gZ
zieGAAe1>a%hVSoTu>xB(?Kt?8Azr*B8w(1G61vwAI0d{3mR_D++J+$RaagGKRSmnv
zm_1Am&gdY6)sk2#-q!=HMf3D5MIPr8ME>ULnBHI2`IUQgS=UqL!pD06v4On}jtBkq
zzw?DyCL6*AA{8vo=tVa2<us!g(WFok!fT&Nq@u~?WSrg3!Q?WUq=O<_1ST55H{5`H
z6y@nuh4R2ec{mI(I*IbWY=8!liWbxC@@{$sCevtQW$!0=B+6%F{{gdByR%O84nU+@
zhv(Tm^MmjlO(47K?|mK!MGL%RJ-N{3&Q~<2U^b6tuvBcHS74&m)A@7;@+V@OMU1Lg
z?hUBFS_QE?$kXpkFIj(Bn+2BYB}JCRl8Tpayec5&r1vM%tfg_EK7L@)`daDljfS}*
zd*pc_CtU^=w&3Yoi!2ai&>p|yaPWXMV)r;N%f${tQA+mIc>_%sJ0BUzRxGSAZ%}d=
zqfIh0ex*NJm<Ag1=Zb7!LUKr`kZ`&#mt<>rU5C0%Z!P0h$p&2i{D>mzMd5ZaieP_>
PH&DEYohAPRKFYwVsm6Bb

diff --git a/extension/Documentation/html/search.html b/extension/Documentation/html/search.html
deleted file mode 100644
index 660a4c1dd..000000000
--- a/extension/Documentation/html/search.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Search &#8212; QFQ Extension 0.25.0 documentation</title>
-    
-    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    './',
-        VERSION:     '0.25.0',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true,
-        SOURCELINK_SUFFIX: '.txt'
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/underscore.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="_static/searchtools.js"></script>
-    <link rel="index" title="Index" href="genindex.html" />
-    <link rel="search" title="Search" href="#" />
-  <script type="text/javascript">
-    jQuery(function() { Search.loadIndex("searchindex.js"); });
-  </script>
-  
-  <script type="text/javascript" id="searchindexloader"></script>
-   
-
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>  
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-  <h1 id="search-documentation">Search</h1>
-  <div id="fallback" class="admonition warning">
-  <script type="text/javascript">$('#fallback').hide();</script>
-  <p>
-    Please activate JavaScript to enable the search
-    functionality.
-  </p>
-  </div>
-  <p>
-    From here you can search these documents. Enter your search
-    words into the box below and click "search". Note that the search
-    function will automatically search for all of the words. Pages
-    containing fewer words won't appear in the result list.
-  </p>
-  <form action="" method="get">
-    <input type="text" name="q" value="" />
-    <input type="submit" value="search" />
-    <span id="search-progress" style="padding-left: 10px"></span>
-  </form>
-  
-  <div id="search-results">
-  
-  </div>
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             >index</a></li>
-        <li class="nav-item nav-item-0"><a href="Index.html">QFQ Extension 0.25.0 documentation</a> &#187;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &#169; Copyright 2017, Carsten Rose.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.5.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/extension/Documentation/html/searchindex.js b/extension/Documentation/html/searchindex.js
deleted file mode 100644
index 4e2c643e2..000000000
--- a/extension/Documentation/html/searchindex.js
+++ /dev/null
@@ -1 +0,0 @@
-Search.setIndex({docnames:["Index","Links","Manual","OnlineRecuitingTool","README","Release"],envversion:50,filenames:["Index.rst","Links.rst","Manual.rst","OnlineRecuitingTool.rst","README.rst","Release.rst"],objects:{},objnames:{},objtypes:{},terms:{"1024px":2,"10mb":[2,5],"1em":2,"3em":2,"640px":2,"7em":2,"\u00e0\u00e8\u00ec\u00f2\u00f9\u00e0\u00e8\u00ec\u00f2\u00f9\u00e1\u00e9\u00ed\u00f3\u00fa\u00fd\u00e1\u00e9\u00ed\u00f3\u00fa\u00fd\u00e2\u00ea\u00ee\u00f4\u00fb\u00e2\u00ea\u00ee\u00f4\u00fb\u00e3\u00f1\u00f5\u00e3\u00f1\u00f5\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u00e7":2,"\u00e4ndert":5,"angew\u00e4hlt":5,"break":[2,5],"byte":2,"case":[2,5],"catch":[2,5],"char":[2,5],"class":[0,5],"default":[0,5],"enum":[2,5],"export":[0,5],"final":[2,5],"float":2,"function":[0,5],"gen\u00fcgen":5,"import":2,"int":2,"long":[2,5],"new":[0,5],"null":[2,5],"public":[0,2],"return":[2,5],"static":[2,5],"switch":[2,5],"throw":5,"true":2,"try":[2,5],"var":[0,5],"verf\u00fcgbar":5,"while":[2,5],"z\u00fcrich":2,AND:[2,5],Added:5,CMS:0,Das:5,FEs:5,FLS:2,For:2,INTO:2,IPs:2,Mrs:2,NOT:[2,5],Not:2,One:2,Such:2,The:[0,2,3,5],There:2,These:2,Use:[2,5],Used:2,Using:2,WILL:2,Will:2,With:2,Yes:2,_blank:2,_bullet:2,_check:2,_db:2,_download:2,_exec:0,_file:0,_filenam:5,_form:5,_get:5,_htmlentiti:[2,5],_id:2,_img:0,_link:[0,5],_mailto:0,_name:2,_nl2br:2,_only_:2,_page:[0,5],_pagec:2,_pageh:2,_pagei:2,_pagen:2,_pagex:2,_parent:2,_password:2,_pdf:[0,5],_periodid:2,_pid:2,_rowclass:2,_rowtooltip:2,_self:2,_sendmail:0,_server:0,_sip:2,_striptag:[2,5],_t3:2,_tabl:5,_user:2,_vertic:0,_zip:0,abl:5,abort:2,about:[2,5],abov:2,absolut:2,abstractbuildform:5,acc:2,accent:5,accept:2,access:[0,5],accid:2,account:2,achiev:2,acquir:2,acquirelock:5,across:0,act:2,action:[0,5],activ:[2,5],actual:2,add:[0,5],added:[2,5],adding:2,addit:[0,5],additin:5,addition:2,additon:2,address:2,addressbook:2,addtion:5,adjust:2,admin:2,administr:5,administrative_address:2,administrative_contact:2,administrative_nam:2,adminnot:5,adr:2,advanc:[0,5],advisori:0,affect:2,affected_row:2,after:[0,5],after_delet:5,afterdelet:[2,5],afterinsert:[2,5],afterload:[2,5],aftersav:[2,5],afterupd:[2,5],again:[2,5],against:[2,5],agent:2,ahead:0,ajax:[2,5],aktzeptiert:5,alert:[2,5],alia:2,align:[2,5],all:[2,5],allbut:[2,5],alldep:5,allow:[2,5],allwai:2,alnum:2,alnumx:[2,5],alon:2,along:2,alongsid:2,alpha:2,alphanum:2,alreadi:[2,5],als:5,also:[2,5],alt:2,alter:[2,5],altern:2,althead:2,alttext:2,alwai:[2,5],analog:2,angezeigt:5,angl:2,ani:[0,2,5],anker:5,anonym:2,anoth:2,anoymor:5,anred:2,anschliessend:5,answer:2,anti:2,anumx:2,anymor:5,anyon:2,anywher:2,apach:2,apache2:2,api:[2,5],appb1:2,appb2:2,appc1:2,appc2:2,appc3:2,appear:2,append:2,appli:[2,5],applic:[2,3,5],approach:2,appropri:2,apt:2,arbitrari:2,archiv:2,area:0,argument:5,aria:2,aris:2,armstrong:2,around:2,arrai:[2,5],artifactori:5,ascii:2,ask:2,assgin:2,assign:[2,5],assum:2,asterik:[2,5],asterisk:2,atern:2,attach:2,attack:[2,5],attackdetectedexitnow:5,attent:2,attribut:[0,5],attributenam:2,audio:2,auf:5,auswahl:5,author:0,auto:[2,5],autocomplet:2,autocron:5,autofocu:5,automat:[0,5],automatisch:5,autosubmit:2,avail:[0,2],avatar:2,awar:2,back:[2,5],backcolor:2,backend:2,background:[2,5],backgroundcolor:2,backport:5,backup:2,bad:[2,5],badcaffee1234:2,bar:2,barchart:2,base:[0,2],base_url_print:[2,5],baselin:2,basic:0,basket:2,basketid:2,batch:2,batchfil:2,bcc:2,bearbeiten:5,becaus:2,becom:[2,5],been:[2,5],befor:[0,5],beforedelet:[2,5],beforeinsert:[2,5],beforeload:[2,5],beforesav:[2,5],beforeupd:[2,5],begin:2,behav:2,behaviour:[2,5],behind:2,bei:5,beim:5,being:5,bekommen:5,belong:2,below:[2,5],bern:2,besid:2,best:[0,3,5],better:5,between:[2,5],beuserloggedin:2,billi:2,billieelvislouisdiana:2,billieholidayelvispresleylouisarmstrongdianaross:2,bin:[2,5],binari:2,bitt:2,blue:[2,5],blvd:2,bob:5,bodi:[2,5],bodytext:0,bold:2,bookeep:2,bootstrap:[2,5],border:[2,5],bot:[2,5],both:[2,5],bottom:2,bower:5,box:[2,5],brace:2,broken:[2,5],brower:2,brows:2,browser:[2,5],brutton:2,bscolumn:2,bsinputcolumn:[2,5],bslabelcolumn:[2,5],bsnotecolumn:[2,5],btn:[2,5],bug:[0,1],build:[2,5],buildformbootstrap:5,built:2,bullet:2,bullist:2,bunch:2,button:[2,5],buttonclass:2,buttononchangeclass:[2,5],cach:2,call:[0,5],camera:[2,5],can:[0,2,5],cancel:2,cannot:2,canva:2,captur:[2,5],car:2,care:[2,5],careful:2,carpricerang:2,carsten:[0,4],categor:2,categori:2,caus:[2,5],cell:2,center:5,central:[0,5],ceo:2,challeng:0,challenge_1:2,challenge_2:2,chang:[0,2],chapter:5,charact:[0,5],charactercountwrap:[2,5],charset:5,chart:0,chartj:2,check:[2,5],checkbox:[0,5],checkboxen:5,checkboxmod:2,checkpattern:[2,5],checktyp:[2,5],child:[2,5],choos:2,chooseabl:2,choosen:2,chrome:[2,5],chromedriv:5,chronolog:2,circumv:2,citi:0,classbodi:[0,5],classic:2,classif:0,classpil:[0,5],clean:[2,5],cleanup:5,clear:2,clearclipboard:2,click:[0,2,5],clickabl:2,client:[0,5],client_cookie_qfq:5,client_typo3var:5,clientj:2,clipboard:[2,5],clockwis:2,close:[0,5],close_button_class:2,close_button_glyph_icon:2,close_button_text:2,close_button_tooltip:2,closebuttonclass:2,closebuttonglyphicon:2,closebuttontext:[2,5],closebuttontooltip:2,code:[2,5],codeplac:5,col:[2,5],collat:5,colon:2,color:[2,5],coloum:2,colum:[2,5],colummnnam:2,column:[0,5],columnam:2,columnanm:2,columnnam:[2,5],com:[1,2,4],combin:[0,5],come:2,comma:2,command:[2,5],commandlin:[2,5],comment:[0,5],commonli:2,commun:2,compani:2,companynam:2,compar:[2,5],compat:2,complet:[2,5],compon:2,compos:2,comput:[0,5],concat:2,concaten:[2,5],concept:[0,5],condens:2,confer:2,config:[0,5],configur:[0,5],confirm:2,conflict:[2,5],confus:2,connect:2,connector:2,consist:2,consol:[2,5],constant:[2,5],contact:[1,2],contain:[0,5],containerid:2,content:[0,5],contextu:2,contin:2,continu:2,contribut:2,control:[2,5],convers:0,convert:[2,5],cooki:[2,5],cookie_httponli:5,cookieqfq:2,copi:[0,5],copybasket:2,copyform:[2,5],copyright:0,corner:2,correct:[2,5],correctli:5,correl:2,correspond:[2,5],correspondig:2,could:2,count:[2,5],counter:[2,5],cover:2,cpu:2,creat:[0,2,5],creation:2,credenti:[2,5],crendenti:2,css:[0,5],css_class_qfq_contain:[2,5],css_class_qfq_form:2,css_class_qfq_form_bodi:[2,5],css_class_qfq_form_pil:[2,5],css_link_class_ext:2,css_link_class_extern:2,css_link_class_intern:2,css_unit:2,ctx:2,curdat:2,curli:2,current:[2,5],current_timestamp:5,custom:[0,5],customer1:2,customer2:2,customer3:2,customiz:2,danger:2,dark:2,das:5,data:[2,5],databas:[0,5],databaseupd:5,dataset:2,datasourc:[2,5],date:[0,5],date_format:2,dateformat:2,datejqw:[2,5],datetim:[0,5],datetimejqw:[2,5],datum:5,datumsformat:5,db_1_host:5,db_1_name:[2,5],db_1_password:[2,5],db_1_server:2,db_1_user:[2,5],db_1_xxx:2,db_2_user:2,db_:2,db_host:5,db_index_data:[2,5],db_index_qfq:[2,5],db_init:2,db_name:[2,5],db_name_test:5,db_password:5,db_server:2,db_updat:[2,5],db_user:[2,5],dbhost:2,dbhostapp:2,dbhostappc3:2,dbhostappc:2,dbhostb1:2,dbhostb2:2,dbhostc3:2,dbhostc:2,dbhostdata:2,dbindex:2,dbindexdata:2,dbname:2,dbnameapp:2,dbnameb1:2,dbnameb2:2,dbnamec1:2,dbnamec2:2,dbnamec3:2,dbnamedata:2,dbnamesingl:2,dbnamesysc1:2,dbnamesysc2:2,dbnamesysc3:2,dbuser:2,deactiv:2,deaktivieren:5,dear:2,debug:0,debugshowbodytext:2,decid:2,decod:[2,5],decryptcurlybrac:5,defaultescapetyp:2,defin:[0,5],definiert:5,definit:[0,5],definiton:2,defint:5,degre:2,delai:[2,5],delet:[0,5],delete_button_class:2,delete_button_glyph_icon:2,delete_button_text:2,delete_button_tooltip:2,deletebuttonclass:2,deletebuttonglyphicon:2,deletebuttontext:2,deletebuttontooltip:2,delimit:2,deliv:2,dem:5,demand:2,den:5,deni:2,depart:2,depend:[2,5],depnam:2,der:5,deriv:2,des:5,desc:2,describ:[2,5],descript:[0,2,5],design:5,desir:2,destin:2,destroi:2,det1:2,det2:2,detail2:2,detail:[0,5],detailform:2,detect:[2,5],detectect:5,determin:2,dev:2,develop:2,devic:2,diagram:5,dialog:2,diana:2,dict:2,die:5,differ:0,difficult:2,digit:[2,5],direct:[0,5],directli:[2,5],directoi:2,directori:2,direkt:5,dirti:5,dirty_record_timeout_second:2,disabl:[2,5],disadvantag:2,disappear:2,displai:[2,5],displaynam:2,dissapear:2,distanc:2,distinct:2,distinguish:2,distribut:2,div:[2,5],divid:2,doc:[2,4,5],document:[0,5],documentation_qfq:2,documentroot:2,docutment:5,docx:2,doe:[2,5],doejan:2,doing:2,domain:2,don:2,done:[2,5],dont:2,doubl:[2,5],down:[2,5],download:[0,5],draft:[2,4],driver:2,drop:[2,5],due:[2,5],duplic:[2,5],durch:5,dure:[2,5],dyn:5,dynam:[0,5],dynamicupd:[2,5],each:2,eanred:2,earli:5,earlier:2,easi:[2,5],easili:2,edg:2,edit:[0,5],edit_form_pag:[2,5],editform:5,editor:[0,5],edu:2,effect:[0,5],effici:2,ein:5,eingab:[2,5],einstellbar:5,either:2,elem:2,element:[0,5],els:[2,5],elt:2,elvi:2,email:[0,2,5],emailaddress:2,employe:2,empti:[0,5],emptyhid:2,emptyitematend:2,emptyitematstart:2,emptymeansnul:[2,5],enabl:[2,5],enclos:5,encod:[2,5],encrypt:2,end:[2,5],engin:2,english:[2,5],enlarg:5,enter:5,entiti:2,entrada:2,entri:[2,5],envelop:2,environ:2,epect:2,equal:2,equiv:2,erfassen:2,error:[0,5],error_log:2,errorhandl:5,errormessag:[2,5],erstellt:5,ersten:5,erzeugt:5,escap:[0,5],escape_type_default:2,escapetypedefault:5,especi:2,etc:2,evalu:[2,5],even:[2,5],event:5,eventemitt:2,everi:[2,5],exact:2,exactli:2,exam:2,examin:2,exampl:[0,5],exce:2,except:[0,5],exceptionmaxlength:2,excess:2,exclam:2,exclud:5,exclus:0,execut:2,exist:[2,5],exit:2,exp_address:2,exp_person:2,expand:[2,5],expans:5,expect:[2,5],expectrecord:2,expens:2,expir:[2,5],explain:2,explan:[2,5],explicit:2,explodetemplategroupel:5,exportfilenam:2,expresss:2,ext:2,ext_dir:2,ext_localconf:2,ext_path:2,extend:[2,5],extens:[1,2,5],extensionmanag:2,extern:2,extra:[0,5],extra_button_info_class:2,extra_button_info_posit:[2,5],extrabuttoninfo:5,extrabuttoninfoclass:2,extrabuttonlock:5,extrabuttonpassword:5,extrabuttopninfo:5,extradeleteform:[0,5],eye:[2,5],f12:2,f_class_bodi:5,f_class_pil:5,fail:[2,3,5],fake:[2,5],fall:2,fallback:2,fals:[2,5],faq:[0,5],fast:2,favor:2,fbeg:2,fe_group:[2,5],fe_nam:5,fe_paramet:5,fe_slave_id:5,fe_sql_honor_form_el:5,fe_us:2,featur:[0,2],feel:2,fegroup:[2,5],fehlen:5,fehler:5,feidcontain:[2,5],femal:2,fend:2,ferrari:2,fetch:2,fetch_al:2,feuser:[2,5],feusergroup:2,feuseruid:2,few:2,fiat:2,field:[0,5],fieldset:[0,5],file1:2,file2:2,file3:2,file4:2,file5:2,file6:2,file7:2,file8:2,file:[0,3,5],fileaccess:0,fileadmin:2,filebas:5,filebuttontext:[2,5],filedestin:[2,5],filedestinaton:2,filemanag:2,filenam:[2,5],filereplac:[2,5],files:2,filesystem:2,filetyp:2,fileupload:5,fill:[0,5],fillldapvalu:2,fillstoreldap:2,filter:2,find:[2,5],fine:[2,5],finish:2,fire:[2,5],first:[2,5],firstnam:0,fit:2,five:2,fix:[0,2],flag:2,flagautosubmit:2,fluid:2,fly:[2,5],focu:[2,5],folder:2,folg:5,follow:2,fontselect:2,fontsizeselect:2,forbid:2,forbidden:2,forc:2,forced_root_block:2,forecolor:2,foreign:5,forg:1,forign:5,form:[0,3,5],form_bs_column:2,form_bs_input_column:[2,5],form_bs_label_column:[2,5],form_bs_note_column:[2,5],form_button_on_change_class:2,form_data_error:2,form_data_match_error:2,form_data_pattern_error:2,form_data_required_error:2,form_language_a__id:2,form_language_a_id:2,form_language_a_label:2,form_language_b_id:2,form_language_b_label:2,form_language_c_id:2,form_language_c_label:2,form_language_d_id:2,form_language_d_label:2,form_person:2,formact:5,format:0,formatierung:5,formeditor:[0,5],formel:[0,3,5],formelemen:2,formelementeditor:5,formelemnt:5,formid:[2,5],formidpast:2,formload:5,formmod:2,formmodeglob:[2,5],formnam:[2,5],formtitl:5,formular:5,formulareditor:5,formularelement:5,forward:[0,5],forwardmod:[0,5],forwardpag:[0,5],foto:2,found:[2,5],fourth:2,fqdn:2,fr0:2,framework:0,frank:2,frau:2,free:[0,5],fresh:3,from:[0,2,5],front:2,frontend:[2,5],fse:2,fsep:2,fsl:0,fsrd:5,fsrvd:[2,5],fuer:5,full:2,fullfil:2,funktioniert:5,funtion:5,further:2,furthermor:2,futur:0,galleri:2,geaenderten:5,geehrt:2,geehrter:2,geladen:5,geloescht:5,gender:2,gener:[0,5],german:[2,5],geschrieben:5,gespeichert:5,get:[0,5],get_ldap_entri:2,get_result:2,getbootstrap:2,getelementbyid:2,getnativeformel:5,gewaehlt:5,gfx_extra_button_info_below:[2,5],gfx_extra_button_info_inlin:[2,5],gif:2,git:[1,2],github:[1,2,4],give:2,given:[2,5],givennam:2,gleichzeitig:5,global:[0,5],glue:2,glyph:2,glyphicon:[2,5],glyphnam:2,gnu:0,goe:2,good:[2,5],got:5,gpl:0,gplv3:5,grade1:2,grade2:2,grade3:2,grade5:2,grade:2,grafic:2,grai:2,grant:2,grc:5,green:2,grei:[2,5],grid2:2,grid:2,gridjqw:[2,5],group:[0,5],guarante:[2,5],had:5,hallo:2,handeld:5,handi:2,handl:[2,5],handleescapespacecom:5,happen:2,hard:[2,5],hardco:5,hardcod:5,has:[2,5],hat:5,hauptrecord:5,have:[2,5],head:[2,5],header:2,headless:2,height:[2,5],hello:2,help:[0,5],helper:2,here:[2,4],herr:2,hidden:[2,5],hide:[0,5],hidezero:2,hierachi:5,highest:2,hijack:2,hint:2,histori:[2,5],hold:2,holidai:2,hollywood:2,home:2,homepag:2,honda:2,honeypot:[0,5],hoover:5,horizont:2,host:[2,5],hostnam:2,hourglass:5,hover:2,how:[2,5],howev:2,howto:5,href:2,htaccess:2,htlmlbefor:5,html2pdf:5,html5:2,html:[0,5],htmlafter:[2,5],htmlbefor:[2,5],htmlentiti:2,htmlspecialchar:2,htmlspecialchar_decod:5,http:[0,1,2,4,5],http_host:2,human:2,iana:2,icon:[0,5],idea:2,ident:2,identifi:[2,5],ids:2,idsrc:2,ifnul:2,imag:[2,5],img:2,immedi:2,impact:2,implement:[2,5],implementieren:5,implent:2,impli:2,implicit:[2,5],implizit:5,implod:2,impressum:2,improv:2,inactiv:2,inappropi:5,incl:2,includ:[2,5],includecss:2,includej:2,incompat:5,increas:5,increment:2,indent:2,independ:[2,5],independet:2,index:[2,5],indic:2,individu:[2,5],info:[0,2,5],inform:[2,5],inherit:2,ini:[0,5],init:2,initi:2,inject:2,inlin:2,inner:2,input:[2,5],insensit:2,insert:5,insertid:2,insid:[2,5],inspect:2,instal:[0,3,5],installtool:2,instanc:[2,5],instant:2,instead:[2,5],insuffici:5,integ:2,intend:2,intens:2,interact:2,interest:2,interfac:2,intern:[0,5],interpret:2,intervent:2,intl:[2,5],introduc:5,introduzca:2,invalid:2,invalidd:5,issu:[1,2],ist:5,ital:2,item:[2,5],itemid:2,itemlist:[2,5],itemvalu:5,iter:2,itself:2,jaguar:2,jane:2,javascript:[0,5],javascriptproblem:2,jazz:2,john:2,join:2,jpg:2,jqueri:2,jqx:[2,5],json:5,just:2,justifi:5,kann:5,kei:[0,1,5],kein:5,key1:2,keyn:2,keysemid:[2,5],keysemidus:2,keystrok:2,keyword:[0,5],kind:0,known:2,komplett:5,konfigurierbar:5,konflikt:5,label2:2,label:[2,5],labl:2,lack:5,landscap:2,languag:[0,5],languageparametera:2,languageparameterb:2,last:[2,5],last_insert_id:2,lastnam:2,later:[2,5],latest:[2,5],layout:[0,5],ldap:[0,5],ldap_1_:2,ldap_1_password:[2,5],ldap_1_rdn:[2,5],ldap_bind:[2,5],ldap_escap:5,ldap_escape_dn:2,ldap_escape_filt:2,ldap_opt_protocol_vers:5,ldapattribut:2,ldapbasedn:2,ldapsearch:2,ldapserv:2,ldaptimelimit:2,ldapusebindcredenti:[2,5],lead:[2,5],least:[2,5],leav:[2,5],leerer:5,left:[2,5],lenght:5,length:2,less:[2,5],let:2,level:[0,5],lib:[2,5],librari:2,libxrender1:[2,5],licens:[0,5],light:2,like:[2,5],limit:[2,5],line:[0,5],linebreak:[2,5],lineheight:2,link:[0,5],linktext:2,linux:[2,5],list:[0,5],live:2,load:5,local:[0,5],localhost:2,locat:2,lock:[0,5],lockip:2,loeschen:5,log:[0,5],logfil:[2,5],logg:2,logged_in:2,logged_out:2,logger:5,logic:[2,5],login:2,logout:5,longer:[2,5],look:2,lookup:2,loos:[2,5],los:2,lost:5,lot:2,loui:2,lower:2,lowercas:2,machen:5,magnifi:2,mai:2,mail:[2,5],mailer:2,maillog:2,mailto:2,main:[2,5],mainli:[2,5],mainpag:2,maintain:5,mainten:2,make:[2,5],makefil:5,male:2,malic:2,malici:2,man:5,manag:2,mandatori:[2,5],mani:[2,5],manipul:2,manual:[2,5],map:2,margin:[2,5],mark:[2,5],marker:2,masteid:2,master:[2,5],mastert:2,match:[2,5],matchen:5,math:[0,2,5],matrix:0,max:[2,5],max_height:2,max_input_tim:2,maxfiles:[2,5],maximum:2,maxlength:[2,5],maxsiz:5,maxvisiblepil:2,mayb:2,mb_internal_encod:0,mean:[2,5],meaning:2,measur:2,media:2,meet:2,member:5,memori:2,memory_limit:2,menu:2,menubar:2,merg:[2,5],messag:[0,5],messagefail:2,messi:2,meta:[2,5],method:[2,5],micro:5,middl:2,might:[2,3,5],miller:2,millerfrank:2,mime:[2,5],min:[2,5],min_height:2,minim:2,minimum:2,minor:5,minut:2,minwidth:2,misc:2,mismatch:2,miss:[2,5],mit:5,mitsenden:5,mobil:0,modal:[2,5],mode:[0,5],modeform:5,model:2,modesql:[2,5],modif:2,modifi:[2,5],modul:2,moeglich:5,moment:[2,5],more:[0,5],most:[2,5],mostli:2,motor:2,mous:2,mouseov:2,move:[2,5],moveabl:2,msg_content:5,much:2,mulitipl:2,multi:[0,5],multidetailform:2,multidetailformparamet:2,multilanguag:5,multimod:2,multipl:[0,5],multipli:2,multisql:2,music:2,must:2,mute:2,mutlipl:2,my_long_variable_130:2,myciti:2,mynam:2,mynewnam:2,mypathfilenameavatar:2,mypathfilenamepictur:2,mypic:2,mysecurepassword:2,mysql:[2,5],mysqli:[2,5],mysqlnd:2,mystreet:2,myupload1:2,n_param1:2,nach:5,nachfrag:5,nachnamen:5,name:[0,5],nativ:[0,5],navbar:2,navig:2,necessari:[2,5],need:[2,5],neg:2,nest:0,net:2,neu:5,neuen:5,neuer:5,never:2,nevertheless:2,new_button_class:2,new_button_glyph_icon:2,new_button_text:2,new_button_tooltip:2,newbuttonclass:2,newbuttonglyphicon:2,newbuttontext:2,newbuttontooltip:2,newer:2,newli:[2,5],newlin:2,next:0,nice:2,nicelink:2,nicht:5,nnnick:2,nochmal:5,nombr:2,non:[0,5],none:[0,5],nonreservednam:2,nor:5,normal:[2,5],nostrip:[2,5],notat:0,note1:2,note2:2,note3:2,note4:2,note:0,noteid:2,noteidavatar:2,noteidpictur:2,noth:[2,5],notic:2,now:[2,5],nowadai:5,nowher:5,npm:5,nul:2,num:[2,5],num_row:2,number:[2,5],numer:[2,5],numlist:2,occur:2,oder:2,off:[2,5],offer:[0,2,5],often:2,ohn:5,old:[2,5],omit:[2,5],ommit:2,onc:2,onchang:2,one:[2,5],onli:[0,5],onlin:[2,5],onlinerecruitingtool:3,ooo:2,open:[0,2],opencont:0,openpub:0,oper:2,opera:2,opt:5,optim:5,option:[2,5],optional:5,orang:[2,5],ord:[0,5],order:[2,5],ordinari:2,org:[0,1,2,4,5],orient:2,origin:2,ormel:5,ort:3,ostertag:0,other:[2,5],otherfund:2,otherwis:[2,3],out:2,outdent:2,outer:2,output:2,outsid:[2,5],over:2,overview:2,overwrit:2,overwritten:[2,5],own:[2,5],packag:[2,5],pad:5,page:[0,5],pagealia:[2,5],pageb:2,pageforward:5,pageid:2,pagelanguag:2,pages:2,pagetitl:[2,5],pagetyp:2,pagex:5,pai:2,pair:2,param:[2,5],paramat:2,paramet:[0,5],parameternam:5,paramt:[2,5],parent:2,pars:[2,5],part:2,pass:2,password:[0,5],past:[0,5],pasteform:2,path:2,pathfilenam:2,pathfilenameavatar:2,pathfilenamepictur:2,pathtoimag:2,patient:2,pattern:[2,5],pdf:[0,5],pdftk:[2,5],pedant:[0,5],penalty_time_broken_sip:5,pencil:[2,5],pendant:5,per:[0,5],perform:2,period:2,periodid:[0,5],permiss:2,permit:2,permitedit:[0,5],permitnew:0,permitnewedit:2,persist:2,person:0,persona:2,personid:2,personnametypeahead:2,personnametypeaheadsetnam:2,pertoken:0,php5:[2,5],php5enmod:2,php7:[2,5],php:[2,5],php_admin_flag:2,php_intl:5,phpdoc:5,phpdocumentor:5,pictur:2,picture_:2,pid:2,pill:[0,5],pink:2,pixel:2,place:[2,5],placehold:[2,5],plai:[2,3,5],plain:2,plantuml:5,pleas:[2,5],plu:[2,5],plugin:2,png:2,point:2,pop:2,popup:[2,5],popupmessag:2,por:2,posit:2,possibl:[2,5],post:[0,5],post_max_s:2,postal_cod:2,potenti:2,practial:2,practic:[0,3,5],pre:[2,5],precalcul:2,precis:2,predefin:0,prefer:2,prefetch:[0,5],prefix:2,prepar:0,prepend:2,preselect:2,preslei:2,press:[2,5],prevent:[2,5],preview:2,previou:2,previous:2,primari:[0,5],print:[0,5],printer:2,printout:[2,5],printview:2,prio:2,prior:5,prioriti:[2,5],privat:2,privileg:0,probabl:2,problem:[0,5],problemat:2,process:[0,5],product:2,program:2,prohibit:2,project:[1,2],properbl:5,properli:5,protect:[2,5],protocol:5,provid:2,proxi:5,publish:[0,4],pull:2,pure:[2,5],purg:2,purpos:2,put:2,qfq:[3,5],qfq_:2,qfq_db:2,qfquser:2,qualifi:[2,5],queri:[0,5],question:0,quick:0,quickformqueri:5,quickli:2,quicklink:5,quot:5,radio:[0,5],rafael:0,rand:5,random:2,rang:2,rare:2,rbeg:2,rbgd:2,rdn:2,reach:5,read:[2,5],readabl:2,readi:[0,2],readio:2,readonli:[2,5],real:2,real_escape_str:[2,5],realescapestr:5,realli:2,realnam:2,reason:5,recalcul:2,receiv:[2,5],recent:2,recipi:2,recod:5,recogn:2,recommend:2,record:[0,5],record_lock_timeout_second:2,recorddestinationt:2,recordid:[2,5],recordlocktimeoutsecond:2,recordsourcet:2,recrod:2,recurs:5,red:2,redeclar:2,redirect:[2,5],redirect_all_mail_to:2,redo:2,reduc:5,refer:[2,5],referenc:0,refman:2,reformat:5,regexp:2,regist:2,registr:2,regular:[2,5],reinsert:5,rel:2,relas:2,relat:[0,2,5],releas:[0,2],relev:2,reload:[2,5],remain:2,rememb:2,remind:2,remot:[2,5],remote_addr:2,remov:[2,5],renam:[2,5],rend:2,render:[0,5],rendermod:2,renr:2,reopen:5,repeat:2,replac:[2,5],repli:2,repo:2,report:[0,5],repositori:[1,4],repres:2,represent:2,request:2,requir:[0,5],requiredlist:[2,5],requiredoff:[2,5],requiredparamet:2,requiredparamt:5,rerend:2,reserv:[2,5],reserverd:5,resourc:2,resp:2,respect:[2,5],respectet:5,respons:[0,2],rest:2,restart:2,restrict:[2,5],restrictediprang:2,result:0,resultset:2,retriev:2,returncod:2,retyp:[2,5],retypelabel:2,retypenot:2,reus:[2,5],revert:5,revok:2,rewrit:5,rewriterul:2,rewrot:5,rich:2,right:[2,5],risk:2,roomnumb:2,root:2,rose:[0,4],ross:2,rotat:2,roughli:2,round:2,row:[0,5],rowid:2,rowlabelinputnot:[2,5],rquir:5,rs0:2,rse:2,rsep:2,rst:5,rule:2,run:2,runtim:2,sai:2,sale:2,same:[2,5],sampl:2,sanat:5,sanatize_allow_al:5,sanit:[0,5],satisfi:2,save:[0,5],save_button_class:2,save_button_glyph_icon:2,save_button_text:2,save_button_tooltip:2,savebuttonact:[2,5],savebuttonclass:2,savebuttonglyphicon:2,savebuttontext:[2,5],savebuttontooltip:2,scalar:5,scale:2,scenario:2,schedul:2,schliesst:5,schoolyear:2,screenshot:5,script:2,search:[0,5],searchreplac:2,seat:2,secid:2,second:[2,5],secondari:2,section:[2,5],secur:[0,5],securedirectfileaccess:2,security_attack_delai:2,security_get_max_length:[0,5],security_show_messag:2,security_vars_honeypot:2,see:[2,5],seem:5,sehr:2,select:[0,5],selectlist:2,selektiert:5,self:0,semest:2,send:[2,5],sender:2,sendmail:[0,5],sendmailbcc:2,sendmailcc:2,sendmailflagautosubmit:2,sendmailfrom:2,sendmailgrid:2,sendmailreplyto:2,sendmailsubject:2,sendmailto:2,sendmailxid:2,sens:5,sent:[2,5],sep:2,separ:[2,5],seper:2,sequenc:5,sequenti:2,seri:2,serv:2,server:[0,5],servic:2,session:[2,5],sessioncooki:5,set:[2,5],set_error_handl:5,setup:[0,5],setzen:5,sever:[0,5],sex:2,share:0,sheet:2,shortcut:2,should:[2,5],show:[0,3,5],show_debug_info:[2,5],showbutton:[0,5],showdebuginfo:5,shown:[2,5],showpassword:5,showsecond:2,showzero:2,side:[2,5],sign:2,similar:2,simpl:0,simpli:2,simplifi:2,simultan:2,sinc:[2,5],singl:[0,5],sip:[0,5],sip_target_url:5,site:2,site_path:2,situat:2,size:[2,5],skip:[2,5],slave:2,slaveid:[0,5],slavet:2,sleep:[2,5],slow:2,small:2,smartphon:[2,5],smarttabl:2,snippet:2,softwar:2,soll:5,solut:0,solv:[2,5],som:5,some:[2,3,5],somenam:2,somet:2,someth:2,sometim:2,somewher:2,soon:2,sourc:[0,5],space:[0,5],spain:2,spaltennamen:5,span:2,speak:2,special:[0,5],specialchar:[2,5],specif:[0,5],specifi:[2,5],speichern:5,split:[2,5],spoof:2,sporadisch:5,sql1:[2,5],sql:[0,3,5],sql_log:[2,5],sql_log_mod:[2,5],sqlafter:[0,5],sqlbefor:[0,5],sqlcount:2,sqldelet:[0,5],sqlfinal:2,sqlhonorformel:2,sqlinsert:[0,5],sqllog:[2,5],sqllogmod:[2,5],sqlparamarrai:2,sqlupdat:[0,5],sqlvalid:0,squar:2,src:2,stabil:5,stacktrac:2,stai:2,stand:2,standalon:2,standard:[2,5],star:2,start:[2,5],starter:0,startet:5,state:2,statement:[2,5],statist:2,statu:[2,5],status:2,statusbar:2,steelblu:2,still:[2,5],stop:2,store:[0,5],store_befor:5,store_cli:[2,5],store_form:[2,5],store_ldap:2,store_record:[2,5],store_sip:[2,5],store_system:5,store_typo3:5,store_var:2,str_replac:2,street:2,streetnumb:2,string:[2,5],strip:2,structur:[0,5],student:2,stuff:2,style:[2,5],styleselect:2,sub:2,subdirectori:2,subject:2,sublevel1:2,submit:[2,5],submit_reason:[2,5],submitbuttontext:[0,5],subqueri:2,subrecord:[0,5],subrecordhead:5,subrecordopt:[2,5],subrecordtablecass:5,subrecordtableclass:2,subsequ:[2,5],substitut:2,substring_index:2,subsublevel2:2,subtre:2,success:2,successfulli:2,suchen:5,sudo:2,suffici:2,suffuci:2,suitabl:2,sum:2,suppli:[2,5],support:[0,2,5],suppress:[2,5],sure:2,surroud:2,surround:2,sy0:2,symbol:[2,5],synonym:2,syntax:[0,5],sysext:2,system:[0,5],system_extra_button_info_class:2,system_extra_button_info_posit:2,system_form_element_column:2,system_path_ext:5,system_security_absolute_get_max_length:5,system_sql_raw:2,system_stor:2,sytem:5,t3documentationstart:[2,4],tab:[2,5],tabindex:2,tabl:[0,5],tablecolumn:5,tablenam:2,tag:[0,2,5],taget:2,tail:2,take:[2,5],taken:2,target:2,tdcolspan:2,technic:2,technical_contact:[2,5],telephonenumb:2,tell:2,templat:[0,5],templategroup:[0,5],templategroupindex:5,templatgroup:5,temporari:[2,5],temporarili:2,ter:1,termin:2,tesla:2,test1:2,test2:2,test:[2,5],text1:2,text2:2,text:[0,5],textarea:[2,5],textcolor:2,textpattern:2,tgaddclass:[2,5],tgaddtext:[2,5],tgclass:[2,5],tgremoveclass:[2,5],tgremovetext:[2,5],than:[2,5],thead:[2,5],thei:[2,5],them:[0,2,5],theme:2,therefor:[2,5],theses:2,thi:[0,2,5],thing:2,third:5,those:[2,5],three:[2,5],through:[2,5],thrown:5,thumbnail:2,tick:[2,5],time:[0,5],timejqw:2,timeout:[2,5],timestamp:[2,5],timout:2,tinymc:[2,5],tip:[2,3],titl:[2,5],titletext:2,tmp:2,todo:2,togeth:[0,2],token:[2,5],tomorrow:2,too:[2,5],toogl:5,tool:2,toolbar:2,toolbarcontrol:2,tooltip:[2,5],top:2,topic:2,total:2,track:5,tracker:1,trail:[2,5],tranform:2,transfer:2,translat:2,translateidcolumn:2,transmit:[2,5],trash:2,treat:[2,5],tree:2,tri:[2,5],trick:2,trigger:[2,5],trim:2,troubl:2,truncat:2,tt_content:[2,5],ttcontent:2,ttcontentuid:2,tupl:2,turn:[2,5],twice:2,two:[2,5],txt:[2,5],typ:[2,5],type:[0,5],typeahead:[0,5],typeaheadldap:[2,5],typeaheadldapidprintf:[2,5],typeaheadldapkeyprintf:5,typeaheadldapsearch:2,typeaheadldapsearchpertoken:[2,5],typeaheadldapsearchprefetch:2,typeaheadldapvalueprintf:2,typeaheadlimit:2,typeaheadminlength:2,typeaheadpedant:[2,5],typeaheadsql:[2,5],typenr:2,typic:[2,3,5],typo3:[0,1,5],typo3_conf_var:2,typo3cm:[2,4],typo3conf:2,typo:2,typoscript:[2,5],typosript:2,ubuntu:2,udpat:5,uid:2,umlaut:2,unambigu:2,unchang:2,uncheck:[2,5],uncomplet:5,und:[2,5],undefin:[0,5],under:[0,2],underscor:2,understand:2,undo:2,unecassari:5,unecessari:5,unessari:5,unhid:2,unifi:2,uniniti:5,uniq:2,uniqid:[2,5],uniqu:[2,5],unit:[2,5],unknown:2,unlimit:2,unlock:5,unprotect:2,unterdruecken:5,until:2,untouch:5,untrust:2,unwant:[2,5],updat:[0,5],updateclipboardrecord:2,upload:[0,5],upload_max_files:2,uploadadvanced1:2,uploadadvanced2:2,uploadsimpl:2,upper:[2,5],upto:2,url:[0,5],urldecod:2,urldecodearr:5,urlencod:2,urlparam:[2,5],use:[2,5],usecas:2,used:[2,3,5],useful:[2,5],user:[0,5],userformexcept:5,usergroup:2,usermanu:5,usernam:[1,2],usersmanu:5,uses:2,using:[2,5],usr:2,usual:2,utf8:[2,5],utf8_general_ci:5,uzh:[0,2,5],vacat:2,valid:[2,5],valu:[0,5],value1:2,value2:2,valuen:2,var_add_by_sql:2,varchar:[2,5],variabl:[0,5],variablesaddbysql:2,variant:2,variat:2,variou:2,varnam:2,veri:[2,5],verifi:2,verschwindet:5,version:0,vertic:2,via:[0,5],video:2,view:[1,5],viewabl:2,viewport:2,violat:0,violet:2,visibl:2,visualchar:2,vivaldi:5,von:5,vornam:2,vornamen:[2,5],w3c:2,wai:[2,5],wait:2,want:2,wapp:2,wappc3:2,wappc:2,warm:2,warn:2,warnung:5,web:2,webbrows:2,webdevelop:2,webkit:5,webmast:2,webpag:2,webpass:5,webserv:[0,5],webservererrorlog:2,websit:[2,5],welcom:2,well:2,wenn:5,werden:5,what:2,wheel:2,when:[2,5],where:[2,5],which:[2,5],whish:2,white:2,whitelist:2,whitespac:2,who:2,whole:[2,5],whose:2,wichtig:5,wide:[2,5],width:[0,5],wie:5,wildcard:2,window:[2,5],wird:5,wish:2,without:[2,5],wizard:0,wkhtml:[2,5],wkhtmltopdf:[0,5],wkhtmltox:5,wkthml:2,wobbl:5,won:2,word:2,work:2,workaround:2,workflow:2,world:2,worldsai:2,would:2,wouldn:5,wrap:[0,5],wrapaft:5,wrapinput:[2,5],wraplabel:[2,5],wrapnot:2,wrappedimg:2,wrapper:2,wraprow:[2,5],wraptag:2,wrench:[2,5],write:[2,4,5],written:2,wrong:5,wrote:5,www:[0,2,5],xdebug_sessuib_start:5,xhtml:2,xid:[2,5],xserver:2,xxx:2,yearli:2,yellow:2,yes:[2,5],yet:[2,5],you:2,your:2,ypeaheadldapsearchprefetch:2,yyyi:2,zero:2,zip:[2,5]},titles:["QFQ Extension","Links","General","Online Recruiting Tool","TYPO3 Documentation Starter &#8220;Public Info&#8221;","Release"],titleterms:{"class":2,"default":2,"export":2,"function":2,"new":2,"public":4,"var":2,_exec:2,_file:2,_img:2,_link:2,_mailto:2,_page:2,_pdf:2,_sendmail:2,_server:2,_vertic:2,_zip:2,access:2,across:2,action:2,add:2,addit:2,advanc:2,advisori:2,after:2,ahead:2,area:2,attribut:2,autofocu:2,automat:2,basic:2,befor:2,best:2,bodytext:2,bug:5,call:2,central:2,challeng:2,chang:5,charact:2,chart:2,checkbox:2,citi:2,classbodi:2,classpil:2,client:2,close:2,column:2,combin:2,comment:2,comput:2,concept:2,config:2,configur:2,contain:2,content:2,convers:2,copi:2,css:2,custom:2,databas:2,date:2,datetim:2,debug:2,defin:2,definit:2,delet:2,detail:2,differ:2,direct:2,document:[2,4],download:2,dynam:2,edit:2,editor:2,effect:2,element:2,empti:2,error:2,escap:2,exampl:2,except:2,exclus:2,extens:0,extra:2,extrabuttoninfo:2,extrabuttonlock:2,extrabuttonpassword:2,extradeleteform:2,faq:2,featur:5,field:2,fieldset:2,file:2,fileaccess:2,fill:2,firstnam:2,fix:5,form:2,format:2,formeditor:2,formel:2,forward:2,forwardmod:2,forwardpag:2,free:2,fsl:2,futur:5,gener:2,get:2,global:2,group:2,help:2,hide:2,honeypot:2,html:2,icon:2,info:4,ini:2,insert:2,instal:2,intern:2,javascript:2,kei:2,keyword:2,languag:2,layout:2,ldap:2,level:2,line:2,link:[1,2],list:2,load:2,local:2,lock:2,log:2,matrix:2,mb_internal_encod:2,messag:2,mode:2,more:2,multi:2,multipl:2,name:2,nativ:2,nest:2,next:2,non:2,none:2,notat:2,note:[2,5],onli:2,onlin:3,open:5,ord:2,page:2,paramet:2,password:2,past:2,pdf:2,pedant:2,per:2,periodid:2,permitedit:2,permitnew:2,person:2,pertoken:2,pill:2,post:2,practic:2,predefin:2,prefetch:2,prepar:2,primari:2,print:2,privileg:2,problem:2,process:2,qfq:[0,2],queri:2,question:2,radio:2,record:2,recruit:3,referenc:2,releas:5,render:2,report:2,requir:2,result:2,row:2,sanit:2,save:2,search:2,secur:2,security_get_max_length:2,select:2,self:2,sendmail:2,server:2,setup:2,sever:2,share:2,show:2,showbutton:2,simpl:2,singl:2,sip:2,slaveid:2,solut:2,sourc:2,space:2,special:2,specif:2,sql:2,sqlafter:2,sqlbefor:2,sqldelet:2,sqlinsert:2,sqlupdat:2,sqlvalid:2,starter:4,store:2,structur:2,submitbuttontext:2,subrecord:2,syntax:2,system:2,tabl:2,templat:2,templategroup:2,text:2,time:2,tool:3,type:2,typeahead:2,typo3:[2,4],undefin:2,updat:2,upload:2,url:2,user:2,valu:2,variabl:2,version:[2,5],via:2,violat:2,webserv:2,width:2,wizard:2,wkhtmltopdf:2,wrap:2}})
\ No newline at end of file
-- 
GitLab