openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 16afe8950382417dc82dcae4ccbcf09b59399968
parent e1b0a5df0da51ccaf02da929838c55a62ab8d8af
Author: Jan Dankert <develop@jandankert.de>
Date:   Wed, 17 Nov 2021 21:45:35 +0100

Merge branch 'split-value-content'

# Conflicts:
#	dev-helper/docker/openrat-dev/config-dev.yml

Diffstat:
MDockerfile | 5+++--
Mdev-helper/docker/openrat-dev/config-dev.yml | 9++++++++-
Mmodules/cms/action/LoginAction.class.php | 2+-
Mmodules/cms/action/PageelementAction.class.php | 10+++-------
Mmodules/cms/action/ProfileAction.class.php | 2+-
Mmodules/cms/action/RequestParams.class.php | 2+-
Mmodules/cms/action/UserAction.class.php | 2+-
Mmodules/cms/action/login/LoginLoginAction.class.php | 2+-
Mmodules/cms/action/login/LoginPasswordAction.class.php | 2+-
Mmodules/cms/action/login/LoginPasswordcodeAction.class.php | 2+-
Mmodules/cms/action/login/LoginRegisterAction.class.php | 2+-
Mmodules/cms/action/pageelement/PageelementHistoryAction.class.php | 17++++++++++++++++-
Mmodules/cms/action/pageelement/PageelementValueAction.class.php | 9+++++++++
Mmodules/cms/action/profile/ProfileMailAction.class.php | 6+++---
Mmodules/cms/action/profile/ProfilePwAction.class.php | 2+-
Mmodules/cms/action/template/TemplateSrcAction.class.php | 4++--
Mmodules/cms/base/DefaultConfig.class.php | 35++++++++---------------------------
Mmodules/cms/base/Startup.class.php | 2+-
Mmodules/cms/generator/FileGenerator.class.php | 21+++++++++++++++++----
Mmodules/cms/generator/PageGenerator.class.php | 6+++++-
Mmodules/cms/generator/ValueGenerator.class.php | 36++++++++++++++++++++++--------------
Mmodules/cms/model/BaseObject.class.php | 10+++++++---
Amodules/cms/model/Content.class.php | 459+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mmodules/cms/model/File.class.php | 70+++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Mmodules/cms/model/Page.class.php | 42++++++++++++++++++++++++++++++------------
Amodules/cms/model/PageContent.class.php | 174+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mmodules/cms/model/TemplateModel.class.php | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
Mmodules/cms/model/Value.class.php | 543++++++++++++++++---------------------------------------------------------------
Amodules/cms/status/Status.class.php | 256+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mmodules/cms/update/Update.class.php | 2+-
Mmodules/cms/update/version/DBVersion000001.class.php | 94++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mmodules/cms/update/version/DBVersion000002.class.php | 2+-
Mmodules/cms/update/version/DBVersion000009.class.php | 4++--
Mmodules/cms/update/version/DBVersion000012.class.php | 2+-
Mmodules/cms/update/version/DBVersion000020.class.php | 8++++----
Mmodules/cms/update/version/DBVersion000021.class.php | 4++--
Mmodules/cms/update/version/DBVersion000024.class.php | 2+-
Mmodules/cms/update/version/DBVersion000025.class.php | 2+-
Amodules/cms/update/version/DBVersion000029.class.php | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/update/version/DBVersion000030.class.php | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/update/version/DBVersion000031.class.php | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mmodules/configuration/Config.class.php | 4++--
Mmodules/database/Table.class.php | 13+++++++++----
Mmodules/template_engine/Output.class.php | 2+-
Mmodules/template_engine/components/template.xsd | 1626+------------------------------------------------------------------------------
Dmodules/util/Mail.class.php | 534-------------------------------------------------------------------------------
Amodules/util/mail/Mail.class.php | 292+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/util/mail/client/Client.class.php | 35+++++++++++++++++++++++++++++++++++
Amodules/util/mail/client/SendmailClient.class.php | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/util/mail/client/SmtpClient.class.php | 270+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astatus/index.php | 20++++++++++++++++++++
51 files changed, 2192 insertions(+), 2785 deletions(-)

diff --git a/Dockerfile b/Dockerfile @@ -1,10 +1,10 @@ -FROM alpine:3.10 +FROM alpine:3.13 LABEL maintainer="Jan Dankert" # Install packages RUN apk --update --no-cache add \ - apache2 apache2-http2 \ + apache2 apache2-http2 curl \ php7 php7-apache2 php7-session php7-pdo php7-pdo_mysql php7-pdo_pgsql php7-json php7-ftp php7-iconv php7-openssl php7-mbstring ENV DB_TYPE="mysql" \ @@ -122,4 +122,5 @@ WORKDIR $DOCROOT USER apache +HEALTHCHECK --interval=10s --timeout=5m --retries=1 CMD curl -f http://localhost:8080/status/?health || exit 1 CMD /usr/sbin/httpd -D FOREGROUND diff --git a/dev-helper/docker/openrat-dev/config-dev.yml b/dev-helper/docker/openrat-dev/config-dev.yml @@ -12,7 +12,7 @@ database: user : ${env:DB_USER} password : ${env:DB_PASS} base64 : true # store binary as BASE64 (should be true for postgresql) - prefix : cms_ + prefix : cms_pro1_ suffix : _or log: file : "" @@ -21,6 +21,13 @@ log: production: ${env:CMS_PRODUCTION} +mail: + client: smtp + smtp: + relay: + host: mail.weiherhei.de + hostname: "cms.docker.spencer" + publish: filesystem: directory: /var/www/localhost/public diff --git a/modules/cms/action/LoginAction.class.php b/modules/cms/action/LoginAction.class.php @@ -20,7 +20,7 @@ use util\exception\ObjectNotFoundException; use util\exception\SecurityException; use util\exception\UIException; use util\exception\ValidationException; -use util\Mail; +use util\mail\Mail; use util\Session; use util\text\TextMessage; diff --git a/modules/cms/action/PageelementAction.class.php b/modules/cms/action/PageelementAction.class.php @@ -358,14 +358,10 @@ class PageelementAction extends BaseAction $value->page = new Page( $value->objectid ); $value->page->load(); - // Inhalt sofort freigegeben, wenn // - Recht vorhanden // - Freigabe gewuenscht - if ( $value->page->hasRight( Permission::ACL_RELEASE ) && $this->request->has('release') ) - $value->publish = true; - else - $value->publish = false; + $value->publish = $value->page->hasRight( Permission::ACL_RELEASE ) && $this->request->has('release'); // Up-To-Date-Check $lastChangeTime = $value->getLastChangeSinceByAnotherUser( $this->request->getText('value_time'), Session::getUser()->userid ); @@ -382,13 +378,13 @@ class PageelementAction extends BaseAction foreach( $project->getLanguageIds() as $languageid ) { $value->languageid = $languageid; - $value->add(); + $value->persist(); } } else { // sonst nur 1x speichern (fuer die aktuelle Sprache) - $value->add(); + $value->persist(); } $this->addNoticeFor( $this->pageelement, Messages::SAVED); diff --git a/modules/cms/action/ProfileAction.class.php b/modules/cms/action/ProfileAction.class.php @@ -29,7 +29,7 @@ use logger\Logger; use security\Base2n; use util\exception\SecurityException; use util\exception\ValidationException; -use util\Mail; +use util\mail\Mail; use util\Session; use util\UIUtils; diff --git a/modules/cms/action/RequestParams.class.php b/modules/cms/action/RequestParams.class.php @@ -4,7 +4,7 @@ namespace cms\action; use util\exception\ValidationException; use util\json\JSON; -use util\Mail; +use util\mail\Mail; use util\Text; use util\XML; diff --git a/modules/cms/action/UserAction.class.php b/modules/cms/action/UserAction.class.php @@ -15,7 +15,7 @@ use security\Base2n; use security\Password; use util\exception\SecurityException; use util\exception\ValidationException; -use util\Mail; +use util\mail\Mail; use util\Session; diff --git a/modules/cms/action/login/LoginLoginAction.class.php b/modules/cms/action/login/LoginLoginAction.class.php @@ -18,7 +18,7 @@ use util\Browser; use util\exception\ObjectNotFoundException; use util\exception\SecurityException; use util\exception\ValidationException; -use util\Mail; +use util\mail\Mail; use util\Session; use util\text\TextMessage; diff --git a/modules/cms/action/login/LoginPasswordAction.class.php b/modules/cms/action/login/LoginPasswordAction.class.php @@ -9,7 +9,7 @@ use language\Messages; use logger\Logger; use security\Password; use util\exception\ValidationException; -use util\Mail; +use util\mail\Mail; use util\Session; diff --git a/modules/cms/action/login/LoginPasswordcodeAction.class.php b/modules/cms/action/login/LoginPasswordcodeAction.class.php @@ -7,7 +7,7 @@ use language\Messages; use logger\Logger; use security\Password; use util\exception\ValidationException; -use util\Mail; +use util\mail\Mail; use util\Session; diff --git a/modules/cms/action/login/LoginRegisterAction.class.php b/modules/cms/action/login/LoginRegisterAction.class.php @@ -7,7 +7,7 @@ use cms\model\User; use language\Messages; use logger\Logger; use util\exception\ValidationException; -use util\Mail; +use util\mail\Mail; use util\Session; use util\text\TextMessage; diff --git a/modules/cms/action/pageelement/PageelementHistoryAction.class.php b/modules/cms/action/pageelement/PageelementHistoryAction.class.php @@ -2,7 +2,9 @@ namespace cms\action\pageelement; use cms\action\Method; use cms\action\PageelementAction; +use cms\model\Content; use cms\model\Element; +use cms\model\PageContent; use cms\model\Value; class PageelementHistoryAction extends PageelementAction implements Method { @@ -10,6 +12,14 @@ class PageelementHistoryAction extends PageelementAction implements Method { $this->page->load(); + + $pageContent = new PageContent(); + $pageContent->languageid = $this->page->languageid; + $pageContent->elementId = &$this->element->elementid; + $pageContent->pageId = $this->page->pageid; + $pageContent->load(); + $this->value->contentid = $pageContent->contentId; + $this->value->objectid = $this->page->objectid; $this->value->pageid = $this->page->pageid; $this->value->page = $this->page; @@ -31,7 +41,12 @@ class PageelementHistoryAction extends PageelementAction implements Method { $value->languageid = $languageId; /** @var Value $value */ - foreach($value->getVersionList() as $value) { + $content = new Content( $this->value->contentid ); + + foreach($content->getVersionList() as $valueId) { + + $value = new Value(); + $value->loadWithId( $valueId ); $language['values'][] = [ 'text' => $this->calculateValue( $value ), diff --git a/modules/cms/action/pageelement/PageelementValueAction.class.php b/modules/cms/action/pageelement/PageelementValueAction.class.php @@ -2,6 +2,7 @@ namespace cms\action\pageelement; use cms\action\Method; use cms\action\PageelementAction; +use cms\model\PageContent; use cms\model\Permission; use cms\model\Page; @@ -13,6 +14,14 @@ class PageelementValueAction extends PageelementAction implements Method { } public function view() { + + $pageContent = new PageContent(); + $pageContent->languageid = $this->page->languageid; + $pageContent->elementId = &$this->element->elementid; + $pageContent->pageId = $this->page->pageid; + $pageContent->load(); + $this->value->contentid = $pageContent->contentId; + $this->value->languageid = $this->page->languageid; $this->value->objectid = $this->page->objectid; $this->value->pageid = $this->page->pageid; diff --git a/modules/cms/action/profile/ProfileMailAction.class.php b/modules/cms/action/profile/ProfileMailAction.class.php @@ -5,7 +5,7 @@ use cms\action\ProfileAction; use language\Messages; use logger\Logger; use util\exception\ValidationException; -use util\Mail; +use util\mail\Mail; use util\Session; use util\text\TextMessage; @@ -39,8 +39,8 @@ class ProfileMailAction extends ProfileAction implements Method { $mail->send(); $this->addNoticeFor( $this->user, Messages::MAIL_SENT); } catch( \Exception $e ) { - Logger::warn( new \Exception( TextMessage::create('Mail could not be sent for user ${name} with the new email adress {mail} ',['name'=>$this->user->name,'mail'=>$newMail]),$e) ); - $this->addNoticeFor($this->user, Messages::MAIL_NOT_SENT ); + Logger::warn( new \Exception( TextMessage::create('Mail could not be sent for user ${name} with the new email adress ${mail} ',['name'=>$this->user->name,'mail'=>$newMail]),0,$e) ); + $this->addErrorFor($this->user, Messages::MAIL_NOT_SENT ); } } } diff --git a/modules/cms/action/profile/ProfilePwAction.class.php b/modules/cms/action/profile/ProfilePwAction.class.php @@ -6,7 +6,7 @@ use cms\base\Configuration; use cms\model\User; use language\Messages; use util\exception\ValidationException; -use util\Mail; +use util\mail\Mail; class ProfilePwAction extends ProfileAction implements Method { public function view() { diff --git a/modules/cms/action/template/TemplateSrcAction.class.php b/modules/cms/action/template/TemplateSrcAction.class.php @@ -48,8 +48,8 @@ class TemplateSrcAction extends TemplateAction implements Method { $text ); } - $this->setTemplateVar( 'modelid',$modelId ); - $this->setTemplateVar( 'source' ,$text ); + $this->setTemplateVar( 'modelid',$modelId ); + $this->setTemplateVar( 'source' ,$text ); $this->setTemplateVar( 'extension',$templatemodel->extension ); } diff --git a/modules/cms/base/DefaultConfig.class.php b/modules/cms/base/DefaultConfig.class.php @@ -39,25 +39,6 @@ class DefaultConfig { 'auto_reload' => true, 'session_destroy_on_config_reload' => true, ], - 'content' => - [ - 'file' => - [ - 'max_file_size' => '1500', - ], - 'revision-limit' => - [ - 'enabled' => false, - 'max-age' => 120, - 'min-age' => 1, - 'max-revisions' => 100, - 'min-revisions' => 3, - ], - 'language' => - [ - 'use_default_language' => true, - ], - ], 'countries' => [ 'AA' => 'Afar', @@ -418,21 +399,21 @@ class DefaultConfig { 'enabled' => true, 'from' => 'OpenRat <user@example.com>', 'signature' => '', - 'cc' => '0', - 'bcc' => '0', - 'priority' => '3', + 'cc' => '', + 'bcc' => '', + 'priority' => '', 'header_encoding' => 'Quoted-printable', 'client' => 'php', 'whitelist' => [], 'blacklist' => [], 'smtp' => [ - 'host' => 'locahost', + 'host' => 'localhost', 'port' => '25', - 'auth_username' => 'your.user@something.example', - 'auth_password' => 'notsecret', - 'timeout' => '45', - 'localhost' => 'your.fully.qualified.hostname.example', + 'auth_username' => '', + 'auth_password' => '', + 'timeout' => 45, + 'localhost' => '', 'tls' => false, 'ssl' => false, ], diff --git a/modules/cms/base/Startup.class.php b/modules/cms/base/Startup.class.php @@ -25,7 +25,7 @@ class Startup { private static $START_TIME; - const MIN_VERSION = '5.4'; // minimum required PHP version. + const MIN_VERSION = '5.6'; // minimum required PHP version. const API_LEVEL = '2'; // public API version. const IMG_EXT = '.gif'; diff --git a/modules/cms/generator/FileGenerator.class.php b/modules/cms/generator/FileGenerator.class.php @@ -6,6 +6,7 @@ namespace cms\generator; use cms\generator\filter\AbstractFilter; use cms\model\File; +use cms\model\Value; use logger\Logger; use util\exception\GeneratorException; @@ -45,14 +46,26 @@ class FileGenerator extends BaseGenerator */ private function filterValue( $file ) { - $totalSettings = $file->getTotalSettings(); + $contentId = $file->contentid; + $totalSettings = $file->getTotalSettings(); $proxyFileId = @$totalSettings['proxy-file-id']; - if ( $proxyFileId ) - $value = (new File( $proxyFileId ))->loadValue(); // This is a proxy for another file. + if ( $proxyFileId ) { + $proxyFile = new File( $proxyFileId ); // This is a proxy for another file. + $proxyFile->load(); + $contentId = $proxyFile->contentid; + } + + $v = new Value(); + $v->contentid = $contentId; + + if ( $this->context->scheme == Producer::SCHEME_PREVIEW ) + $v->load(); else - $value = $file->loadValue(); + $v->loadPublished(); + + $value = $v->file; foreach(\util\ArrayUtils::getSubArray($totalSettings, array( 'filter')) as $filterEntry ) { diff --git a/modules/cms/generator/PageGenerator.class.php b/modules/cms/generator/PageGenerator.class.php @@ -95,7 +95,11 @@ class PageGenerator extends BaseGenerator },$page->getElements() ); $templatemodel = new TemplateModel( $template->templateid, $this->context->modelId ); - $templatemodel->load(); + if ( $this->context->scheme == Producer::SCHEME_PREVIEW ) + $templatemodel->load(); + else + $templatemodel->loadForPublic(); + $src = $templatemodel->src; $data = array(); diff --git a/modules/cms/generator/ValueGenerator.class.php b/modules/cms/generator/ValueGenerator.class.php @@ -17,6 +17,7 @@ use cms\model\Image; use cms\model\Language; use cms\model\Link; use cms\model\Page; +use cms\model\PageContent; use cms\model\Project; use cms\model\Template; use cms\model\Value; @@ -59,8 +60,7 @@ class ValueGenerator extends BaseGenerator /** - * Hier findet die eigentliche Bereitstellung des Inhaltes statt, zu - * jedem Elementtyp wird ein Inhalt ermittelt. + * Generating a page value. * * @return string */ @@ -73,14 +73,22 @@ class ValueGenerator extends BaseGenerator $element = new Element( $this->context->elementid ); $element->load(); + $pageContent = new PageContent(); + + $pageContent->pageId = $page->pageid; + $pageContent->elementId = $this->context->elementid; + $pageContent->languageid = $pageContext->languageId; + $pageContent->load(); + $value = new Value(); - $value->pageid = $page->pageid; - $value->elementid = $this->context->elementid; - $value->languageid = $pageContext->languageId; - $value->load(); - $value->element = $element; + $value->contentid = $pageContent->contentId; + + if ( $this->context->scheme == Producer::SCHEME_PREVIEW ) + $value->load(); + else + $value->loadPublished(); - if ( ! $this->isValueHasContent( $value ) ) + if ( ! $this->isValueHasContent( $value,$element ) ) { $pageForDefaultValue = $page->getPageAsDefault(); @@ -1031,24 +1039,24 @@ class ValueGenerator extends BaseGenerator * * @param $value Value */ - protected function isValueHasContent( $value ) { + protected function isValueHasContent( $value,$element ) { - return in_array($value->element->typeid,[ + return in_array($element->typeid,[ Element::ELEMENT_TYPE_TEXT, Element::ELEMENT_TYPE_LONGTEXT, Element::ELEMENT_TYPE_SELECT, ]) && $value->text != '' && $value->text != null || - in_array($value->element->typeid,[ + in_array($element->typeid,[ Element::ELEMENT_TYPE_NUMBER ]) && $value->number != null || - in_array($value->element->typeid,[ + in_array($element->typeid,[ Element::ELEMENT_TYPE_LINK, Element::ELEMENT_TYPE_INSERT, ]) && $value->linkToObjectId != null && $value->linkToObjectId != 0 || - in_array($value->element->typeid,[ + in_array($element->typeid,[ Element::ELEMENT_TYPE_DATE, ]) && $value->date != null && $value->date != 0 || - in_array($value->element->typeid,[ + in_array($element->typeid,[ Element::ELEMENT_TYPE_CODE, Element::ELEMENT_TYPE_COPY, Element::ELEMENT_TYPE_DYNAMIC, diff --git a/modules/cms/model/BaseObject.class.php b/modules/cms/model/BaseObject.class.php @@ -509,9 +509,13 @@ SQL $slug = str_replace(array_keys($replacements), array_values($replacements), $slug); // 2nd try is to use iconv with the current locale. - Language::setLocale( Configuration::subset('language')->get('language_code','en' ) ); - $slug = iconv('utf-8', 'ascii//TRANSLIT', $slug); - + if ( function_exists('iconv') ) { + Language::setLocale(Configuration::subset('language')->get('language_code', 'en')); + // iconv is buggy on alpine 3 and does not support TRANSLIT. So we have to catch the error here. + $converted = @iconv('utf-8', 'ascii//TRANSLIT', $slug); + if ( $converted !== false ) + $slug = $converted; + } // now replace every unpleasant char with a hyphen. $slug = preg_replace('/[^A-Za-z0-9-]+/', '-', $slug); diff --git a/modules/cms/model/Content.class.php b/modules/cms/model/Content.class.php @@ -0,0 +1,458 @@ +<?php +namespace cms\model; +use cms\base\Configuration; +use cms\base\DB; +use cms\base\Startup; +use util\ArrayUtils; +use cms\generator\Publish; +use cms\macros\MacroRunner; +use \util\exception\ObjectNotFoundException; +use logger\Logger; +use util\exception\GeneratorException; +use util\Text; +use util\Html; +use util\Http; +use util\Transformer; +use util\Code; +use util\cache\FileCache; + +// OpenRat Content Management System +// Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + + +/** + * Darstellen einer Inhaltes + * + * @version $Revision$ + * @author $Author$ + * @package openrat.objects + */ + +class Content extends ModelBase +{ + /** + * Content ID. + * @type Integer + */ + private $id; + + /** + * Seiten-Objekt der ?bergeordneten Seite + * @type Page + */ + var $page; + + /** + * Seiten-Id der uebergeordneten Seite + * @type Integer + */ + var $pageid; + + /** + * Objekt-ID, auf die verlinkt wird + * @type Integer + */ + var $linkToObjectId=0; + + /** + * Text-Inhalt + * @type String + */ + var $text=''; + + /** + * Zahl. Auch Flie?kommazahlen werden als Ganzzahl gespeichert + * @type Integer + */ + var $number=0; + + + /** + * Datum als Unix-Timestamp + * @type Integer + */ + var $date=0; + + /** + * Element-Objekt + * @type Element + */ + var $element; + + /** + * Element-Id + * @type Integer + */ + var $elementid; + + /** + * Der eigentliche Inhalt des Elementes + * @type String + */ + var $value; + + /** + * TimeStamp der letzten Aenderung + * @type Integer + */ + var $lastchangeTimeStamp; + + /** + * Benutzer-ID der letzten Aenderung + * @type Integer + */ + var $lastchangeUserId; + + /** + * Benutzername der letzten Aenderung + * @type Integer + */ + var $lastchangeUserName; + + /** + * Active content. + * + * Do NOT set this attribute, it should be used readonly. + * + * @type bool + */ + public $active; + + /** + * @type Publish + */ + public $publisher; + + /** + * @type boolean + */ + var $publish = false; + + /** + * @type Boolean + * @deprecated + */ + public $simple; + + + /** + * Sprach-Id. + * @var int + */ + public $languageid; + + /** + * Format + * + * @var int + */ + public $format = null; + + /** + * constructor + */ + function __construct( $id = null ) + { + $this->id = $id; + } + + + public function load() + { + // TODO: Implement load() method. + } + + /** + * Gets the IDs of all versions of this content. + * @return array + */ + function getVersionList() + { + $stmt = DB::sql( <<<SQL + SELECT {{value}}.id + FROM {{value}} + WHERE contentid ={contentid} + ORDER BY lastchange_date +SQL + ); + $stmt->setInt( 'contentid' ,$this->id ); + + return $stmt->getCol(); + } + + + /** + * returns the count of all versions. + * @return integer + */ + function getCountVersions() + { + $sql = DB::sql( <<<SQL + SELECT COUNT(*) FROM {{value}} + WHERE contentid ={contentid} +SQL + ); + $sql->setInt( 'contentid' ,$this->id ); + + return $sql->getOne(); + } + + + /** + * @return String|null + */ + public function getLastChangeTime() + { + $sql = DB::sql( <<<SQL + SELECT lastchange_date FROM {{value}} + WHERE contentid ={contentid} + ORDER BY id DESC +SQL + ); + $sql->setInt( 'contentid' ,$this->id ); + + return $sql->getOne(); + } + + + /** + * Gets the last change date by another user since a specific date. + * @param $date + * @param $userid + * @return String + */ + public function getLastChangeSinceByAnotherUser( $date, $userid ) + { + $sql = Db::sql( <<<SQL + SELECT lastchange_date + FROM {{value}} + WHERE contentid = {contentid} + AND lastchange_date > {date} + AND lastchange_userid != {userid} + ORDER BY id DESC +SQL + ); + $sql->setInt( 'contentid' ,$this->id ); + $sql->setInt( 'date' ,$date ); + $sql->setInt( 'userid' ,$userid ); + + return $sql->getOne(); + } + + + + /** + * Inhalt freigeben + */ + function release() + { + $sql = DB::sql( <<<SQL + UPDATE {{value}} + SET publish = 0 + WHERE contentid = {contentid} +SQL + ); + $sql->setInt( 'contentid' ,$this->id ); + + $sql->execute(); + + $sql = Db::sql( <<<SQL + UPDATE {{value}} + SET publish = 1 + WHERE active = 1 + AND contentid = {contentid} +SQL + ); + $sql->setInt( 'contentid' ,$this->id ); + + $sql->execute(); + } + + + /** + * No function, values are NOT updated, values are only added. + * @return name|void + */ + protected function save() + { + // not implemented, values are only added ("copy on write") + } + + + protected function add() + { + // Naechste ID aus Datenbank besorgen + $stmt = DB::sql('SELECT MAX(id) FROM {{content}}'); + $this->id = intval($stmt->getOne())+1; + + $stmt = DB::sql( <<<SQL +INSERT INTO {{content}} + (id ) + VALUES ({contentid}) +SQL + ); + $stmt->setInt( 'contentid' ,$this->id ); + $stmt->execute(); + } + + + /** + * Delete this content. + * + * If a object (page, file, ...) is deleted, then all referenced contents must be deleted too. + */ + public function delete() + { + // Delete all values + $stmt = DB::sql( <<<SQL + DELETE * FROM {{value}} + WHERE contentid = {contentid} +SQL + ); + $stmt->setInt( 'contentid' ,$this->id ); + $stmt->execute(); + + // Delete the content + $stmt = DB::sql( <<<SQL + DELETE * FROM {{content}} + WHERE contentid = {contentid} +SQL + ); + $stmt->setInt( 'contentid' ,$this->id ); + $stmt->execute(); + } + + + + /** + * Es werden Objekte mit einem Inhalt gesucht. + * @param String Suchbegriff + * @return array Liste der gefundenen Objekt-IDs + */ + function getObjectIdsByValue( $text ) + { + $sql = DB::sql( <<<SQL + SELECT {{object}}.id FROM {{value}} + LEFT JOIN {{page}} + ON {{page}}.id={{value}}.pageid + LEFT JOIN {{object}} + ON {{object}}.id={{page}}.objectid + WHERE {{value}}.text LIKE {text} + ORDER BY {{object}}.lastchange_date DESC +SQL + ); + + $sql->setString( 'text' ,'%'.$text.'%' ); + + return $sql->getCol(); + } + + + /** + * Es werden Objekte mit einer UserId ermittelt + * @param Integer Benutzer-Id der letzten ?nderung + * @return array Liste der gefundenen Objekt-IDs + */ + function getObjectIdsByLastChangeUserId( $userid ) + { + $sql = DB::sql( <<<SQL + SELECT {{object}}.id FROM {{value}} + LEFT JOIN {{page}} + ON {{page}}.id={{value}}.pageid + LEFT JOIN {{object}} + ON {{object}}.id={{page}}.objectid + WHERE {{value}}.lastchange_userid={userid} + ORDER BY {{object}}.lastchange_date DESC +SQL + ); + $sql->setInt ( 'userid' ,$userid ); + + return $sql->getCol(); + } + + + + /** + * Es wird das Objekt ermittelt, welches der Benutzer zuletzt ge�ndert hat. + * + * @return Integer Objekt-Id + */ + public static function getLastChangedObjectByUserId( $userid ) + { + $sql = DB::sql( <<<SQL +SELECT {{object}}.id + FROM {{value}} + LEFT JOIN {{page}} + ON {{page}}.id={{value}}.pageid + LEFT JOIN {{object}} + ON {{object}}.id={{page}}.objectid + WHERE {{value}}.lastchange_userid={userid} + ORDER BY {{value}}.lastchange_date DESC +SQL +); + $sql->setInt ( 'userid' ,$userid ); + return $sql->getOne(); + } + + + /** + * Es wird das Objekt ermittelt, welches der Benutzer zuletzt ge�ndert hat. + * + * @return Integer Objekt-Id + */ + public static function getLastChangedObjectInProjectByUserId( $projectid, $userid ) + { + $sql = DB::sql( <<<SQL +SELECT {{object}}.id + FROM {{value}} + LEFT JOIN {{page}} + ON {{page}}.id={{value}}.pageid + LEFT JOIN {{object}} + ON {{object}}.id={{page}}.objectid + WHERE {{value}}.lastchange_userid={userid} + AND {{object}}.projectid = {projectid} + ORDER BY {{value}}.lastchange_date DESC +SQL +); + $sql->setInt ( 'userid' ,$userid ); + $sql->setInt ( 'projectid' ,$projectid ); + return $sql->getOne(); + } + + + + public function getName() + { + return $this->id; + } + + + public function __toString() + { + return "Content: ".print_r($this,true); + } + + + + public function getId() + { + return $this->id; + } + + +} +\ No newline at end of file diff --git a/modules/cms/model/File.class.php b/modules/cms/model/File.class.php @@ -37,6 +37,8 @@ class File extends BaseObject public $fileid; + public $contentid = null; + public $size = 0; public $value = ''; public $extension = ''; @@ -319,8 +321,6 @@ class File extends BaseObject */ function __construct( $objectid='' ) { - $this->storeValueAsBase64 = DB::get()->conf['base64']; - parent::__construct( $objectid ); $this->isFile = true; $this->typeid = BaseObject::TYPEID_FILE; @@ -421,7 +421,7 @@ class File extends BaseObject { $db = \cms\base\DB::get(); - $sql = $db->sql( 'SELECT id,extension,size,filterid'. + $sql = $db->sql( 'SELECT id,contentid,extension,size,filterid'. ' FROM {{file}}'. ' WHERE objectid={objectid}' ); $sql->setInt( 'objectid',$this->objectid ); @@ -433,6 +433,7 @@ class File extends BaseObject $this->extension = $row['extension']; $this->size = $row['size' ]; $this->filterid = $row['filterid' ]; + $this->contentid = $row['contentid']; } $this->objectLoad(); @@ -447,11 +448,15 @@ class File extends BaseObject */ function delete() { - $db = \cms\base\DB::get(); + $content = new Content( $this->contentid ); + $content->delete(); - // Datei l?schen - $sql = $db->sql( 'DELETE FROM {{file}} '. - ' WHERE objectid={objectid}' ); + // Delete file + $sql = DB::sql( <<<SQL + DELETE FROM {{file}} + WHERE objectid={objectid} +SQL + ); $sql->setInt( 'objectid',$this->objectid ); $sql->execute(); @@ -547,19 +552,28 @@ EOF */ private function loadValueFromDatabase() { - $sql = Db::sql( 'SELECT size,value'. - ' FROM {{file}}'. - ' WHERE objectid={objectid}' ); + $sql = Db::sql( <<<SQL + SELECT {{file}}.size,{{value}}.file + FROM {{file}} + LEFT JOIN {{content}} + ON {{file}}.contentid = {{content}}.id + LEFT JOIN {{value}} + ON {{value}}.contentid = {{content}}.id AND {{value}}.active = 1 + WHERE objectid={objectid} +SQL + ); $sql->setInt( 'objectid', $this->objectid); $row = $sql->getRow(); if ( count($row) != 0 ) { - $this->value = $row['value']; - $this->size = $row['size' ]; + $this->value = $row['file']; + $this->size = $row['size']; } - if ( $this->storeValueAsBase64 ) + $storeValueAsBase64 = DB::get()->conf['base64']; + + if ( $storeValueAsBase64 ) $this->value = base64_decode( $this->value ); return $this->value; @@ -576,18 +590,24 @@ EOF $db = \cms\base\DB::get(); $sql = $db->sql( 'UPDATE {{file}}'. - ' SET value={value}, '. - ' size={size} '. + ' SET size={size} '. ' WHERE objectid={objectid}' ); $sql->setString( 'objectid' ,$this->objectid ); $sql->setInt ( 'size' ,strlen($this->value) ); - if ( $this->storeValueAsBase64 ) - $sql->setString( 'value',base64_encode($this->value) ); + $sql->execute(); + + $value = new Value(); + $value->contentid = $this->contentid; + + $storeValueAsBase64 = DB::get()->conf['base64']; + + if ( $storeValueAsBase64 ) + $value->file = base64_encode($this->value); else - $sql->setString( 'value',$this->value ); + $value->file = $this->value; - $sql->execute(); + $value->persist(); } @@ -607,13 +627,19 @@ EOF { parent::add(); + // Getting the content id + $content = new Content(); + $content->persist(); + $this->contentid = $content->getId(); + $sql = Db::sql('SELECT MAX(id) FROM {{file}}'); $this->fileid = intval($sql->getOne())+1; $sql = Db::sql('INSERT INTO {{file}}'. - ' (id,objectid,extension,size,value)'. - " VALUES( {fileid},{objectid},{extension},0,'' )" ); + ' (id,contentid,objectid,extension,size)'. + " VALUES( {fileid},{contentid},{objectid},{extension},0 )" ); $sql->setInt ('fileid' ,$this->fileid ); + $sql->setInt ('contentid',$this->contentid ); $sql->setInt ('objectid' ,$this->objectid ); $sql->setString('extension',$this->extension ); @@ -695,4 +721,3 @@ SQL } -?> -\ No newline at end of file diff --git a/modules/cms/model/Page.class.php b/modules/cms/model/Page.class.php @@ -176,17 +176,15 @@ SQL } - function delete() + public function delete() { - $db = \cms\base\DB::get(); - - $sql = $db->sql( 'DELETE FROM {{value}} '. - ' WHERE pageid={pageid}' ); - $sql->setInt('pageid',$this->pageid); - $sql->execute(); - - $sql = $db->sql( 'DELETE FROM {{page}} '. - ' WHERE objectid={objectid}' ); + $this->deleteContent(); + // Delete the page + $sql = DB::sql( <<<SQL + DELETE FROM {{page}} + WHERE objectid={objectid} +SQL + ); $sql->setInt('objectid',$this->objectid); $sql->execute(); @@ -227,8 +225,6 @@ SQL } - - function save() { $db = \cms\base\DB::get(); @@ -404,4 +400,26 @@ SQL { return 'Id '.$this->pageid.' (filename='.$this->filename.', templateid='.$this->templateid.')'; } + + + /** + * Deletes all content of the page + */ + private function deleteContent() + { + // Delete all page contents. + $project = $this->getProject(); + $languageIds = $project->getLanguageIds(); + $elementIds = $this->getElementIds(); + + foreach( $languageIds as $languageId ) + foreach ( $elementIds as $elementId ) { + $pageContent = new PageContent(); + $pageContent->pageId = $this->pageid; + $pageContent->elementId = $elementId; + $pageContent->languageid = $languageId; + $pageContent->load(); + $pageContent->delete(); + } + } } diff --git a/modules/cms/model/PageContent.class.php b/modules/cms/model/PageContent.class.php @@ -0,0 +1,173 @@ +<?php +namespace cms\model; +use cms\base\Configuration; +use cms\base\DB; +use cms\base\Startup; +use util\ArrayUtils; +use cms\generator\Publish; +use cms\macros\MacroRunner; +use \util\exception\ObjectNotFoundException; +use logger\Logger; +use util\exception\GeneratorException; +use util\Text; +use util\Html; +use util\Http; +use util\Transformer; +use util\Code; +use util\cache\FileCache; + + + +/** + * PageContent. + * + * @author Jan Dankert + */ + +class PageContent extends ModelBase +{ + /** + * ID. + * @var integer + */ + private $id; + + /** + * Content-ID. + * + * @type Integer + */ + public $contentId = 0; + + /** + * Element-Objekt + * @type integer + */ + public $elementId; + + /** + * Sprach-Id. + * @var int + */ + public $languageid; + + /** + * Page-Id + * @var integer + */ + public $pageId; + + /** + * Konstruktor + */ + function __construct() + { + } + + + + /** + * Laden des aktuellen Inhaltes aus der Datenbank + */ + function load() + { + $stmt = Db::sql( <<<SQL + SELECT * FROM {{pagecontent}} + WHERE elementid ={elementid} + AND pageid ={pageid} + AND languageid={languageid} +SQL + ); + $stmt->setInt( 'elementid' ,$this->elementId ); + $stmt->setInt( 'pageid' ,$this->pageId ); + $stmt->setInt( 'languageid',$this->languageid); + $row = $stmt->getRow(); + + if ( count($row) > 0 ) // Wenn Inhalt gefunden + { + $this->contentId = intval($row['contentid']); + $this->id = intval($row['id' ]); + } + } + + + + /** + * No function, values are NOT updated, values are only added. + * @return name|void + */ + protected function save() + { + // not implemented, values are only added ("copy on write") + } + + /** + * Add new object. + */ + public function add() + { + // Get next ID from database. + $stmt = DB::sql('SELECT MAX(id) FROM {{pagecontent}}'); + $this->id = intval($stmt->getOne())+1; + + $content = new Content(); + $content->persist(); + $this->contentId = $content->getId(); + + $stmt = DB::sql( <<<SQL +INSERT INTO {{pagecontent}} + (id ,contentid ,elementid ,pageid ,languageid ) + VALUES ({valueid},{contentid},{elementid},{pageid},{languageid} ) +SQL + ); + $stmt->setInt( 'valueid' ,$this->valueid ); + $stmt->setInt( 'contentid' ,$this->contentId ); + $stmt->setInt( 'elementid' ,$this->elementId ); + $stmt->setInt( 'pageid' ,$this->pageid ); + $stmt->setInt( 'languageid',$this->languageid ); + + $stmt->execute(); + } + + + + /** + * Diesen Inhalt loeschen + */ + function delete() + { + + $content = new Content( $this->contentId ); + $content->delete(); + + $stmt = DB::sql( <<<SQL + DELETE * FROM {{pagecontent}} + WHERE id ={id} +SQL + ); + $stmt->setInt( 'id' ,$this->id ); + + $stmt->execute(); + } + + + public function getName() + { + return "PageContent ".$this->id; + } + + + public function __toString() + { + return "PageContent: ".print_r($this,true); + } + + + + public function getId() + { + return $this->id; + } + + +} +\ No newline at end of file diff --git a/modules/cms/model/TemplateModel.class.php b/modules/cms/model/TemplateModel.class.php @@ -33,6 +33,10 @@ class TemplateModel extends ModelBase public $modelid; public $templateid; + /** + * @var int + */ + private $contentid; /** * TemplateModel constructor. @@ -53,18 +57,24 @@ class TemplateModel extends ModelBase { $db = \cms\base\DB::get(); - $stmt = $db->sql( 'SELECT * FROM {{templatemodel}}'. - ' WHERE templateid={templateid}'. - ' AND projectmodelid={modelid}' ); + $stmt = $db->sql( <<<SQL + SELECT {{templatemodel}}.*,{{value}}.text FROM {{templatemodel}} + LEFT JOIN {{value}} + ON {{value}}.contentid = {{templatemodel}}.contentid AND {{value}}.active = 1 + WHERE templateid = {templateid} + AND projectmodelid = {modelid} +SQL +); $stmt->setInt( 'templateid',$this->templateid ); $stmt->setInt( 'modelid' ,$this->modelid ); $row = $stmt->getRow(); - if ( isset($row['id']) ) + if ( $row ) { - $this->templatemodelid = $row['id']; + $this->templatemodelid = $row['id' ]; $this->extension = $row['extension']; - $this->src = $row['text']; + $this->src = $row['text' ]; + $this->contentid = $row['contentid']; } else { @@ -75,6 +85,16 @@ class TemplateModel extends ModelBase + public function loadForPublic() { + $this->load(); + + $value = new Value(); + $value->contentid = $this->contentid; + $value->loadPublished(); + $this->src = $value->text; + } + + public function isPersistent() { return intval( $this->templatemodelid ) > 0; @@ -88,17 +108,23 @@ class TemplateModel extends ModelBase public function save() { // Vorlagen-Quelltext existiert für diese Varianten schon. - $stmt = Db::sql( 'UPDATE {{templatemodel}}'. - ' SET extension={extension},'. - ' text={src} '. - ' WHERE id={id}' ); + $stmt = Db::sql( <<<SQL + UPDATE {{templatemodel}} + SET extension={extension} + WHERE id={id} +SQL + ); $stmt->setInt ( 'id' ,$this->templatemodelid ); - $stmt->setString( 'extension' ,$this->extension ); - $stmt->setString( 'src' ,$this->src ); $stmt->execute(); + + $value = new Value(); + $value->contentid = $this->contentid; + $value->text = $this->src; + $value->publish = true; + $value->persist(); } @@ -111,15 +137,19 @@ class TemplateModel extends ModelBase $stmt = Db::sql('SELECT MAX(id) FROM {{templatemodel}}'); $nextid = intval($stmt->getOne())+1; + $content = new Content(); + $content->persist(); + $this->contentid = $content->getId(); + $stmt = Db::sql( 'INSERT INTO {{templatemodel}}'. - ' (id,templateid,projectmodelid,extension,text) '. - ' VALUES ({id},{templateid},{modelid},{extension},{src}) '); + ' (id,contentid,templateid,projectmodelid,extension) '. + ' VALUES ({id},{contentid},{templateid},{modelid},{extension}) '); $stmt->setInt ( 'id',$nextid ); $stmt->setString( 'extension' ,$this->extension ); + $stmt->setInt ( 'contentid' ,$this->contentid ); $stmt->setInt ( 'templateid' ,$this->templateid ); $stmt->setInt ( 'modelid' ,$this->modelid ); - $stmt->setString( 'src' ,$this->src ); $stmt->execute(); @@ -135,9 +165,15 @@ class TemplateModel extends ModelBase public function delete() { $db = \cms\base\DB::get(); - - $stmt = $db->sql( 'DELETE FROM {{templatemodel}}'. - ' WHERE id={id}' ); + + $content = new Content( $this->contentid ); + $content->delete(); + + $stmt = $db->sql(<<<SQL + DELETE FROM {{templatemodel}} + WHERE id={id} +SQL + ); $stmt->setInt( 'id',$this->templatemodelid ); $stmt->execute(); } diff --git a/modules/cms/model/Value.class.php b/modules/cms/model/Value.class.php @@ -16,31 +16,10 @@ use util\Transformer; use util\Code; use util\cache\FileCache; -// OpenRat Content Management System -// Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - - /** * Darstellen einer Inhaltes * - * @version $Revision$ - * @author $Author$ - * @package openrat.objects + * @author Jan Dankert */ class Value extends ModelBase @@ -52,6 +31,12 @@ class Value extends ModelBase var $valueid=0; /** + * Content ID. + * @var int + */ + public $contentid; + + /** * Seiten-Objekt der ?bergeordneten Seite * @type Page */ @@ -105,7 +90,13 @@ class Value extends ModelBase * @type String */ var $value; - + + /** + * file blob + * @var string + */ + public $file = null; + /** * TimeStamp der letzten Aenderung * @type Integer @@ -165,75 +156,45 @@ class Value extends ModelBase */ function __construct() { - $this->lastchangeUserId = 0; - $this->lastchangeTimeStamp = 0; - } - + + /** * Laden des aktuellen Inhaltes aus der Datenbank */ - function loadForPublic() + public function loadPublished() { $stmt = Db::sql( <<<SQL - SELECT * FROM {{value}} - WHERE elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} - AND publish =1 + SELECT * FROM {{value}} + WHERE contentid = {contentid} + AND publish = 1 SQL ); - $stmt->setInt( 'elementid' ,$this->elementid ); - $stmt->setInt( 'pageid' ,$this->pageid ); - $stmt->setInt( 'languageid',$this->languageid); - $row = $stmt->getRow(); - - if ( count($row) > 0 ) // Wenn Inhalt gefunden - { - $this->text = $row['text' ]; - $this->format = $row['format']; - $this->valueid = intval($row['id'] ); - $this->linkToObjectId = intval($row['linkobjectid']); - $this->number = intval($row['number' ]); - $this->date = intval($row['date' ]); - - $this->active = ( $row['active' ]=='1' ); - $this->publish = ( $row['publish']=='1' ); - - $this->lastchangeTimeStamp = intval($row['lastchange_date' ]); - $this->lastchangeUserId = intval($row['lastchange_userid']); - } + $stmt->setInt( 'contentid' ,$this->contentid); + + $this->bindRow( $stmt->getRow() ); } - /** - * Laden des aktuellen Inhaltes aus der Datenbank - */ - function load() - { - $stmt = Db::sql( <<<SQL - SELECT * FROM {{value}} - WHERE elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} - AND active=1 -SQL - ); - $stmt->setInt( 'elementid' ,$this->elementid ); - $stmt->setInt( 'pageid' ,$this->pageid ); - $stmt->setInt( 'languageid',$this->languageid); - $row = $stmt->getRow(); - if ( count($row) > 0 ) // Wenn Inhalt gefunden + private function bindRow( $row ) { + + if ( $row ) // Wenn Inhalt gefunden { $this->text = $row['text' ]; + $this->file = $row['file' ]; $this->format = $row['format']; $this->valueid = intval($row['id'] ); $this->linkToObjectId = intval($row['linkobjectid']); $this->number = intval($row['number' ]); $this->date = intval($row['date' ]); + $storeValueAsBase64 = DB::get()->conf['base64']; + + if ( $storeValueAsBase64 ) + $this->file = base64_decode( $this->file ); + $this->active = ( $row['active' ]=='1' ); $this->publish = ( $row['publish']=='1' ); @@ -244,238 +205,74 @@ SQL /** - * Laden eines bestimmten Inhaltes aus der Datenbank - */ - function loadWithId( $valueid = null ) - { - if ( $valueid ) - $this->valueid = $valueid; - - $sql = DB::sql( <<<SQL - SELECT {{value}}.*,{{user}}.name as lastchange_username - FROM {{value}} - LEFT JOIN {{user}} ON {{user}}.id={{value}}.lastchange_userid - WHERE {{value}}.id={valueid} -SQL - ); - $sql->setInt( 'valueid',$this->valueid); - $row = $sql->getRow(); - - $this->text = $row['text' ]; - $this->format = $row['format' ]; - $this->pageid = intval($row['pageid' ]); - $this->elementid = intval($row['elementid' ]); - $this->languageid = intval($row['languageid' ]); - $this->valueid = intval($row['id' ]); - $this->linkToObjectId = intval($row['linkobjectid']); - $this->number = intval($row['number' ]); - $this->date = intval($row['date' ]); - - $this->active = ( $row['active' ]=='1' ); - $this->publish = ( $row['publish']=='1' ); - - $this->lastchangeTimeStamp = intval($row['lastchange_date' ]); - $this->lastchangeUserId = intval($row['lastchange_userid' ]); - $this->lastchangeUserName = $row['lastchange_username']; - } - - - /** - * Alle Versionen des aktuellen Inhaltes werden ermittelt - * @return array - */ - function getVersionList() - { - $stmt = DB::sql( <<<SQL - SELECT {{value}}.*,{{user}}.name as lastchange_username - FROM {{value}} - LEFT JOIN {{user}} ON {{user}}.id={{value}}.lastchange_userid - WHERE elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} - ORDER BY lastchange_date -SQL - ); - $stmt->setInt( 'elementid' ,$this->element->elementid ); - $stmt->setInt( 'pageid' ,$this->pageid ); - $stmt->setInt( 'languageid',$this->languageid); - - $list = array(); - foreach($stmt->getAll() as $row ) - { - $val = new Value(); - $val->valueid = $row['id']; - - $val->text = $row['text']; - $val->format = $row['format']; - $val->valueid = intval($row['id'] ); - $val->linkToObjectId = intval($row['linkobjectid']); - $val->number = intval($row['number' ]); - $val->date = intval($row['date' ]); - $val->element = $this->element; - $val->elementid = $this->elementid; - $val->languageid = $this->languageid; - - $val->active = ( $row['active' ]=='1' ); - $val->publish = ( $row['publish']=='1' ); - - $val->lastchangeTimeStamp = intval($row['lastchange_date' ]); - $val->lastchangeUserId = intval($row['lastchange_userid' ]); - $val->lastchangeUserName = $row['lastchange_username']; - - $list[] = $val; - } - return $list; - } - - - /** - * Die Anzahl der Versionen des aktuellen Inhaltes wird ermittelt - * @return array + * Loading the last value from the database. */ - function getCountVersions() + public function load() { - $sql = DB::sql( <<<SQL -SELECT COUNT(*) FROM {{value}} - WHERE elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} -SQL - ); - $sql->setInt( 'elementid' ,$this->element->elementid ); - $sql->setInt( 'pageid' ,$this->pageid ); - $sql->setInt( 'languageid',$this->languageid); - - return $sql->getOne(); - } - - - function getLastChangeTime() - { - $sql = DB::sql( <<<SQL - SELECT lastchange_date FROM {{value}} - WHERE elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} - ORDER BY id DESC + $stmt = Db::sql( <<<SQL + SELECT * FROM {{value}} + WHERE contentid = {contentid} + AND {{value}}.active = 1 SQL ); - $sql->setInt( 'elementid' ,$this->element->elementid ); - $sql->setInt( 'pageid' ,$this->pageid ); - $sql->setInt( 'languageid',$this->languageid); + $stmt->setInt( 'contentid' ,$this->contentid); - return $sql->getOne(); + $this->bindRow( $stmt->getRow() ); } /** - * Gets the last change date by another user since a specific date. - * @param $date - * @param $userid - * @return String + * Laden eines bestimmten Inhaltes aus der Datenbank */ - public function getLastChangeSinceByAnotherUser( $date, $userid ) + function loadWithId( $valueid = null ) { - $sql = Db::sql( <<<SQL - SELECT lastchange_date FROM {{value}} - WHERE elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} - AND lastchange_date > {date} - AND lastchange_userid != {userid} - ORDER BY id DESC + $stmt = Db::sql( <<<SQL + SELECT * FROM {{value}} + WHERE id = {{valueid}} SQL ); - $sql->setInt( 'elementid' ,$this->element->elementid ); - $sql->setInt( 'pageid' ,$this->pageid ); - $sql->setInt( 'languageid',$this->languageid); - $sql->setInt( 'date' ,$date ); - $sql->setInt( 'userid' ,$userid); + $stmt->setInt( 'valueid' ,$valueid ); - return $sql->getOne(); + $this->bindRow( $stmt->getRow() ); } - /** - * Inhalt freigeben + * @see #save() */ - function release() + protected function add() { - $sql = DB::sql( <<<SQL - UPDATE {{value}} - SET publish = 0 - WHERE elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} -SQL - ); - $sql->setInt( 'elementid' ,$this->elementid ); - $sql->setInt( 'pageid' ,$this->pageid ); - $sql->setInt( 'languageid',$this->languageid); - - $sql->execute(); - - $sql = Db::sql( <<<SQL - UPDATE {{value}} - SET publish = 1 - WHERE active = 1 - AND elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} -SQL - ); - $sql->setInt( 'elementid' ,$this->elementid ); - $sql->setInt( 'pageid' ,$this->pageid ); - $sql->setInt( 'languageid',$this->languageid); - - $sql->execute(); + // this is implemented in the save() method. } /** - * No function, values are NOT updated, values are only added. - * @return name|void + * Saving the value. + * A value is always added, never overwritten. So we are doing an INSERT here. */ protected function save() { - // not implemented, values are only added ("copy on write") - } - - /** - * Inhalt speichern - */ - public function add() - { $stmt = Db::sql( <<<SQL UPDATE {{value}} SET active=0 - WHERE elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} + WHERE contentid = {contentid} SQL ); - $stmt->setInt( 'elementid' ,$this->element->elementid ); - $stmt->setInt( 'pageid' ,$this->pageid ); - $stmt->setInt( 'languageid',$this->languageid); + $stmt->setInt( 'contentid' ,$this->contentid ); $stmt->execute(); if ( $this->publish ) { // Wenn Inhalt sofort veroeffentlicht werden kann, dann - // alle anderen Inhalte auf nicht-veroeffentlichen stellen + // alle anderen Inhalte auf nicht-veroeffentlichen stellen $stmt = DB::sql( <<<SQL UPDATE {{value}} SET publish=0 - WHERE elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} + WHERE contentid = {contentid} SQL ); - $stmt->setInt( 'elementid' ,$this->element->elementid ); - $stmt->setInt( 'pageid' ,$this->pageid ); - $stmt->setInt( 'languageid',$this->languageid); + $stmt->setInt( 'contentid' ,$this->contentid ); $stmt->execute(); } @@ -486,15 +283,13 @@ SQL $stmt = DB::sql( <<<SQL INSERT INTO {{value}} - (id ,linkobjectid ,text ,number ,date ,elementid ,format ,pageid ,languageid ,active,publish ,lastchange_date ,lastchange_userid ) - VALUES ({valueid},{linkobjectid},{text},{number},{date},{elementid},{format},{pageid},{languageid},1 ,{publish},{lastchange_date},{lastchange_userid}) + (id ,contentid ,linkobjectid ,text ,file ,number ,date ,format ,active,publish ,lastchange_date ,lastchange_userid ) + VALUES ({valueid},{contentid},{linkobjectid},{text},{file},{number},{date},{format},1 ,{publish},{lastchange_date},{lastchange_userid}) SQL ); $stmt->setInt( 'valueid' ,$this->valueid ); + $stmt->setInt( 'contentid' ,$this->contentid ); $stmt->setInt( 'format' ,$this->format ); - $stmt->setInt( 'elementid' ,$this->element->elementid ); - $stmt->setInt( 'pageid' ,$this->pageid ); - $stmt->setInt( 'languageid',$this->languageid ); if ( intval($this->linkToObjectId)==0) $stmt->setNull ( 'linkobjectid' ); @@ -512,210 +307,88 @@ SQL $stmt->setNull ( 'date' ); else $stmt->setInt ( 'date',$this->date ); + $storeValueAsBase64 = DB::get()->conf['base64']; + + if ( $storeValueAsBase64 ) + $this->value = base64_decode( $this->value ); + + + if ( $this->file === null ) + $stmt->setNull ( 'file' ); + elseif( $storeValueAsBase64 ) + $stmt->setString( 'file',base64_encode($this->file) ); + else + $stmt->setString( 'file',$this->file ); + $stmt->setBoolean( 'publish' ,$this->publish ); $stmt->setInt ( 'lastchange_date' ,Startup::now() ); $user = \util\Session::getUser(); $stmt->setInt ( 'lastchange_userid',$user->userid ); $stmt->execute(); - - // Nur ausfuehren, wenn in Konfiguration aktiviert. - $limit = Configuration::subset(['content','revision-limit'] ); - if ( $limit->is('enabled',false) ) - $this->checkLimit(); + + $this->pruneVersions(); } - + + // Some default values for pruning content + const DEFAULT_PRUNE_AFTER_AGE = 10 * 365 * 24 * 60 * 60; // prune after 10 years + const DEFAULT_PRUNE_AFTER_VERSIONS = 100; // prune after reaching 100 versions + /** - * Pruefen, ob maximale Anzahl von Versionen erreicht. - * In diesem Fall die zu alten Versionen l�schen. + * Automatic content pruning. + * + * Deletes old versions. */ - function checkLimit() + private function pruneVersions() { - $limitConfig = Configuration::subset(['content','revision-limit']); + $pruneConfig = Configuration::subset(['content','prune']); + if ( ! $pruneConfig->is('enabled',true) ) + return; // no pruning. + + // First Step: Reading all value id. $sql = DB::sql( <<<SQL SELECT id FROM {{value}} - WHERE elementid = {elementid} - AND pageid = {pageid} - AND languageid = {languageid} + WHERE contentid = {contentid} AND active = 0 AND publish = 0 ORDER BY id SQL ); - $sql->setInt( 'elementid' ,$this->element->elementid ); - $sql->setInt( 'pageid' ,$this->pageid ); - $sql->setInt( 'languageid',$this->languageid ); + $sql->setInt( 'contentid' ,$this->contentid ); $values = $sql->getCol(); - - if ( count($values) > $limitConfig->get('min-revisions',3) ) - { - $sql = DB::sql( <<<SQL - DELETE FROM {{value}} - WHERE elementid = {elementid} - AND pageid = {pageid} - AND languageid = {languageid} - AND active = 0 - AND publish = 0 - AND lastchange_date < {min_date} - AND id < {min_id} -SQL - ); - $sql->setInt( 'elementid' ,$this->element->elementid ); - $sql->setInt( 'pageid' ,$this->pageid ); - $sql->setInt( 'languageid',$this->languageid ); - $sql->setInt( 'min_date' ,$limitConfig['max-age']*24*60*60); - $sql->setInt( 'min_id' ,$values[count($values)-$limitConfig['min-revisions']]); - $sql->execute(); - } - - if ( count($values) > $limitConfig->get('max-revisions',100 ) ) - { - $sql = Db::sql( <<<SQL - DELETE FROM {{value}} - WHERE elementid = {elementid} - AND pageid = {pageid} - AND languageid = {languageid} - AND active = 0 - AND publish = 0 - AND lastchange_date < {min_date} - AND id < {min_id} -SQL - ); - $sql->setInt( 'elementid' ,$this->element->elementid ); - $sql->setInt( 'pageid' ,$this->pageid ); - $sql->setInt( 'languageid',$this->languageid ); - $sql->setInt( 'min_date' ,$limitConfig['min-age']*24*60*60); - $sql->setInt( 'min_id' ,$values[count($values)-$limitConfig['max-revisions']]); - $sql->execute(); - } - } - - - /** - * Diesen Inhalt loeschen - */ - function delete() - { - $stmt = DB::sql( <<<SQL - DELETE * FROM {{value}} - WHERE elementid ={elementid} - AND pageid ={pageid} - AND languageid={languageid} + // Now deleting all outdated content. + $sql = DB::sql( <<<SQL + DELETE FROM {{value}} + WHERE contentid = {contentid} + AND active = 0 + AND publish = 0 + AND lastchange_date < {delete_before_date} + AND id < {delete_before_id} SQL ); - $stmt->setInt( 'elementid' ,$this->element->elementid ); - $stmt->setInt( 'pageid' ,$this->pageid ); - $stmt->setInt( 'languageid',$this->languageid); - - $stmt->execute(); + $sql->setInt( 'contentid' ,$this->contentid ); + $sql->setInt( 'delete_before_date' ,time() - $pruneConfig->getSeconds('age',self::DEFAULT_PRUNE_AFTER_AGE) ); + $sql->setInt( 'delete_before_id' ,intval(@$values[count($values)-$pruneConfig->get('versions',self::DEFAULT_PRUNE_AFTER_VERSIONS)]) ); + $sql->execute(); } /** - * Es werden Objekte mit einem Inhalt gesucht. - * @param String Suchbegriff - * @return array Liste der gefundenen Objekt-IDs - */ - function getObjectIdsByValue( $text ) + * Deleting (not possible). + */ + function delete() { - $sql = DB::sql( <<<SQL - SELECT {{object}}.id FROM {{value}} - LEFT JOIN {{page}} - ON {{page}}.id={{value}}.pageid - LEFT JOIN {{object}} - ON {{object}}.id={{page}}.objectid - WHERE {{value}}.text LIKE {text} - AND {{value}}.languageid={languageid} - ORDER BY {{object}}.lastchange_date DESC -SQL - ); - - $sql->setInt ( 'languageid',$this->languageid ); - $sql->setString( 'text' ,'%'.$text.'%' ); - - return $sql->getCol(); + // values cannot be deleted. + // only the whole content is able to be deleted, see class Content. } - /** - * Es werden Objekte mit einer UserId ermittelt - * @param Integer Benutzer-Id der letzten ?nderung - * @return array Liste der gefundenen Objekt-IDs - */ - function getObjectIdsByLastChangeUserId( $userid ) - { - $sql = DB::sql( <<<SQL - SELECT {{object}}.id FROM {{value}} - LEFT JOIN {{page}} - ON {{page}}.id={{value}}.pageid - LEFT JOIN {{object}} - ON {{object}}.id={{page}}.objectid - WHERE {{value}}.lastchange_userid={userid} - AND {{value}}.languageid={languageid} - ORDER BY {{object}}.lastchange_date DESC -SQL - ); - $sql->setInt ( 'languageid',$this->languageid ); - $sql->setInt ( 'userid' ,$userid ); - - return $sql->getCol(); - } - - /** - * Es wird das Objekt ermittelt, welches der Benutzer zuletzt ge�ndert hat. - * - * @return Integer Objekt-Id - */ - public static function getLastChangedObjectByUserId( $userid ) - { - $sql = DB::sql( <<<SQL -SELECT {{object}}.id - FROM {{value}} - LEFT JOIN {{page}} - ON {{page}}.id={{value}}.pageid - LEFT JOIN {{object}} - ON {{object}}.id={{page}}.objectid - WHERE {{value}}.lastchange_userid={userid} - ORDER BY {{value}}.lastchange_date DESC -SQL -); - $sql->setInt ( 'userid' ,$userid ); - return $sql->getOne(); - } - - - /** - * Es wird das Objekt ermittelt, welches der Benutzer zuletzt ge�ndert hat. - * - * @return Integer Objekt-Id - */ - public static function getLastChangedObjectInProjectByUserId( $projectid, $userid ) - { - $sql = DB::sql( <<<SQL -SELECT {{object}}.id - FROM {{value}} - LEFT JOIN {{page}} - ON {{page}}.id={{value}}.pageid - LEFT JOIN {{object}} - ON {{object}}.id={{page}}.objectid - WHERE {{value}}.lastchange_userid={userid} - AND {{object}}.projectid = {projectid} - ORDER BY {{value}}.lastchange_date DESC -SQL -); - $sql->setInt ( 'userid' ,$userid ); - $sql->setInt ( 'projectid' ,$projectid ); - return $sql->getOne(); - } - - - /** * Ermittelt den unbearbeiteten, "rohen" Inhalt. * * @return mixed Inhalt diff --git a/modules/cms/status/Status.class.php b/modules/cms/status/Status.class.php @@ -0,0 +1,256 @@ +<?php + +namespace cms\status; + +use BadMethodCallException; +use cms\action\RequestParams; +use cms\base\Configuration; +use cms\base\DB; +use cms\base\DefaultConfig; +use cms\base\Startup; +use cms\Dispatcher; +use cms\update\Update; +use configuration\Config; +use configuration\ConfigurationLoader; +use database\Database; +use Exception; +use util\Http; +use logger\Logger; +use \util\exception\ObjectNotFoundException; +use util\exception\UIException; +use util\exception\SecurityException; +use util\json\JSON; +use util\Session; +use util\XML; +use util\YAML; + +/** + * Actuator. + */ +class Status +{ + /** + * Getting the state + */ + public static function execute() + { + $cmd = $_SERVER['QUERY_STRING']; + $data = []; + $success = false; + + switch( $cmd ) { + case '': + case 'health': + case 'status': + case 'state': + + $data['state'] = 'UP'; + $success = true; + break; + + case 'db': + case 'database': + + $config = new Config( self::getConfiguration() ); + $databases = []; + foreach( $config->subset('database')->subsets() as $dbName => $dbConfig ) { + + if (!$dbConfig->is('enabled', true)) { + $dbState = [ + 'state' => 'DISABLED', + ]; + + } else { + + try { + $db = new Database($dbConfig->subset('read')->getConfig() + $dbConfig->getConfig()); + + $update = new Update(); + + if ( $update->isUpdateRequired( $db ) ) + $dbState = [ + 'state' => 'UP', + ]; + else + $dbState = [ + 'state' => 'DOWN', + 'message' => 'NEEDS UPGRADE', + ]; + + $db->disconnect(); + + } catch (\Exception $e) { + $dbState = [ + 'state' => 'DOWN', + 'message' => $e->getMessage(), + ]; + } + + } + + $databases[$dbName] = $dbState; + } + + $data['databases'] = $databases; + $success = true; + break; + + case 'upgrade': + case 'update': + case 'install': + + $config = new Config( self::getConfiguration() ); + $databases = []; + foreach( $config->subset('database')->subsets() as $dbName => $dbConfig ) { + + $dbState = []; + + if (!$dbConfig->is('enabled', true)) { + $dbState = [ + 'state' => 'DISABLED', + ]; + + } else { + + try { + $adminDb = new Database($dbConfig->subset('admin')->getConfig() + $dbConfig->getConfig()); + $adminDb->id = $dbName; + + $updater = new Update(); + + if ( ! $updater->isUpdateRequired( $adminDb ) ) { + $dbState = [ + 'state' => 'UP', + ]; + } + else { + + if (!$dbConfig->is('auto_update', true)) + $dbState = [ + 'state' => 'DOWN', + 'message' => 'DB Update required, but auto-update is disabled. ' . Startup::TITLE . " " . Startup::VERSION . " needs DB-version " . Update::SUPPORTED_VERSION + ]; + else { + $updater->update($adminDb); + + // Try to close the PDO connection. PDO doc: + // To close the connection, you need to destroy the object by ensuring that all + // remaining references to it are deleted—you do this by assigning NULL to the variable that holds the object. + // If you don't do this explicitly, PHP will automatically close the connection when your script ends. + $adminDb = null; + unset($adminDb); + + $dbState = [ + 'state' => 'UP', + 'message' => 'Updated', + ]; + } + } + + + } catch (\Exception $e) { + $dbState = [ + 'state' => 'DOWN', + 'message' => $e->getMessage(), + ]; + } + + } + + $databases[$dbName] = $dbState; + } + + $data['databases'] = $databases; + $success = true; + break; + + case 'info': + $data = [ + 'version' => Startup::VERSION, + 'date' => Startup::DATE, + 'name' => Startup::TITLE, + 'api' => Startup::API_LEVEL, + ]; + $success = true; + break; + + case 'system': + $data = [ + 'interpreter' => PHP_VERSION, + 'os' => PHP_OS, + 'usage' => getrusage(), + 'memory' => [ + 'allocated' => memory_get_usage(true), + 'used' => memory_get_usage(), + 'peak_allocated' => memory_get_peak_usage(true), + 'peak_used' => memory_get_peak_usage(), + + ], + ]; + $success = true; + break; + + case 'env': + case 'environment': + if ( version_compare(PHP_VERSION,'7.1','>=') ) + $data['environment'] = getenv(); // since PHP 7.1 + $success = true; + break; + + case 'server': + $data['server'] = $_SERVER; + $success = true; + break; + + case 'extensions': + $data['extensions'] = get_loaded_extensions(); + $success = true; + break; + + case 'config': + case 'configuration': + + $data['configuration'] = self::getConfiguration(); + $success = true; + + break; + + default: + } + + // Be safe! We must clear secret values. + array_walk_recursive($data, function(&$value,$key) { + if ( stripos($key,'secret' ) !== FALSE || + stripos($key,'password') !== FALSE || + stripos($key,'pass' ) !== FALSE ) + $value = '**********'; + }); + + + header('Content-Type: application/json; charset=UTF-8'); + $output = JSON::encode($data); + + if (!headers_sent()) { + // HTTP Spec: + // "Applications SHOULD use this field to indicate the transfer-length of the + // message-body, unless this is prohibited by the rules in section 4.4." + // + // And the overhead of 'Transfer-Encoding: chunked' is eliminated... + header('HTTP/1.0 ' . ($success ? '200 OK' : '503 Internal Server Error') ); + header('Content-Length: ' . strlen($output)); + + } + + echo $output; + } + + + private static function getConfiguration() { + $configFile = getenv( 'CMS_CONFIG_FILE' ); + if ( ! $configFile ) + $configFile = Startup::DEFAULT_CONFIG_FILE; + + $configLoader = new ConfigurationLoader( $configFile ); + return $configLoader->load(); + } +} diff --git a/modules/cms/update/Update.class.php b/modules/cms/update/Update.class.php @@ -12,7 +12,7 @@ use logger\Logger; class Update { // This is the required DB version: - const SUPPORTED_VERSION = 28; + const SUPPORTED_VERSION = 31; // -----------------------^^----------------------------- const STATUS_UPDATE_PROGRESS = 0; diff --git a/modules/cms/update/version/DBVersion000001.class.php b/modules/cms/update/version/DBVersion000001.class.php @@ -27,7 +27,7 @@ class DBVersion000001 extends DbVersion $table->column('content_negotiation')->type(Column::TYPE_INT )->size( 1)->defaultValue( 0)->add(); $table->column('cut_index' )->type(Column::TYPE_INT )->size( 1)->defaultValue( 0)->add(); - $table->addPrimaryKey('id'); + $table->addPrimaryKey(); $table->addIndex('name'); @@ -41,12 +41,12 @@ class DBVersion000001 extends DbVersion $table->column('descr')->type(Column::TYPE_VARCHAR)->size(255)->add(); $table->column('style')->type(Column::TYPE_VARCHAR)->size(64)->add(); $table->column('is_admin')->type(Column::TYPE_INT)->size(1)->defaultValue(0)->add(); - $table->addPrimaryKey('id'); + $table->addPrimaryKey(); $table->addUniqueIndex('name'); $table = $this->table('group')->add(); $table->column('name')->type(Column::TYPE_VARCHAR)->size(100)->add(); - $table->addPrimaryKey('id'); + $table->addPrimaryKey(); $table->addUniqueIndex('name'); $table = $this->table('object')->add(); @@ -62,10 +62,10 @@ class DBVersion000001 extends DbVersion $table->column('is_file')->type(Column::TYPE_INT)->size(1)->add(); $table->column('is_page')->type(Column::TYPE_INT)->size(1)->add(); $table->column('is_link')->type(Column::TYPE_INT)->size(1)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('projectid', 'project', 'id'); - $table->addConstraint('lastchange_userid', 'user', 'id'); - $table->addConstraint('create_userid', 'user', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('projectid', 'project'); + $table->addConstraint('lastchange_userid', 'user'); + $table->addConstraint('create_userid', 'user'); $table->addIndex('parentid'); $table->addIndex('projectid'); @@ -84,8 +84,8 @@ class DBVersion000001 extends DbVersion $table = $this->table('template')->add(); $table->column('projectid')->type(Column::TYPE_INT)->add(); $table->column('name')->type(Column::TYPE_VARCHAR)->size(50)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('projectid', 'project', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('projectid', 'project'); $table->addIndex('projectid'); $table->addIndex('name'); @@ -98,8 +98,8 @@ class DBVersion000001 extends DbVersion $table->column('isocode')->type(Column::TYPE_VARCHAR)->size(10)->add(); $table->column('name')->type(Column::TYPE_VARCHAR)->size(50)->add(); $table->column('is_default')->type(Column::TYPE_INT)->size(1)->defaultValue(0)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('projectid', 'project', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('projectid', 'project'); $table->addUniqueIndex(['projectid','isocode']); @@ -108,9 +108,9 @@ class DBVersion000001 extends DbVersion $table = $this->table('page')->add(); $table->column('objectid')->type(Column::TYPE_INT)->size(0)->add(); $table->column('templateid')->type(Column::TYPE_INT)->size(0)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('templateid', 'template', 'id'); - $table->addConstraint('objectid', 'object', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('templateid', 'template'); + $table->addConstraint('objectid', 'object'); $table->addUniqueIndex('objectid'); $table->addIndex('templateid'); @@ -123,8 +123,8 @@ class DBVersion000001 extends DbVersion $table->column('name')->type(Column::TYPE_VARCHAR)->size(50)->add(); $table->column('extension')->type(Column::TYPE_VARCHAR)->size(10)->nullable()->add(); $table->column('is_default')->type(Column::TYPE_INT)->size(1)->defaultValue(0)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('projectid', 'project', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('projectid', 'project'); $table->addIndex('projectid'); $table->addUniqueIndex(['projectid','name'] ); @@ -149,10 +149,10 @@ class DBVersion000001 extends DbVersion $table->column('default_text')->type(Column::TYPE_TEXT)->nullable()->add(); $table->column('folderobjectid')->type(Column::TYPE_INT)->nullable()->add(); $table->column('default_objectid')->type(Column::TYPE_INT)->nullable()->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('default_objectid', 'object', 'id'); - $table->addConstraint('folderobjectid', 'object', 'id'); - $table->addConstraint('templateid', 'template', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('default_objectid', 'object'); + $table->addConstraint('folderobjectid', 'object'); + $table->addConstraint('templateid', 'template'); $table->addIndex('templateid'); $table->addIndex('name'); @@ -166,8 +166,8 @@ class DBVersion000001 extends DbVersion $table->column('extension')->type(Column::TYPE_VARCHAR)->size(10)->add(); $table->column('size')->type(Column::TYPE_INT)->size(0)->add(); $table->column('value')->type(Column::TYPE_BLOB)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('objectid', 'object', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('objectid', 'object'); $table->addUniqueIndex('objectid'); @@ -175,8 +175,8 @@ class DBVersion000001 extends DbVersion $table = $this->table('folder')->add(); $table->column('objectid')->type(Column::TYPE_INT)->size(0)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('objectid', 'object', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('objectid', 'object'); $table->addUniqueIndex('objectid'); @@ -188,9 +188,9 @@ class DBVersion000001 extends DbVersion $table->column('objectid')->type(Column::TYPE_INT)->size(0)->add(); $table->column('link_objectid')->type(Column::TYPE_INT)->nullable()->add(); $table->column('url')->type(Column::TYPE_VARCHAR)->size(255)->nullable()->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('objectid', 'object', 'id'); - $table->addConstraint('link_objectid', 'object', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('objectid', 'object'); + $table->addConstraint('link_objectid', 'object'); $table->addUniqueIndex('objectid'); $table->addIndex('link_objectid'); @@ -204,9 +204,9 @@ class DBVersion000001 extends DbVersion $table->column('name')->type(Column::TYPE_VARCHAR)->size(255)->add(); $table->column('descr')->type(Column::TYPE_VARCHAR)->size(255)->add(); $table->column('languageid')->type(Column::TYPE_INT)->size(0)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('objectid', 'object', 'id'); - $table->addConstraint('languageid', 'language', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('objectid', 'object'); + $table->addConstraint('languageid', 'language'); $table->addIndex('objectid'); $table->addIndex('languageid'); @@ -221,9 +221,9 @@ class DBVersion000001 extends DbVersion $table->column('projectmodelid')->type(Column::TYPE_INT)->size(0)->add(); $table->column('extension')->type(Column::TYPE_VARCHAR)->size(10)->nullable()->add(); $table->column('text')->type(Column::TYPE_TEXT)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('templateid', 'template', 'id'); - $table->addConstraint('projectmodelid', 'projectmodel', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('templateid', 'template'); + $table->addConstraint('projectmodelid', 'projectmodel'); $table->addIndex('templateid'); $table->addUniqueIndex(['templateid','extension' ]); @@ -236,9 +236,9 @@ class DBVersion000001 extends DbVersion $table = $this->table('usergroup')->add(); $table->column('userid')->type(Column::TYPE_INT)->add(); $table->column('groupid')->type(Column::TYPE_INT)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('groupid', 'group', 'id'); - $table->addConstraint('userid', 'user', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('groupid', 'group'); + $table->addConstraint('userid', 'user'); $table->addIndex('groupid'); $table->addIndex('userid'); @@ -259,12 +259,12 @@ class DBVersion000001 extends DbVersion $table->column('lastchange_date')->type(Column::TYPE_INT)->size(0)->add(); $table->column('lastchange_userid')->type(Column::TYPE_INT)->nullable()->add(); $table->column('publish')->type(Column::TYPE_INT)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('pageid', 'page', 'id'); - $table->addConstraint('elementid', 'element', 'id'); - $table->addConstraint('languageid', 'language', 'id'); - $table->addConstraint('lastchange_userid', 'user', 'id'); - $table->addConstraint('linkobjectid', 'object', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('pageid', 'page'); + $table->addConstraint('elementid', 'element'); + $table->addConstraint('languageid', 'language'); + $table->addConstraint('lastchange_userid', 'user'); + $table->addConstraint('linkobjectid', 'object'); $table->addIndex('pageid'); $table->addIndex('languageid'); @@ -293,11 +293,11 @@ class DBVersion000001 extends DbVersion $table->column('is_publish')->type(Column::TYPE_INT)->size(1)->defaultValue(0)->add(); $table->column('is_grant')->type(Column::TYPE_INT)->size(1)->defaultValue(0)->add(); $table->column('is_transmit')->type(Column::TYPE_INT)->size(1)->defaultValue(0)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('groupid', 'group', 'id'); - $table->addConstraint('userid', 'user', 'id'); - $table->addConstraint('objectid', 'object', 'id'); - $table->addConstraint('languageid', 'language', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('groupid', 'group'); + $table->addConstraint('userid', 'user'); + $table->addConstraint('objectid', 'object'); + $table->addConstraint('languageid', 'language'); $table->addIndex('userid'); $table->addIndex('groupid'); diff --git a/modules/cms/update/version/DBVersion000002.class.php b/modules/cms/update/version/DBVersion000002.class.php @@ -21,7 +21,7 @@ class DBVersion000002 extends DbVersion $table->column('status' )->type(Column::TYPE_INT)->add(); $table->column('installed')->type(Column::TYPE_INT)->add(); - $table->addPrimaryKey ('id' ); + $table->addPrimaryKey (); $table->addIndex ('status'); $table->addUniqueIndex('version'); } diff --git a/modules/cms/update/version/DBVersion000009.class.php b/modules/cms/update/version/DBVersion000009.class.php @@ -29,8 +29,8 @@ class DBVersion000009 extends DbVersion $table->column('objectid')->type(Column::TYPE_INT)->size(0)->add(); $table->column('url')->type(Column::TYPE_VARCHAR)->size(255)->add(); - $table->addPrimaryKey('id'); - $table->addConstraint('objectid', 'object', 'id'); + $table->addPrimaryKey(); + $table->addConstraint('objectid', 'object'); $table->addUniqueIndex('objectid'); diff --git a/modules/cms/update/version/DBVersion000012.class.php b/modules/cms/update/version/DBVersion000012.class.php @@ -21,6 +21,6 @@ class DBVersion000012 extends DbVersion $table = $this->table('object'); $table->column('published_date' )->type(Column::TYPE_INT)->size(0)->nullable()->add(); $table->column('published_userid')->type(Column::TYPE_INT)->size(0)->nullable()->add(); - $table->addConstraint('published_userid', 'user', 'id'); + $table->addConstraint('published_userid', 'user'); } } \ No newline at end of file diff --git a/modules/cms/update/version/DBVersion000020.class.php b/modules/cms/update/version/DBVersion000020.class.php @@ -25,11 +25,11 @@ class DBVersion000020 extends DbVersion $table->column('link_objectid')->type(Column::TYPE_INT)->add(); - $table->addPrimaryKey ('id'); + $table->addPrimaryKey (); - $table->addConstraint ('objectid' ,'object' ,'id'); - $table->addConstraint ('languageid' ,'language','id'); - $table->addConstraint ('link_objectid','object' ,'id'); + $table->addConstraint ('objectid', 'object'); + $table->addConstraint ('languageid', 'language'); + $table->addConstraint ('link_objectid', 'object'); $table->addUniqueIndex('objectid'); $table->addUniqueIndex(['link_objectid','languageid']); diff --git a/modules/cms/update/version/DBVersion000021.class.php b/modules/cms/update/version/DBVersion000021.class.php @@ -30,9 +30,9 @@ class DBVersion000021 extends DbVersion $table->column('name' )->type(Column::TYPE_VARCHAR)->size(255 )->add(); - $table->addPrimaryKey ('id'); + $table->addPrimaryKey (); - $table->addConstraint ('userid' ,'user' ,'id'); + $table->addConstraint ('userid', 'user'); $table->addUniqueIndex('selector'); } diff --git a/modules/cms/update/version/DBVersion000024.class.php b/modules/cms/update/version/DBVersion000024.class.php @@ -21,6 +21,6 @@ class DBVersion000024 extends DbVersion $groupTable = $this->table('group'); $groupTable->column('parentid')->type(Column::TYPE_INT )->nullable()->add(); $groupTable->addIndex('parentid'); - $groupTable->addConstraint('parentid', 'group', 'id'); + $groupTable->addConstraint('parentid', 'group'); } } \ No newline at end of file diff --git a/modules/cms/update/version/DBVersion000025.class.php b/modules/cms/update/version/DBVersion000025.class.php @@ -19,6 +19,6 @@ class DBVersion000025 extends DbVersion public function update() { $objectTable = $this->table('object'); - $objectTable->addConstraint('parentid', 'object', 'id'); + $objectTable->addConstraint('parentid', 'object'); } } \ No newline at end of file diff --git a/modules/cms/update/version/DBVersion000029.class.php b/modules/cms/update/version/DBVersion000029.class.php @@ -0,0 +1,71 @@ +<?php + +namespace cms\update\version; + +use database\DbVersion; +use database\Column; +use security\Password; + +/** + * Migrate page value to content, so it becomes versionable. + * + * @author dankert + * + */ +class DBVersion000029 extends DbVersion +{ + /** + * + */ + public function update() + { + $contentTable = $this->table('content'); + $contentTable->add(); + $contentTable->addPrimaryKey(); + + $valueTable = $this->table('value'); + $valueTable->column('contentid')->nullable()->add(); + $valueTable->addConstraint('contentid','content'); + $valueTable->column('file')->type( Column::TYPE_BLOB )->nullable()->add(); + + $pageContentTable = $this->table('pagecontent'); + $pageContentTable->add(); + $pageContentTable->addPrimaryKey(); + $pageContentTable->column('pageid' )->add(); + $pageContentTable->column('elementid' )->add(); + $pageContentTable->column('languageid')->add(); + $pageContentTable->column('contentid' )->add(); + + $pageContentTable->addConstraint('pageid' , 'page' ); + $pageContentTable->addConstraint('elementid' , 'element' ); + $pageContentTable->addConstraint('languageid', 'language'); + $pageContentTable->addConstraint('contentid' , 'content' ); + + $db = $this->getDb(); + $stmt = $db->sql('SELECT * FROM '.$valueTable->getSqlName().' WHERE active=1' ); + $contentid = 0; + foreach($stmt->getAll() as $row ) + { + ++$contentid; + + $stmt = $db->sql('INSERT INTO '.$contentTable->getSqlName().' (id) VALUES('.$contentid.')'); + $stmt->execute(); + + $stmt = $db->sql('INSERT INTO '.$pageContentTable->getSqlName().' (id,pageid,elementid,languageid,contentid) VALUES('.$contentid.','.$row['pageid'].','.$row['elementid'].','.$row['languageid'].','.$contentid.')'); + $stmt->execute(); + + $stmt = $db->sql('UPDATE '.$valueTable->getSqlName().' SET contentid='.$contentid.' WHERE pageid='.$row['pageid'].' AND elementid='.$row['elementid'].' AND languageid='.$row['languageid'] ); + $stmt->execute(); + } + + $valueTable->dropConstraint('pageid'); + $valueTable->column('pageid' )->drop(); + + $valueTable->dropConstraint('elementid'); + $valueTable->column('elementid' )->drop(); + + $valueTable->dropConstraint('languageid'); + $valueTable->column('languageid')->drop(); + } +} + diff --git a/modules/cms/update/version/DBVersion000030.class.php b/modules/cms/update/version/DBVersion000030.class.php @@ -0,0 +1,56 @@ +<?php + +namespace cms\update\version; + +use cms\base\Startup; +use database\DbVersion; +use database\Column; +use security\Password; + +/** + * Migrate template models to a text content + * + * @author dankert + * + */ +class DBVersion000030 extends DbVersion +{ + /** + * + */ + public function update() + { + $contentTable = $this->table('content' ); + $valueTable = $this->table('value' ); + + $templateModelTable = $this->table('templatemodel' ); + $templateModelTable->column('contentid')->add(); + + $db = $this->getDb(); + $stmt = $db->sql('SELECT * FROM '.$templateModelTable->getSqlName() ); + + foreach($stmt->getAll() as $row ) // all templates should fit into memory. + { + $stmt = $db->sql('SELECT MAX(id) FROM '.$contentTable->getSqlName()); + $contentid = $stmt->getOne() + 1; + + $stmt = $db->sql('INSERT INTO '.$contentTable->getSqlName().' (id) VALUES('.$contentid.')') ; + $stmt->execute(); + + $stmt = $db->sql('SELECT MAX(id) FROM '.$valueTable->getSqlName()); + $valueid = $stmt->getOne() + 1; + + $stmt = $db->sql('INSERT INTO '.$valueTable->getSqlName().' (id,contentid,active,publish,text,lastchange_date) VALUES('.$valueid.','.$contentid.',1,1,{text},{time})'); + $stmt->setString( 'text', $row['text'] ); + $stmt->setInt ( 'time', Startup::getStartTime() ); + $stmt->execute(); + + $stmt = $db->sql('UPDATE '.$templateModelTable->getSqlName().' SET contentid='.$contentid.' WHERE id='.$row['id']); + $stmt->execute(); + } + + $templateModelTable->addConstraint('contentid' , 'content' ); + $templateModelTable->column('text')->drop(); + } +} + diff --git a/modules/cms/update/version/DBVersion000031.class.php b/modules/cms/update/version/DBVersion000031.class.php @@ -0,0 +1,60 @@ +<?php + +namespace cms\update\version; + +use cms\base\Startup; +use database\DbVersion; +use database\Column; +use security\Password; + +/** + * Migrate file values to content. + * + * @author dankert + * + */ +class DBVersion000031 extends DbVersion +{ + /** + * + */ + public function update() + { + $contentTable = $this->table('content' ); + $valueTable = $this->table('value' ); + + $fileTable = $this->table('file' ); + $fileTable->column('contentid')->add(); + + $db = $this->getDb(); + $stmt = $db->sql('SELECT id FROM '.$fileTable->getSqlName() ); + + foreach($stmt->getCol() as $fileid ) + { + $stmt = $db->sql('SELECT * FROM '.$fileTable->getSqlName().' WHERE id='.$fileid ); + $row = $stmt->getRow(); + + $stmt = $db->sql('SELECT MAX(id) FROM '.$contentTable->getSqlName() ); + $contentid = $stmt->getOne() + 1; + + $stmt = $db->sql('INSERT INTO '.$contentTable->getSqlName().' (id) VALUES('.$contentid.')') ; + $stmt->execute(); + + $stmt = $db->sql('SELECT MAX(id) FROM '.$valueTable->getSqlName() ); + $valueid = $stmt->getOne() + 1; + + $stmt = $db->sql('INSERT INTO '.$valueTable->getSqlName().' (id,contentid,active,publish,file,lastchange_date) VALUES('.$valueid.','.$contentid.',1,1,{file},{time})'); + $stmt->setString( 'file', $row['value'] ); + $stmt->setInt ( 'time', Startup::getStartTime() ); + $stmt->execute(); + + $stmt = $db->sql('UPDATE '.$fileTable->getSqlName().' SET contentid='.$contentid.' WHERE id='.$row['id']); + $stmt->execute(); + } + + $fileTable->addConstraint('contentid' , 'content' ); + $fileTable->column('value')->drop(); + + } +} + diff --git a/modules/configuration/Config.class.php b/modules/configuration/Config.class.php @@ -111,7 +111,7 @@ class Config */ public function get($name, $default = null) { - if (isset($this->config[$name])) { + if (isset($this->config[$name]) && !empty($this->config[$name])) { $value = $this->config[$name]; // if default-value is given, the type of the default-value is forced. @@ -132,7 +132,7 @@ class Config */ public function has($name) { - return isset($this->config[$name]); + return isset($this->config[$name]) && !empty($this->config[$name]); } diff --git a/modules/database/Table.class.php b/modules/database/Table.class.php @@ -80,7 +80,7 @@ class Table } - public function addPrimaryKey($columnNames) + public function addPrimaryKey($columnNames = 'id') { $table = $this->getSqlName(); @@ -129,7 +129,7 @@ class Table # param 1: column name # param 2: target table name # param 3: target column name - public function addConstraint($columnName, $targetTableName, $targetColumnName) + public function addConstraint($columnName, $targetTableName, $targetColumnName = 'id') { $targetTable = new Table($this->db,$this->dbmsType,$targetTableName); $targetTablename = $targetTable->getSqlName(); @@ -179,9 +179,14 @@ class Table } - public function dropConstraint($constraintName) + public function dropConstraint($columnName) { - $ddl = $this->db->sql('DROP CONSTRAINT ' . $constraintName . ';'); + + $constraintName = $this->tablePrefix . self::CONSTRAINT_PREFIX . '_' . $this->name . $this->tableSuffix . '_' . $columnName; + + $table = $this->getSqlName(); + // In MySQL, there’s no DROP CONSTRAINT, you have to use DROP FOREIGN KEY instead + $ddl = $this->db->sql('ALTER TABLE ' . $table . ' DROP FOREIGN KEY ' . $constraintName . ';'); $ddl->execute(); } diff --git a/modules/template_engine/Output.class.php b/modules/template_engine/Output.class.php @@ -25,7 +25,7 @@ class Output public static function escapeHtml($text) { - return Text::translateutf8tohtml(htmlentities($text)); + return Text::translateutf8tohtml(htmlentities($text, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 )); } /** diff --git a/modules/template_engine/components/template.xsd b/modules/template_engine/components/template.xsd @@ -1,1622 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns="http://www.openrat.de/template" - targetNamespace="http://www.openrat.de/template" xmlns:xsd="http://www.w3.org/2001/XMLSchema" - elementFormDefault="qualified" attributeFormDefault="unqualified"> - <!-- generated by XSDGenerator. do not change manually --> - <xsd:element name="button" type="buttonType"/> - <xsd:complexType name="buttonType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="type" type="xsd:string"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="src" type="xsd:string"/> - <xsd:attribute name="text" type="xsd:string"/> - <xsd:attribute name="value" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="checkbox" type="checkboxType"/> - <xsd:complexType name="checkboxType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="default" type="xsd:boolean"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="readonly" type="xsd:boolean"/> - <xsd:attribute name="required" type="xsd:boolean"/> - <xsd:attribute name="label" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="column" type="columnType"/> - <xsd:complexType name="columnType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="style" type="xsd:string"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="colspan" type="xsd:string"/> - <xsd:attribute name="rowspan" type="xsd:string"/> - <xsd:attribute name="header" type="xsd:boolean"/> - <xsd:attribute name="title" type="xsd:string"/> - <xsd:attribute name="url" type="xsd:string"/> - <xsd:attribute name="action" type="xsd:string"/> - <xsd:attribute name="id" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="date" type="dateType"/> - <xsd:complexType name="dateType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="date" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="editor" type="editorType"/> - <xsd:complexType name="editorType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="type" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="default" type="xsd:string"/> - <xsd:attribute name="mode" type="xsd:string"/> - <xsd:attribute name="extension" type="xsd:string"/> - <xsd:attribute name="mimetype" type="xsd:string"/> - <xsd:attribute name="prefix" type="xsd:string"/> - <xsd:attribute name="readonly" type="xsd:boolean"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="else" type="elseType"/> - <xsd:complexType name="elseType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="fieldset" type="fieldsetType"/> - <xsd:complexType name="fieldsetType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="label" type="xsd:string"/> - <xsd:attribute name="qrcode" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="form" type="formType"/> - <xsd:complexType name="formType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="method" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="action" type="xsd:string"/> - <xsd:attribute name="subaction" type="xsd:string"/> - <xsd:attribute name="forwardTo" type="xsd:string"/> - <xsd:attribute name="id" type="xsd:string"/> - <xsd:attribute name="languageid" type="xsd:string"/> - <xsd:attribute name="modelid" type="xsd:string"/> - <xsd:attribute name="label" type="xsd:string"/> - <xsd:attribute name="apply" type="xsd:boolean"/> - <xsd:attribute name="cancel" type="xsd:boolean"/> - <xsd:attribute name="readonly" type="xsd:boolean"/> - <xsd:attribute name="target" type="xsd:string"/> - <xsd:attribute name="enctype" type="xsd:string"/> - <xsd:attribute name="async" type="xsd:boolean"/> - <xsd:attribute name="autosave" type="xsd:boolean"/> - <xsd:attribute name="type" type="xsd:string"/> - <xsd:attribute name="afterSuccess" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="group" type="groupType"/> - <xsd:complexType name="groupType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="open" type="xsd:boolean"/> - <xsd:attribute name="show" type="xsd:boolean"/> - <xsd:attribute name="collapsible" type="xsd:boolean"/> - <xsd:attribute name="title" type="xsd:string"/> - <xsd:attribute name="description" type="xsd:string"/> - <xsd:attribute name="icon" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="hidden" type="hiddenType"/> - <xsd:complexType name="hiddenType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="default" type="xsd:string"/> - <xsd:attribute name="prefix" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="readonly" type="xsd:boolean"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="if" type="ifType"/> - <xsd:complexType name="ifType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="true" type="xsd:string"/> - <xsd:attribute name="false" type="xsd:string"/> - <xsd:attribute name="contains" type="xsd:string"/> - <xsd:attribute name="value" type="xsd:string"/> - <xsd:attribute name="empty" type="xsd:string"/> - <xsd:attribute name="equals" type="xsd:string"/> - <xsd:attribute name="lessthan" type="xsd:string"/> - <xsd:attribute name="greaterthan" type="xsd:string"/> - <xsd:attribute name="present" type="xsd:string"/> - <xsd:attribute name="not" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="image" type="imageType"/> - <xsd:complexType name="imageType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="menu" type="xsd:string"/> - <xsd:attribute name="action" type="xsd:string"/> - <xsd:attribute name="method" type="xsd:string"/> - <xsd:attribute name="config" type="xsd:string"/> - <xsd:attribute name="file" type="xsd:string"/> - <xsd:attribute name="url" type="xsd:string"/> - <xsd:attribute name="icon" type="xsd:string"/> - <xsd:attribute name="type" type="xsd:string"/> - <xsd:attribute name="elementtype" type="xsd:string"/> - <xsd:attribute name="fileext" type="xsd:string"/> - <xsd:attribute name="tree" type="xsd:string"/> - <xsd:attribute name="notice" type="xsd:string"/> - <xsd:attribute name="size" type="xsd:string"/> - <xsd:attribute name="title" type="xsd:string"/> - <xsd:attribute name="symbol" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="include" type="includeType"/> - <xsd:complexType name="includeType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="file" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="input" type="inputType"/> - <xsd:complexType name="inputType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="default" type="xsd:string"/> - <xsd:attribute name="type" type="xsd:string"/> - <xsd:attribute name="index" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="prefix" type="xsd:string"/> - <xsd:attribute name="value" type="xsd:string"/> - <xsd:attribute name="size" type="xsd:string"/> - <xsd:attribute name="minlength" type="xsd:int"/> - <xsd:attribute name="maxlength" type="xsd:int"/> - <xsd:attribute name="onchange" type="xsd:string"/> - <xsd:attribute name="hint" type="xsd:string"/> - <xsd:attribute name="icon" type="xsd:string"/> - <xsd:attribute name="required" type="xsd:boolean"/> - <xsd:attribute name="focus" type="xsd:boolean"/> - <xsd:attribute name="label" type="xsd:string"/> - <xsd:attribute name="readonly" type="xsd:boolean"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="inputarea" type="inputareaType"/> - <xsd:complexType name="inputareaType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="rows" type="xsd:int"/> - <xsd:attribute name="cols" type="xsd:int"/> - <xsd:attribute name="value" type="xsd:string"/> - <xsd:attribute name="index" type="xsd:string"/> - <xsd:attribute name="onchange" type="xsd:string"/> - <xsd:attribute name="prefix" type="xsd:string"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="required" type="xsd:boolean"/> - <xsd:attribute name="default" type="xsd:string"/> - <xsd:attribute name="maxlength" type="xsd:int"/> - <xsd:attribute name="label" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="readonly" type="xsd:boolean"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="insert" type="insertType"/> - <xsd:complexType name="insertType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="url" type="xsd:string"/> - <xsd:attribute name="function" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="label" type="labelType"/> - <xsd:complexType name="labelType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="for" type="xsd:string"/> - <xsd:attribute name="value" type="xsd:string"/> - <xsd:attribute name="key" type="xsd:string"/> - <xsd:attribute name="text" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="link" type="linkType"/> - <xsd:complexType name="linkType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="var1" type="xsd:string"/> - <xsd:attribute name="var2" type="xsd:string"/> - <xsd:attribute name="var3" type="xsd:string"/> - <xsd:attribute name="var4" type="xsd:string"/> - <xsd:attribute name="var5" type="xsd:string"/> - <xsd:attribute name="value1" type="xsd:string"/> - <xsd:attribute name="value2" type="xsd:string"/> - <xsd:attribute name="value3" type="xsd:string"/> - <xsd:attribute name="value4" type="xsd:string"/> - <xsd:attribute name="value5" type="xsd:string"/> - <xsd:attribute name="target" type="xsd:string"/> - <xsd:attribute name="type" type="xsd:string"/> - <xsd:attribute name="action" type="xsd:string"/> - <xsd:attribute name="subaction" type="xsd:string"/> - <xsd:attribute name="title" type="xsd:string"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="url" type="xsd:string"/> - <xsd:attribute name="config" type="xsd:string"/> - <xsd:attribute name="id" type="xsd:string"/> - <xsd:attribute name="accesskey" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="anchor" type="xsd:string"/> - <xsd:attribute name="frame" type="xsd:string"/> - <xsd:attribute name="modal" type="xsd:boolean"/> - <xsd:attribute name="afterSuccess" type="xsd:string"/> - <xsd:attribute name="clickable" type="xsd:boolean"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="list" type="listType"/> - <xsd:complexType name="listType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="list" type="xsd:string"/> - <xsd:attribute name="items" type="xsd:string"/> - <xsd:attribute name="extract" type="xsd:boolean"/> - <xsd:attribute name="key" type="xsd:string"/> - <xsd:attribute name="value" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="newline" type="newlineType"/> - <xsd:complexType name="newlineType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="output" type="outputType"/> - <xsd:complexType name="outputType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="part" type="partType"/> - <xsd:complexType name="partType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="id" type="xsd:string"/> - <xsd:attribute name="tag" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="password" type="passwordType"/> - <xsd:complexType name="passwordType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="default" type="xsd:string"/> - <xsd:attribute name="size" type="xsd:int"/> - <xsd:attribute name="maxlength" type="xsd:int"/> - <xsd:attribute name="minlength" type="xsd:string"/> - <xsd:attribute name="required" type="xsd:boolean"/> - <xsd:attribute name="hint" type="xsd:string"/> - <xsd:attribute name="prefix" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="readonly" type="xsd:boolean"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="qrcode" type="qrcodeType"/> - <xsd:complexType name="qrcodeType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="value" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="radio" type="radioType"/> - <xsd:complexType name="radioType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="readonly" type="xsd:boolean"/> - <xsd:attribute name="value" type="xsd:string"/> - <xsd:attribute name="prefix" type="xsd:string"/> - <xsd:attribute name="suffix" type="xsd:string"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="onchange" type="xsd:string"/> - <xsd:attribute name="children" type="xsd:string"/> - <xsd:attribute name="checked" type="xsd:string"/> - <xsd:attribute name="label" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="radiobox" type="radioboxType"/> - <xsd:complexType name="radioboxType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="list" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="default" type="xsd:string"/> - <xsd:attribute name="onchange" type="xsd:string"/> - <xsd:attribute name="title" type="xsd:string"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="row" type="rowType"/> - <xsd:complexType name="rowType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="header" type="xsd:boolean"/> - <xsd:attribute name="id" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="selectbox" type="selectboxType"/> - <xsd:complexType name="selectboxType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="list" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="default" type="xsd:string"/> - <xsd:attribute name="title" type="xsd:string"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="addempty" type="xsd:boolean"/> - <xsd:attribute name="multiple" type="xsd:boolean"/> - <xsd:attribute name="size" type="xsd:int"/> - <xsd:attribute name="lang" type="xsd:boolean"/> - <xsd:attribute name="label" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="selector" type="selectorType"/> - <xsd:complexType name="selectorType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="types" type="xsd:string"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="id" type="xsd:string"/> - <xsd:attribute name="folderid" type="xsd:string"/> - <xsd:attribute name="param" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="set" type="setType"/> - <xsd:complexType name="setType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="var" type="xsd:string"/> - <xsd:attribute name="value" type="xsd:string"/> - <xsd:attribute name="key" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="table" type="tableType"/> - <xsd:complexType name="tableType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="filter" type="xsd:boolean"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="text" type="textType"/> - <xsd:complexType name="textType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="title" type="xsd:string"/> - <xsd:attribute name="type" type="xsd:string"/> - <xsd:attribute name="escape" type="xsd:boolean"/> - <xsd:attribute name="value" type="xsd:string"/> - <xsd:attribute name="label" type="xsd:string"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="upload" type="uploadType"/> - <xsd:complexType name="uploadType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="size" type="xsd:int"/> - <xsd:attribute name="name" type="xsd:string"/> - <xsd:attribute name="multiple" type="xsd:boolean"/> - <xsd:attribute name="class" type="xsd:string"/> - <xsd:attribute name="maxlength" type="xsd:int"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> - <xsd:element name="user" type="userType"/> - <xsd:complexType name="userType"> - <xsd:choice maxOccurs="unbounded" minOccurs="0"> - <xsd:element ref="button" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="column" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="date" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="else" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="form" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="group" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="if" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="image" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="include" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="input" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="label" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="link" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="list" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="output" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="part" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="password" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="row" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="set" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="table" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="text" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0"/> - <xsd:element ref="user" maxOccurs="unbounded" minOccurs="0"/> - <xsd:any namespace="http://www.w3.org/1999/xhtml"/> - </xsd:choice> - <xsd:attribute name="user" type="xsd:string"/> - <xsd:attribute name="id" type="xsd:string"/> - <xsd:attribute name="request" type="xsd:string"/> - </xsd:complexType> -</xsd:schema> -\ No newline at end of file + targetNamespace="http://www.openrat.de/template" xmlns:xsd="http://www.w3.org/2001/XMLSchema" + elementFormDefault="qualified" attributeFormDefault="unqualified"> +<!-- generated by XSDGenerator. do not change manually --> +<xsd:element name="button" type="buttonType" /><xsd:complexType name="buttonType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="type" type="xsd:string" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="src" type="xsd:string" /><xsd:attribute name="text" type="xsd:string" /><xsd:attribute name="value" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="checkbox" type="checkboxType" /><xsd:complexType name="checkboxType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="default" type="xsd:boolean" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="readonly" type="xsd:boolean" /><xsd:attribute name="required" type="xsd:boolean" /><xsd:attribute name="label" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="column" type="columnType" /><xsd:complexType name="columnType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="style" type="xsd:string" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="colspan" type="xsd:string" /><xsd:attribute name="rowspan" type="xsd:string" /><xsd:attribute name="header" type="xsd:boolean" /><xsd:attribute name="title" type="xsd:string" /><xsd:attribute name="url" type="xsd:string" /><xsd:attribute name="action" type="xsd:string" /><xsd:attribute name="id" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="date" type="dateType" /><xsd:complexType name="dateType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="date" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="editor" type="editorType" /><xsd:complexType name="editorType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="type" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="default" type="xsd:string" /><xsd:attribute name="mode" type="xsd:string" /><xsd:attribute name="extension" type="xsd:string" /><xsd:attribute name="mimetype" type="xsd:string" /><xsd:attribute name="prefix" type="xsd:string" /><xsd:attribute name="readonly" type="xsd:boolean" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="else" type="elseType" /><xsd:complexType name="elseType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="fieldset" type="fieldsetType" /><xsd:complexType name="fieldsetType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="label" type="xsd:string" /><xsd:attribute name="qrcode" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="form" type="formType" /><xsd:complexType name="formType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="method" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="action" type="xsd:string" /><xsd:attribute name="subaction" type="xsd:string" /><xsd:attribute name="forwardTo" type="xsd:string" /><xsd:attribute name="id" type="xsd:string" /><xsd:attribute name="languageid" type="xsd:string" /><xsd:attribute name="modelid" type="xsd:string" /><xsd:attribute name="label" type="xsd:string" /><xsd:attribute name="apply" type="xsd:boolean" /><xsd:attribute name="cancel" type="xsd:boolean" /><xsd:attribute name="readonly" type="xsd:boolean" /><xsd:attribute name="target" type="xsd:string" /><xsd:attribute name="enctype" type="xsd:string" /><xsd:attribute name="async" type="xsd:boolean" /><xsd:attribute name="autosave" type="xsd:boolean" /><xsd:attribute name="type" type="xsd:string" /><xsd:attribute name="afterSuccess" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="group" type="groupType" /><xsd:complexType name="groupType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="open" type="xsd:boolean" /><xsd:attribute name="show" type="xsd:boolean" /><xsd:attribute name="collapsible" type="xsd:boolean" /><xsd:attribute name="title" type="xsd:string" /><xsd:attribute name="description" type="xsd:string" /><xsd:attribute name="icon" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="hidden" type="hiddenType" /><xsd:complexType name="hiddenType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="default" type="xsd:string" /><xsd:attribute name="prefix" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="readonly" type="xsd:boolean" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="if" type="ifType" /><xsd:complexType name="ifType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="true" type="xsd:string" /><xsd:attribute name="false" type="xsd:string" /><xsd:attribute name="contains" type="xsd:string" /><xsd:attribute name="value" type="xsd:string" /><xsd:attribute name="empty" type="xsd:string" /><xsd:attribute name="equals" type="xsd:string" /><xsd:attribute name="lessthan" type="xsd:string" /><xsd:attribute name="greaterthan" type="xsd:string" /><xsd:attribute name="present" type="xsd:string" /><xsd:attribute name="not" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="image" type="imageType" /><xsd:complexType name="imageType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="menu" type="xsd:string" /><xsd:attribute name="action" type="xsd:string" /><xsd:attribute name="method" type="xsd:string" /><xsd:attribute name="config" type="xsd:string" /><xsd:attribute name="file" type="xsd:string" /><xsd:attribute name="url" type="xsd:string" /><xsd:attribute name="icon" type="xsd:string" /><xsd:attribute name="type" type="xsd:string" /><xsd:attribute name="elementtype" type="xsd:string" /><xsd:attribute name="fileext" type="xsd:string" /><xsd:attribute name="tree" type="xsd:string" /><xsd:attribute name="notice" type="xsd:string" /><xsd:attribute name="size" type="xsd:string" /><xsd:attribute name="title" type="xsd:string" /><xsd:attribute name="symbol" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="include" type="includeType" /><xsd:complexType name="includeType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="file" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="input" type="inputType" /><xsd:complexType name="inputType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="default" type="xsd:string" /><xsd:attribute name="type" type="xsd:string" /><xsd:attribute name="index" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="prefix" type="xsd:string" /><xsd:attribute name="value" type="xsd:string" /><xsd:attribute name="size" type="xsd:string" /><xsd:attribute name="minlength" type="xsd:int" /><xsd:attribute name="maxlength" type="xsd:int" /><xsd:attribute name="onchange" type="xsd:string" /><xsd:attribute name="hint" type="xsd:string" /><xsd:attribute name="icon" type="xsd:string" /><xsd:attribute name="required" type="xsd:boolean" /><xsd:attribute name="focus" type="xsd:boolean" /><xsd:attribute name="label" type="xsd:string" /><xsd:attribute name="readonly" type="xsd:boolean" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="inputarea" type="inputareaType" /><xsd:complexType name="inputareaType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="rows" type="xsd:int" /><xsd:attribute name="cols" type="xsd:int" /><xsd:attribute name="value" type="xsd:string" /><xsd:attribute name="index" type="xsd:string" /><xsd:attribute name="onchange" type="xsd:string" /><xsd:attribute name="prefix" type="xsd:string" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="required" type="xsd:boolean" /><xsd:attribute name="default" type="xsd:string" /><xsd:attribute name="maxlength" type="xsd:int" /><xsd:attribute name="label" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="readonly" type="xsd:boolean" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="insert" type="insertType" /><xsd:complexType name="insertType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="url" type="xsd:string" /><xsd:attribute name="function" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="label" type="labelType" /><xsd:complexType name="labelType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="for" type="xsd:string" /><xsd:attribute name="value" type="xsd:string" /><xsd:attribute name="key" type="xsd:string" /><xsd:attribute name="text" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="link" type="linkType" /><xsd:complexType name="linkType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="var1" type="xsd:string" /><xsd:attribute name="var2" type="xsd:string" /><xsd:attribute name="var3" type="xsd:string" /><xsd:attribute name="var4" type="xsd:string" /><xsd:attribute name="var5" type="xsd:string" /><xsd:attribute name="value1" type="xsd:string" /><xsd:attribute name="value2" type="xsd:string" /><xsd:attribute name="value3" type="xsd:string" /><xsd:attribute name="value4" type="xsd:string" /><xsd:attribute name="value5" type="xsd:string" /><xsd:attribute name="target" type="xsd:string" /><xsd:attribute name="type" type="xsd:string" /><xsd:attribute name="action" type="xsd:string" /><xsd:attribute name="subaction" type="xsd:string" /><xsd:attribute name="title" type="xsd:string" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="url" type="xsd:string" /><xsd:attribute name="config" type="xsd:string" /><xsd:attribute name="id" type="xsd:string" /><xsd:attribute name="accesskey" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="anchor" type="xsd:string" /><xsd:attribute name="frame" type="xsd:string" /><xsd:attribute name="afterSuccess" type="xsd:string" /><xsd:attribute name="clickable" type="xsd:boolean" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="list" type="listType" /><xsd:complexType name="listType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="list" type="xsd:string" /><xsd:attribute name="items" type="xsd:string" /><xsd:attribute name="extract" type="xsd:boolean" /><xsd:attribute name="key" type="xsd:string" /><xsd:attribute name="value" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="newline" type="newlineType" /><xsd:complexType name="newlineType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="output" type="outputType" /><xsd:complexType name="outputType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="part" type="partType" /><xsd:complexType name="partType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="id" type="xsd:string" /><xsd:attribute name="tag" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="password" type="passwordType" /><xsd:complexType name="passwordType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="default" type="xsd:string" /><xsd:attribute name="size" type="xsd:int" /><xsd:attribute name="maxlength" type="xsd:int" /><xsd:attribute name="minlength" type="xsd:string" /><xsd:attribute name="required" type="xsd:boolean" /><xsd:attribute name="hint" type="xsd:string" /><xsd:attribute name="prefix" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="readonly" type="xsd:boolean" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="qrcode" type="qrcodeType" /><xsd:complexType name="qrcodeType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="value" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="radio" type="radioType" /><xsd:complexType name="radioType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="readonly" type="xsd:boolean" /><xsd:attribute name="value" type="xsd:string" /><xsd:attribute name="prefix" type="xsd:string" /><xsd:attribute name="suffix" type="xsd:string" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="onchange" type="xsd:string" /><xsd:attribute name="children" type="xsd:string" /><xsd:attribute name="checked" type="xsd:string" /><xsd:attribute name="label" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="radiobox" type="radioboxType" /><xsd:complexType name="radioboxType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="list" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="default" type="xsd:string" /><xsd:attribute name="onchange" type="xsd:string" /><xsd:attribute name="title" type="xsd:string" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="row" type="rowType" /><xsd:complexType name="rowType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="header" type="xsd:boolean" /><xsd:attribute name="id" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="selectbox" type="selectboxType" /><xsd:complexType name="selectboxType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="list" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="default" type="xsd:string" /><xsd:attribute name="title" type="xsd:string" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="addempty" type="xsd:boolean" /><xsd:attribute name="multiple" type="xsd:boolean" /><xsd:attribute name="size" type="xsd:int" /><xsd:attribute name="lang" type="xsd:boolean" /><xsd:attribute name="label" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="selector" type="selectorType" /><xsd:complexType name="selectorType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="types" type="xsd:string" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="id" type="xsd:string" /><xsd:attribute name="folderid" type="xsd:string" /><xsd:attribute name="param" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="set" type="setType" /><xsd:complexType name="setType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="var" type="xsd:string" /><xsd:attribute name="value" type="xsd:string" /><xsd:attribute name="key" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="table" type="tableType" /><xsd:complexType name="tableType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="filter" type="xsd:boolean" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="text" type="textType" /><xsd:complexType name="textType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="title" type="xsd:string" /><xsd:attribute name="type" type="xsd:string" /><xsd:attribute name="escape" type="xsd:boolean" /><xsd:attribute name="value" type="xsd:string" /><xsd:attribute name="label" type="xsd:string" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="upload" type="uploadType" /><xsd:complexType name="uploadType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="size" type="xsd:int" /><xsd:attribute name="name" type="xsd:string" /><xsd:attribute name="multiple" type="xsd:boolean" /><xsd:attribute name="class" type="xsd:string" /><xsd:attribute name="maxlength" type="xsd:int" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType><xsd:element name="user" type="userType" /><xsd:complexType name="userType"><xsd:choice maxOccurs="unbounded" minOccurs="0"><xsd:element ref="button" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="checkbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="column" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="date" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="editor" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="else" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="fieldset" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="form" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="group" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="hidden" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="if" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="image" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="include" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="input" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="inputarea" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="insert" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="label" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="link" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="list" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="newline" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="output" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="part" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="password" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="qrcode" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radio" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="radiobox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="row" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selectbox" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="selector" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="set" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="table" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="text" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="upload" maxOccurs="unbounded" minOccurs="0" /><xsd:element ref="user" maxOccurs="unbounded" minOccurs="0" /><xsd:any namespace="http://www.w3.org/1999/xhtml" /></xsd:choice><xsd:attribute name="user" type="xsd:string" /><xsd:attribute name="id" type="xsd:string" /><xsd:attribute name="request" type="xsd:string" /></xsd:complexType></xsd:schema> +\ No newline at end of file diff --git a/modules/util/Mail.class.php b/modules/util/Mail.class.php @@ -1,533 +0,0 @@ -<?php -// OpenRat Content Management System -// Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -namespace util; - -use cms\base\Configuration; -use cms\base\Language; -use cms\base\Startup; -use LogicException; -use util\text\TextMessage; -use util\text\variables\VariableResolver; - -/** - * Erzeugen und Versender einer E-Mail gemaess RFC 822.<br> - * <br> - * Die E-Mail kann entweder �ber - * - die interne PHP-Funktion "mail()" versendet werden oder - * - direkt per SMTP-Protokoll an einen SMTP-Server.<br> - * Welcher Weg gew�hlt wird, kann konfiguriert werden.<br> - * <br> - * Prinzipiell spricht nichts gegen die interne PHP-Funktion mail(), wenn diese - * aber nicht zu Verf�gung steht oder PHP ungeeignet konfiguriert ist, so kann - * SMTP direkt verwendet werden. Hierbei sollte wenn m�glich ein Relay-Host - * eingesetzt werden. Die Mail kann zwar auch direkt an Mail-Exchanger (MX) des - * Empf�ngers geschickt werden, falls dieser aber Greylisting einsetzt ist eine - * Zustellung nicht m�glich.<br> - * <br> - * - * @author Jan Dankert - */ -class Mail -{ - private $from = ''; - private $to = ''; - private $bcc = ''; - private $cc = ''; - private $subject = ''; - private $text = ''; - private $header = array(); - private $nl = ''; - private $vars = []; - - /** - * Falls beim Versendern der E-Mail etwas schiefgeht, steht hier drin - * die technische Fehlermeldung. - * - * @var array Fehler - */ - public $debugLog = array(); - - /** - * Set to true for debugging. - * If true, All SMTP-Commands are written to error log. - * - * @var bool - */ - public $debug = true; - /** - * @var string|string - */ - private $mailKey; - - - /** - * Konstruktor. - * Es werden folgende Parameter erwartet - * @param String $to Empf�nger - * @param string $subjectKey - * @param string $mailKey - */ - function __construct($to, $subjectKey, $mailKey) - { - $mailConfig = Configuration::subset('mail'); - - - // Zeilenumbruch CR/LF gem. RFC 822. - $this->nl = chr(13) . chr(10); - - if ( $mailConfig->has('from')) - $this->from = $this->header_encode($mailConfig->get('from')); - - // Priorit�t definieren (sofern konfiguriert) - if ($mailConfig->has('priority')) - $this->header[] = 'X-Priority: ' . $mailConfig->get('priority'); - - $this->header[] = 'X-Mailer: ' . $this->header_encode(Startup::TITLE . ' ' . Startup::VERSION); - $this->header[] = 'Content-Type: text/plain; charset=UTF-8'; - $this->subject = $this->header_encode(Language::lang($subjectKey)); - $this->to = $this->header_encode($to); - - $this->text = $this->nl . wordwrap(Language::lang($mailKey), 70, $this->nl) . $this->nl; - - // Signatur anhaengen (sofern konfiguriert) - $signature = $mailConfig->get('signature',''); - if ( ! $signature) - $signature = Configuration::get(['application','name']); - - if ( $signature ) { - $this->text .= $this->nl . '-- ' . $this->nl; - $this->text .= $this->nl . $signature; - $this->text .= $this->nl; - } - - // Kopie-Empf�nger - if ( $mailConfig->has('cc')) - $this->cc = $this->header_encode( implode(', ',$mailConfig->get('cc',[]))); - - // Blindkopie-Empf�nger - if ( $mailConfig->has('bcc')) - $this->bcc = $this->header_encode( implode(', ',$mailConfig->get('bcc',[]))); - - $this->mailKey = $mailKey; - } - - - /** - * Kodiert einen Text in das Format "Quoted-printable".<br> - * See RFC 2045. - * @param string $text Eingabe - * @return string Text im quoted-printable-Format - */ - private function quoted_printable_encode($text) - { - $text = str_replace(' ', '=20', $text); - - for ($i = 128; $i <= 255; $i++) { - $text = str_replace(chr($i), '=' . dechex($i), $text); - } - - return $text; - } - - - /** - * Setzen einer Variablen in den Mail-Inhalt. - */ - public function setVar($varName, $varInhalt) - { - $this->vars[ $varName ] = $varInhalt; - } - - - /** - * Mail absenden. - * Die E-Mail wird versendet. - */ - public function send() - { - $mailConfig = Configuration::subset('mail'); - - if (strpos($this->to, '@') === FALSE) - throw new LogicException("E-Mail-Adress does not contain a domain name: " . $this->to); - - $to_domain = explode('@', $this->to)[1]; - - // Prüfen gegen die Whitelist - $white = $mailConfig->get('whitelist',[]); - - if ($white) { - if (!$this->containsDomain($to_domain, $white)) { - // Wenn Domain nicht in Whitelist gefunden, dann Mail nicht verschicken. - throw new LogicException( TextMessage::create('Mail-Domain ${0} is not whitelisted',[$to_domain])); - } - } - - // Prüfen gegen die Blacklist - $black = $mailConfig->get('blacklist',[]); - - if ($black) { - if ($this->containsDomain($to_domain, $black)) { - // Wenn Domain in Blacklist gefunden, dann Mail nicht verschicken. - throw new LogicException( TextMessage::create('Mail-Domain ${0} is blacklisted',[$to_domain])); - } - } - - // Header um Adressangaben erg�nzen. - if (!empty($this->from)) - $this->header[] = 'From: ' . $this->from; - - if (!empty($this->cc)) - $this->header[] = 'Cc: ' . $this->cc; - - if (!empty($this->bcc)) - $this->header[] = 'Bcc: ' . $this->bcc; - - // Evaluate variables in mail data - $resolver = new VariableResolver(); - $resolver->addDefaultResolver( function($key) { - return $this->vars[$key]; - } ); - $text = $resolver->resolveVariables( $this->text ); - - // Mail versenden - if (strtolower($mailConfig->get('client','php')) == 'php') { - // PHP-interne Mailfunktion verwenden. - $result = @mail($this->to, // Empf�nger - $this->subject, // Betreff - $text, // Inhalt - // Lt. RFC822 müssen Header mit CRLF enden. - // ABER: Der Parameter "additional headers" verlangt offenbar \n am Zeilenende. - implode("\n", $this->header)); - if (!$result) - // Die E-Mail wurde nicht akzeptiert. - // Genauer geht es leider nicht, da mail() nur einen boolean-Wert - // zur�ck liefert. - throw new LogicException('Mail was NOT accepted by mail(), no further information available. Please look into your system logs.'); - - } else { - // eigenen SMTP-Dialog verwenden. - $smtpConf = $mailConfig->subset('smtp'); - - if ( $smtpConf->has('host')) { - // Eigenen Relay-Host verwenden. - $mxHost = $smtpConf->get('host'); - $mxPort = $smtpConf->get('port',25); - } else { - // Mail direkt zustellen. - $mxHost = $this->getMxHost($this->to); - - if (empty($mxHost)) - throw new LogicException( TextMessage::create('No MX-Entry found for ${0}',[$this->to])); - - if ($smtpConf->is('ssl',false)) - $mxPort = 465; - else - $mxPort = 25; - } - - - if ($smtpConf->has('localhost')) { - $myHost = $smtpConf->get('localhost'); - } else { - $myHost = gethostbyaddr(getenv('REMOTE_ADDR')); - } - - if ($smtpConf->is('ssl',false)) - $proto = 'ssl'; - else - $proto = 'tcp'; - - //connect to the host and port - $smtpSocket = fsockopen($proto . '://' . $mxHost, $mxPort, $errno, $errstr, intval($smtpConf['timeout'])); - - if (!is_resource($smtpSocket)) { - throw new LogicException('Connection failed to: ' . $proto . '://' . $mxHost . ':' . $mxPort . ' (' . $errstr . '/' . $errno . ')'); - } - - $smtpResponse = fgets($smtpSocket, 4096); - if ($this->debug) - $this->debugLog[] = trim($smtpResponse); - - if (substr($smtpResponse, 0, 3) != '220') { - throw new LogicException('No 220: ' . trim($smtpResponse) ); - } - - if (!is_resource($smtpSocket)) { - throw new LogicException('Connection failed to: ' . $smtpConf['host'] . ':' . $smtpConf['port'] . ' (' . $smtpResponse . ')' ); - } - - //you have to say HELO again after TLS is started - $smtpResponse = $this->sendSmtpCommand($smtpSocket, 'HELO ' . $myHost); - - if (substr($smtpResponse, 0, 3) != '250') { - $this->sendSmtpQuit($smtpSocket); - throw new LogicException("No 2xx after HELO, server says: " . $smtpResponse); - } - - if ($smtpConf['tls']) { - $smtpResponse = $this->sendSmtpCommand($smtpSocket, 'STARTTLS'); - if (substr($smtpResponse, 0, 3) == '220') { - // STARTTLS ist gelungen. - //you have to say HELO again after TLS is started - $smtpResponse = $this->sendSmtpCommand($smtpSocket, 'HELO ' . $myHost); - - if (substr($smtpResponse, 0, 3) != '250') { - $this->sendSmtpQuit($smtpSocket); - throw new LogicException("No 2xx after HELO, server says: " . $smtpResponse ); - } - } else { - // STARTTLS ging in die Hose. Einfach weitermachen. - } - } - - // request for auth login - if ( $smtpConf->has('auth_username') && $smtpConf->has('host') ) { - $smtpResponse = $this->sendSmtpCommand($smtpSocket, "AUTH LOGIN"); - if (substr($smtpResponse, 0, 3) != '334') { - $this->sendSmtpQuit($smtpSocket); - throw new LogicException("No 334 after AUTH_LOGIN, server says: " . $smtpResponse); - } - - if ($this->debug) - $this->debugLog[] = 'Login for ' . $smtpConf->get('auth_username'); - - //send the username - $smtpResponse = $this->sendSmtpCommand($smtpSocket, base64_encode($smtpConf->get('auth_username'))); - if (substr($smtpResponse, 0, 3) != '334') { - $this->sendSmtpQuit($smtpSocket); - throw new LogicException("No 3xx after setting username, server says: " . $smtpResponse); - } - - //send the password - $smtpResponse = $this->sendSmtpCommand($smtpSocket, base64_encode($smtpConf->get('auth_password'))); - if (substr($smtpResponse, 0, 3) != '235') { - $this->sendSmtpQuit($smtpSocket); - throw new LogicException("No 235 after sending password, server says: " . $smtpResponse ); - } - } - - //email from - $smtpResponse = $this->sendSmtpCommand($smtpSocket, 'MAIL FROM: <' . $mailConfig->get('from') . '>'); - if (substr($smtpResponse, 0, 3) != '250') { - $this->sendSmtpQuit($smtpSocket); - throw new LogicException("No 2xx after MAIL_FROM, server says: " . $smtpResponse); - } - - //email to - $smtpResponse = $this->sendSmtpCommand($smtpSocket, 'RCPT TO: <' . $this->to . '>'); - if (substr($smtpResponse, 0, 3) != '250') { - $this->sendSmtpQuit($smtpSocket); - throw new LogicException("No 2xx after RCPT_TO, server says: " . $smtpResponse); - } - - //the email - $smtpResponse = $this->sendSmtpCommand($smtpSocket, "DATA"); - if (substr($smtpResponse, 0, 3) != '354') { - $this->sendSmtpQuit($smtpSocket); - throw new LogicException("No 354 after DATA, server says: " . $smtpResponse); - } - - $this->header[] = 'To: ' . $this->to; - $this->header[] = 'Subject: ' . $this->subject; - $this->header[] = 'Date: ' . date('r'); - $this->header[] = 'Message-Id: ' . '<' . getenv('REMOTE_ADDR') . '.' . time() . '.openrat@' . getenv('SERVER_NAME') . '.' . getenv('HOSTNAME') . '>'; - - //observe the . after the newline, it signals the end of message - $smtpResponse = $this->sendSmtpCommand($smtpSocket, implode($this->nl, $this->header) . $this->nl . $this->nl . $text . $this->nl . '.'); - if (substr($smtpResponse, 0, 3) != '250') { - $this->sendSmtpQuit($smtpSocket); - throw new LogicException("No 2xx after putting DATA, server says: " . $smtpResponse); - } - - // say goodbye - $this->sendSmtpQuit($smtpSocket); - } - } - - - /** - * Sendet ein SMTP-Kommando zum SMTP-Server. - * - * @access private - * @param Resource $socket TCP/IP-Socket zum SMTP-Server - * @param string $cmd SMTP-Kommando - * @return Server-Antwort - */ - private function sendSmtpCommand($socket, $cmd) - { - if ($this->debug) - $this->debugLog[] = 'CLIENT: >>> ' . trim($cmd); - if (!is_resource($socket)) { - // Die Verbindung ist geschlossen. Dies kann bei dieser - // Implementierung eigentlich nur dann passieren, wenn - // der Server die Verbindung schlie�t. - // Dieser Client trennt die Verbindung nur nach einem "QUIT". - $this->debugLog[] = "Connection lost"; - return; - } - - fputs($socket, $cmd . $this->nl); - $response = trim(fgets($socket, 4096)); - if ($this->debug) - $this->debugLog[] = 'SERVER: <<< ' . $response; - return $response; - } - - - /** - * Sendet ein QUIT zum SMTP-Server, wartet die Antwort ab und - * schlie�t danach die Verbindung. - * - * @param Resource Socket - */ - private function sendSmtpQuit($socket) - { - - if ($this->debug) - $this->debugLog[] = "CLIENT: >>> QUIT"; - if (!is_resource($socket)) - return; - // Wenn die Verbindung nicht mehr da ist, brauchen wir - // auch kein QUIT mehr :) - - - fputs($socket, 'QUIT' . $this->nl); - $response = trim(fgets($socket, 4096)); - if ($this->debug) - $this->debugLog[] = 'SERVER: <<< ' . $response; - - if (substr($response, 0, 3) != '221') - $this->debugLog[] = 'QUIT FAILED: ' . $response; - - fclose($socket); - } - - - /** - * Umwandlung von 8-bit-Zeichen in MIME-Header gemaess RFC 2047.<br> - * Header d�rfen nur 7-bit-Zeichen enthalten. 8-bit-Zeichen m�ssen kodiert werden. - * - * @param String $text - * @return String - */ - private function header_encode($text) - { - $mailConfig = Configuration::subset('mail'); - - if (! $mailConfig->has('header_encoding')) - return $text; - - $woerter = explode(' ', $text); - $neu = array(); - - - foreach ($woerter as $wort) { - $type = strtolower(substr($mailConfig->get('header_encoding','Quoted-printable'), 0, 1)); - $neu_wort = ''; - - if ($type == 'b') - $neu_wort = base64_encode($wort); - elseif ($type == 'q') - $neu_wort = $this->quoted_printable_encode($wort); - else - throw new LogicException('Mail-Configuration broken: UNKNOWN Header-Encoding type: ' . $type); - - if (strlen($wort) == strlen($neu_wort)) - $neu[] = $wort; - else - $neu[] = '=?UTF-8?' . $type . '?' . $neu_wort . '?='; - } - - return implode(' ', $neu); - } - - - /** - * Ermittelt den MX-Eintrag zu einer E-Mail-Adresse.<br> - * Es wird der Eintrag mit der h�chsten Priorit�t ermittelt. - * - * @param String E-Mail-Adresse des Empf�ngers. - * @return MX-Eintrag - */ - private function getMxHost($to) - { - list($user, $host) = explode('@', $to . '@'); - - if (empty($host)) { - throw new LogicException( TextMessage::create('Illegal mail address ${0}: No hostname found',[$to]) ); - } - - list($host) = explode('>', $host); - - $mxHostsName = array(); - $mxHostsPrio = array(); - getmxrr($host, $mxHostsName, $mxHostsPrio); - - $mxList = array(); - foreach ($mxHostsName as $id => $mxHostName) { - $mxList[$mxHostName] = $mxHostsPrio[$id]; - } - asort($mxList); - return key($mxList); - } - - - /** - * Stellt fest, ob die E-Mail-Adresse eine gueltige Syntax besitzt. - * - * Es wird nur die Syntax geprüft. Ob die Adresse wirklich existiert, steht dadurch noch lange - * nicht fest. Dazu müsste man die MX-Records auflösen und einen Zustellversuch unternehmen. - * - * @param $email_address string Adresse - * @return true, falls Adresse OK, sonst false - */ - public static function checkAddress($email_address) - { - // Source: de.php.net/ereg - return \preg_match("/^[_a-z0-9-+]+(\.[_a-z0-9-+]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i", $email_address); - } - - - /** - * Prüft, ob eine Domain in einer List von Domains enthalten ist. - * - * @param $checkDomain string zu prüfende Domain - * @param $domains string Liste von Domains als kommaseparierte Liste - * @return true, falls vorhanden, sonst false - */ - private static function containsDomain($checkDomain, $domains) - { - foreach ($domains as $domain) { - $domain = trim($domain); - - if (empty($domain)) - continue; - - if ($domain == substr($checkDomain, -strlen($domain))) { - return true; - } - } - return false; - } - - public function __toString() - { - return TextMessage::create('Mail to ${0} with subject key ${1}',[$this->to,$this->mailKey]); - } -} -\ No newline at end of file diff --git a/modules/util/mail/Mail.class.php b/modules/util/mail/Mail.class.php @@ -0,0 +1,291 @@ +<?php +// OpenRat Content Management System +// Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace util\mail; + +use cms\base\Configuration; +use cms\base\Language; +use cms\base\Startup; +use LogicException; +use util\mail\client\SendmailClient; +use util\mail\client\SmtpClient; +use util\text\TextMessage; +use util\text\variables\VariableResolver; + +/** + * Erzeugen und Versender einer E-Mail gemaess RFC 822.<br> + * <br> + * Die E-Mail kann entweder �ber + * - die interne PHP-Funktion "mail()" versendet werden oder + * - direkt per SMTP-Protokoll an einen SMTP-Server.<br> + * Welcher Weg gew�hlt wird, kann konfiguriert werden.<br> + * <br> + * Prinzipiell spricht nichts gegen die interne PHP-Funktion mail(), wenn diese + * aber nicht zu Verf�gung steht oder PHP ungeeignet konfiguriert ist, so kann + * SMTP direkt verwendet werden. Hierbei sollte wenn m�glich ein Relay-Host + * eingesetzt werden. Die Mail kann zwar auch direkt an Mail-Exchanger (MX) des + * Empf�ngers geschickt werden, falls dieser aber Greylisting einsetzt ist eine + * Zustellung nicht m�glich.<br> + * <br> + * + * @author Jan Dankert + */ +class Mail +{ + /** + * Newline characters as defined in RFC 822. + */ + const NL = "\r\n"; + + private $from = ''; + private $to = ''; + private $bcc = ''; + private $cc = ''; + private $subject = ''; + private $text = ''; + private $header = array(); + private $vars = []; + + /** + * @var string + */ + private $mailKey; + + + /** + * Konstruktor. + * Es werden folgende Parameter erwartet + * @param String $to Empf�nger + * @param string $subjectKey + * @param string $mailKey + */ + function __construct($to, $subjectKey, $mailKey) + { + $mailConfig = Configuration::subset('mail'); + + + if ( $mailConfig->has('from')) + $this->from = $this->header_encode($mailConfig->get('from')); + + // Priorit�t definieren (sofern konfiguriert) + if ($mailConfig->has('priority')) + $this->header[] = 'X-Priority: ' . $mailConfig->get('priority'); + + $this->header[] = 'X-Mailer: ' . $this->header_encode(Startup::TITLE ); + $this->header[] = 'Content-Type: text/plain; charset=UTF-8'; + $this->subject = $this->header_encode(Language::lang($subjectKey)); + $this->to = $this->header_encode($to); + + $this->text = self::NL . wordwrap(Language::lang($mailKey), 70, self::NL) . self::NL; + + // Signatur anhaengen (sofern konfiguriert) + $signature = $mailConfig->get('signature',Configuration::subset('application')->get('name',Startup::TITLE) ); + + $this->text .= self::NL . '-- ' . self::NL; + $this->text .= self::NL . $signature; + $this->text .= self::NL; + + // copy + if ( $mailConfig->has('cc')) + $this->cc = $this->header_encode( implode(', ',$mailConfig->get('cc',[]))); + + // blind copy + if ( $mailConfig->has('bcc')) + $this->bcc = $this->header_encode( implode(', ',$mailConfig->get('bcc',[]))); + + $this->mailKey = $mailKey; + } + + + /** + * Kodiert einen Text in das Format "Quoted-printable".<br> + * See RFC 2045. + * @param string $text Eingabe + * @return string Text im quoted-printable-Format + */ + private function quoted_printable_encode($text) + { + $text = str_replace(' ', '=20', $text); + + for ($i = 128; $i <= 255; $i++) { + $text = str_replace(chr($i), '=' . dechex($i), $text); + } + + return $text; + } + + + /** + * Setzen einer Variablen in den Mail-Inhalt. + */ + public function setVar($varName, $varInhalt) + { + $this->vars[ $varName ] = $varInhalt; + } + + + /** + * Mail absenden. + * Die E-Mail wird versendet. + */ + public function send() + { + $mailConfig = Configuration::subset('mail'); + + if (strpos($this->to, '@') === FALSE) + throw new LogicException("E-Mail-Adress does not contain a domain name: " . $this->to); + + $to_domain = explode('@', $this->to)[1]; + + // Prüfen gegen die Whitelist + $white = $mailConfig->get('whitelist',[]); + + if ($white) { + if (!$this->containsDomain($to_domain, $white)) { + // Wenn Domain nicht in Whitelist gefunden, dann Mail nicht verschicken. + throw new LogicException( TextMessage::create('Mail-Domain ${0} is not whitelisted',[$to_domain])); + } + } + + // Prüfen gegen die Blacklist + $black = $mailConfig->get('blacklist',[]); + + if ($black) { + if ($this->containsDomain($to_domain, $black)) { + // Wenn Domain in Blacklist gefunden, dann Mail nicht verschicken. + throw new LogicException( TextMessage::create('Mail-Domain ${0} is blacklisted',[$to_domain])); + } + } + + // Header um Adressangaben erg�nzen. + if (!empty($this->from)) + $this->header[] = 'From: ' . $this->from; + + if (!empty($this->cc)) + $this->header[] = 'Cc: ' . $this->cc; + + if (!empty($this->bcc)) + $this->header[] = 'Bcc: ' . $this->bcc; + + // Evaluate variables in mail data + $resolver = new VariableResolver(); + $resolver->addDefaultResolver( function($key) { + return $this->vars[$key]; + } ); + $text = $resolver->resolveVariables( $this->text ); + + // Mail versenden + if (in_array(strtolower($mailConfig->get('client','php')),['php','sendmail'])) + $client = new SendmailClient(); + else + $client = new SmtpClient(); + + $client->send( + $this->to, // Empf�nger + $this->subject, // Betreff + $text, // Inhalt + $this->header + ); + + } + + + + + /** + * Umwandlung von 8-bit-Zeichen in MIME-Header gemaess RFC 2047.<br> + * Header d�rfen nur 7-bit-Zeichen enthalten. 8-bit-Zeichen m�ssen kodiert werden. + * + * @param String $text + * @return String + */ + private function header_encode($text) + { + $mailConfig = Configuration::subset('mail'); + + if (! $mailConfig->has('header_encoding')) + return $text; + + $woerter = explode(' ', $text); + $neu = array(); + + + foreach ($woerter as $wort) { + $type = strtolower(substr($mailConfig->get('header_encoding','Quoted-printable'), 0, 1)); + $neu_wort = ''; + + if ($type == 'b') + $neu_wort = base64_encode($wort); + elseif ($type == 'q') + $neu_wort = $this->quoted_printable_encode($wort); + else + throw new LogicException('Mail-Configuration broken: UNKNOWN Header-Encoding type: ' . $type); + + if (strlen($wort) == strlen($neu_wort)) + $neu[] = $wort; + else + $neu[] = '=?UTF-8?' . $type . '?' . $neu_wort . '?='; + } + + return implode(' ', $neu); + } + + + /** + * Stellt fest, ob die E-Mail-Adresse eine gueltige Syntax besitzt. + * + * Es wird nur die Syntax geprüft. Ob die Adresse wirklich existiert, steht dadurch noch lange + * nicht fest. Dazu müsste man die MX-Records auflösen und einen Zustellversuch unternehmen. + * + * @param $email_address string Adresse + * @return true, falls Adresse OK, sonst false + */ + public static function checkAddress($email_address) + { + // Source: de.php.net/ereg + return \preg_match("/^[_a-z0-9-+]+(\.[_a-z0-9-+]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i", $email_address); + } + + + /** + * Prüft, ob eine Domain in einer List von Domains enthalten ist. + * + * @param $checkDomain string zu prüfende Domain + * @param $domains string Liste von Domains als kommaseparierte Liste + * @return true, falls vorhanden, sonst false + */ + private static function containsDomain($checkDomain, $domains) + { + foreach ($domains as $domain) { + $domain = trim($domain); + + if (empty($domain)) + continue; + + if ($domain == substr($checkDomain, -strlen($domain))) { + return true; + } + } + return false; + } + + public function __toString() + { + return TextMessage::create('Mail to ${0} with subject key ${1}',[$this->to,$this->mailKey]); + } +} +\ No newline at end of file diff --git a/modules/util/mail/client/Client.class.php b/modules/util/mail/client/Client.class.php @@ -0,0 +1,34 @@ +<?php +// OpenRat Content Management System +// Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace util\mail\client; + +use cms\base\Configuration; +use cms\base\Language; +use cms\base\Startup; +use LogicException; +use util\text\TextMessage; +use util\text\variables\VariableResolver; + +/** + * @author Jan Dankert + */ +interface Client +{ + public function send( $to, $subject, $body, $headers ); +} +\ No newline at end of file diff --git a/modules/util/mail/client/SendmailClient.class.php b/modules/util/mail/client/SendmailClient.class.php @@ -0,0 +1,69 @@ +<?php +// OpenRat Content Management System +// Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace util\mail\client; + +use cms\base\Configuration; +use cms\base\Language; +use cms\base\Startup; +use LogicException; +use util\text\TextMessage; +use util\text\variables\VariableResolver; + +/** + * Erzeugen und Versender einer E-Mail gemaess RFC 822.<br> + * <br> + * Die E-Mail kann entweder �ber + * - die interne PHP-Funktion "mail()" versendet werden oder + * - direkt per SMTP-Protokoll an einen SMTP-Server.<br> + * Welcher Weg gew�hlt wird, kann konfiguriert werden.<br> + * <br> + * Prinzipiell spricht nichts gegen die interne PHP-Funktion mail(), wenn diese + * aber nicht zu Verf�gung steht oder PHP ungeeignet konfiguriert ist, so kann + * SMTP direkt verwendet werden. Hierbei sollte wenn m�glich ein Relay-Host + * eingesetzt werden. Die Mail kann zwar auch direkt an Mail-Exchanger (MX) des + * Empf�ngers geschickt werden, falls dieser aber Greylisting einsetzt ist eine + * Zustellung nicht m�glich.<br> + * <br> + * + * @author Jan Dankert + */ +class SendmailClient implements Client +{ + + /** + * Mail absenden. + * Die E-Mail wird versendet. + */ + public function send($to, $subject, $body, $headers) + { + + // PHP-interne Mailfunktion verwenden. + $result = @mail($to, // Empf�nger + $subject, // Betreff + $body, // Inhalt + // Lt. RFC822 müssen Header mit CRLF enden. + // ABER: Der Parameter "additional headers" verlangt offenbar \n am Zeilenende. + implode("\n", $headers)); + if (!$result) + // Die E-Mail wurde nicht akzeptiert. + // Genauer geht es leider nicht, da mail() nur einen boolean-Wert + // zur�ck liefert. + throw new LogicException('Mail was NOT accepted by mail(), no further information available. Please look into your system logs.'); + } +} +\ No newline at end of file diff --git a/modules/util/mail/client/SmtpClient.class.php b/modules/util/mail/client/SmtpClient.class.php @@ -0,0 +1,269 @@ +<?php +// OpenRat Content Management System +// Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace util\mail\client; + +use cms\base\Configuration; +use cms\base\Startup; +use LogicException; + +/** + * Erzeugen und Versender einer E-Mail gemaess RFC 822.<br> + * <br> + * Die E-Mail kann entweder �ber + * - die interne PHP-Funktion "mail()" versendet werden oder + * - direkt per SMTP-Protokoll an einen SMTP-Server.<br> + * Welcher Weg gew�hlt wird, kann konfiguriert werden.<br> + * <br> + * Prinzipiell spricht nichts gegen die interne PHP-Funktion mail(), wenn diese + * aber nicht zu Verf�gung steht oder PHP ungeeignet konfiguriert ist, so kann + * SMTP direkt verwendet werden. Hierbei sollte wenn m�glich ein Relay-Host + * eingesetzt werden. Die Mail kann zwar auch direkt an Mail-Exchanger (MX) des + * Empf�ngers geschickt werden, falls dieser aber Greylisting einsetzt ist eine + * Zustellung nicht m�glich.<br> + * <br> + * + * @author Jan Dankert + */ +class SmtpClient implements Client +{ + /** + * Newline characters as defined in RFC 822. + */ + const NL = "\r\n"; + + /** + * Mail absenden. + * Die E-Mail wird versendet. + */ + public function send( $to, $subject, $body, $headers) + { + $mailConfig = Configuration::subset('mail'); + + // Mail versenden + // eigenen SMTP-Dialog verwenden. + $smtpConf = $mailConfig->subset('smtp'); + + $relayConfig = $smtpConf->subset('relay'); + + if ( $relayConfig->has('host')) { + // Eigenen Relay-Host verwenden. + $mxHost = $relayConfig->get('host'); + $mxPort = $relayConfig->get('port',25); + } else { + // Mail direkt zustellen. + $mxHost = $this->getMxHost($to); + + if (empty($mxHost)) + throw new LogicException( TextMessage::create('No MX-Entry found for ${0}',[$to])); + + if ($smtpConf->is('ssl',false)) + $mxPort = 465; + else + $mxPort = 25; + } + + + // gets the server hostname (necessary for the HELO command) + $myHost = $smtpConf->get('hostname', gethostname() ); + + if ($smtpConf->is('ssl',false)) + $proto = 'ssl'; + else + $proto = 'tcp'; + + //connect to the host and port + $smtpSocket = fsockopen($proto . '://' . $mxHost, $mxPort, $errno, $errstr, $smtpConf->get('timeout',30 ) ); + + if (!is_resource($smtpSocket)) { + throw new LogicException('Connection failed to: ' . $proto . '://' . $mxHost . ':' . $mxPort . ' (' . $errstr . '/' . $errno . ')'); + } + + $smtpResponse = fgets($smtpSocket, 4096); + + if (substr($smtpResponse, 0, 3) != '220') { + throw new LogicException('No 220: ' . trim($smtpResponse) ); + } + + if (!is_resource($smtpSocket)) { + throw new LogicException('Connection failed to: ' . $smtpConf['host'] . ':' . $smtpConf['port'] . ' (' . $smtpResponse . ')' ); + } + + //you have to say HELO again after TLS is started + $smtpResponse = $this->sendSmtpCommand($smtpSocket, 'HELO ' . $myHost); + + if (substr($smtpResponse, 0, 3) != '250') { + $this->sendSmtpQuit($smtpSocket); + throw new LogicException('No 2xx after HELO as host "'.$myHost.'", server says: ' . $smtpResponse); + } + + if ($smtpConf->is('tls')) { + $smtpResponse = $this->sendSmtpCommand($smtpSocket, 'STARTTLS'); + if (substr($smtpResponse, 0, 3) == '220') { + // STARTTLS ist gelungen. + //you have to say HELO again after TLS is started + $smtpResponse = $this->sendSmtpCommand($smtpSocket, 'HELO ' . $myHost); + + if (substr($smtpResponse, 0, 3) != '250') { + $this->sendSmtpQuit($smtpSocket); + throw new LogicException("No 2xx after HELO, server says: " . $smtpResponse ); + } + } else { + // STARTTLS ging in die Hose. Einfach weitermachen. + } + } + + // request for auth login + if ( $smtpConf->has('auth_username') && $relayConfig->has('host') ) { + $smtpResponse = $this->sendSmtpCommand($smtpSocket, "AUTH LOGIN"); + if (substr($smtpResponse, 0, 3) != '334') { + $this->sendSmtpQuit($smtpSocket); + throw new LogicException("No 334 after AUTH_LOGIN, server says: " . $smtpResponse); + } + + //send the username + $smtpResponse = $this->sendSmtpCommand($smtpSocket, base64_encode($smtpConf->get('auth_username'))); + if (substr($smtpResponse, 0, 3) != '334') { + $this->sendSmtpQuit($smtpSocket); + throw new LogicException("No 3xx after setting username, server says: " . $smtpResponse); + } + + //send the password + $smtpResponse = $this->sendSmtpCommand($smtpSocket, base64_encode($smtpConf->get('auth_password'))); + if (substr($smtpResponse, 0, 3) != '235') { + $this->sendSmtpQuit($smtpSocket); + throw new LogicException("No 235 after sending password, server says: " . $smtpResponse ); + } + } + + //email from + $smtpResponse = $this->sendSmtpCommand($smtpSocket, 'MAIL FROM: <' . $mailConfig->get('from') . '>'); + if (substr($smtpResponse, 0, 3) != '250') { + $this->sendSmtpQuit($smtpSocket); + throw new LogicException("No 2xx after MAIL_FROM, server says: " . $smtpResponse); + } + + //email to + $smtpResponse = $this->sendSmtpCommand($smtpSocket, 'RCPT TO: <' . $to . '>'); + if (substr($smtpResponse, 0, 3) != '250') { + $this->sendSmtpQuit($smtpSocket); + throw new LogicException("No 2xx after RCPT_TO, server says: " . $smtpResponse); + } + + //the email + $smtpResponse = $this->sendSmtpCommand($smtpSocket, "DATA"); + if (substr($smtpResponse, 0, 3) != '354') { + $this->sendSmtpQuit($smtpSocket); + throw new LogicException("No 354 after DATA, server says: " . $smtpResponse); + } + + $headers[] = 'To: ' . $to; + $headers[] = 'Subject: ' . $subject; + $headers[] = 'Date: ' . date('r'); + $headers[] = 'Message-Id: ' . '<' . getenv('REMOTE_ADDR') . '.' . time() . '.openrat@' . getenv('SERVER_NAME') . '.' . getenv('HOSTNAME') . '>'; + + //observe the . after the newline, it signals the end of message + $smtpResponse = $this->sendSmtpCommand($smtpSocket, implode(self::NL, $headers) . self::NL . self::NL . $body . self::NL . '.'); + if (substr($smtpResponse, 0, 3) != '250') { + $this->sendSmtpQuit($smtpSocket); + throw new LogicException("No 2xx after putting DATA, server says: " . $smtpResponse); + } + + // say goodbye + $this->sendSmtpQuit($smtpSocket); + } + + + /** + * Sendet ein SMTP-Kommando zum SMTP-Server. + * + * @access private + * @param Resource $socket TCP/IP-Socket zum SMTP-Server + * @param string $cmd SMTP-Kommando + * @return Server-Antwort + */ + private function sendSmtpCommand($socket, $cmd) + { + if (!is_resource($socket)) + // Die Verbindung ist geschlossen. Dies kann bei dieser + // Implementierung eigentlich nur dann passieren, wenn + // der Server die Verbindung schlie�t. + // Dieser Client trennt die Verbindung nur nach einem "QUIT". + throw new LogicException("Connection lost"); + + fputs($socket, $cmd . self::NL); + $response = trim(fgets($socket, 4096)); + return $response; + } + + + /** + * Sendet ein QUIT zum SMTP-Server, wartet die Antwort ab und + * schlie�t danach die Verbindung. + * + * @param Resource Socket + */ + private function sendSmtpQuit($socket) + { + + if (!is_resource($socket)) + return; + // Wenn die Verbindung nicht mehr da ist, brauchen wir + // auch kein QUIT mehr :) + + + fputs($socket, 'QUIT' . self::NL); + $response = trim(fgets($socket, 4096)); + + if (substr($response, 0, 3) != '221') + throw new LogicException("No 221 after QUIT, server says: " . $response); + + fclose($socket); + } + + + + /** + * Ermittelt den MX-Eintrag zu einer E-Mail-Adresse.<br> + * Es wird der Eintrag mit der h�chsten Priorit�t ermittelt. + * + * @param String E-Mail-Adresse des Empf�ngers. + * @return MX-Eintrag + */ + private function getMxHost($to) + { + list($user, $host) = explode('@', $to . '@'); + + if (empty($host)) { + throw new LogicException( TextMessage::create('Illegal mail address ${0}: No hostname found',[$to]) ); + } + + list($host) = explode('>', $host); + + $mxHostsName = array(); + $mxHostsPrio = array(); + getmxrr($host, $mxHostsName, $mxHostsPrio); + + $mxList = array(); + foreach ($mxHostsName as $id => $mxHostName) { + $mxList[$mxHostName] = $mxHostsPrio[$id]; + } + asort($mxList); + return key($mxList); + } +} +\ No newline at end of file diff --git a/status/index.php b/status/index.php @@ -0,0 +1,20 @@ +<?php +// Excecuting the CMS application programming interface (API) + +require('../modules/autoload.php'); + +use cms\status\Status; +use cms\base\Startup; + +Startup::initialize(); + +try { + Status::execute(); + +} catch (Exception $e) { + + if (!headers_sent()) + header('HTTP/1.0 500 Internal Server Error'); + + echo $e->__toString(); +}