<!-- GNUe-Forms DTD (Version 0.6.3) -->

<!--
     Copyright 2001-2005 Free Software Foundation

     This file is part of GNU Enterprise.

     GNU Enterprise 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 3, or (at your option) any later version.

     GNU Enterprise 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 program; see the file COPYING. If not,
     write to the Free Software Foundation, Inc., 59 Temple Place
     - Suite 330, Boston, MA 02111-1307, USA.
-->

<!-- Entities for characters/symbols -->
<!ENTITY % lt "&#38;#60;">
<!ENTITY % gt "&#62;">
<!ENTITY % amp "&#38;#38;">

<!--  =================================================  -->
<!--  Datatype entities to make DTD more human readable  -->
<!--  =================================================  -->

<!ENTITY % text "CDATA">

<!ENTITY % true "Y">
<!ENTITY % false "N">
<!ENTITY % boolean "(%true;|%false;) #IMPLIED">

<!ENTITY % whole "NMTOKEN">
<!-- [0-9]+ -->

<!ENTITY % name "NMTOKEN">
<!-- [A-Za-z]([A-Z][a-z][0-9][#$_-])* -->



<!-- ================= -->
<!-- Top level element -->
<!-- ================= -->
<!-- Top-level element that encloses all the logic and visuals that the user 
     interface will show to the user. -->
<!ELEMENT form (action*, connection*, datasource*, dialog*, import-action*, 
                import-datasource*, import-dialog*, import-layout?, 
                import-logic?, import-trigger*, layout?, logic?, menu*, 
                options*, parameter*, toolbar*, trigger*)>
  <!-- name: A unique name or ID for the form. -->
  <!ATTLIST form name ID #IMPLIED>
  <!-- readonly: If set to {Y}, then no modifications to data by the end user 
       will be allowed. The form will become a query-only form. -->
  <!ATTLIST form readonly %boolean;>
  <!-- style: Display as normal or dialog-style window. -->
  <!ATTLIST form style (dialog | normal) "normal">
  <!-- title: The title of the form. -->
  <!ATTLIST form title %text; "Untitled Form">


<!-- ====================== -->
<!-- Child elements of form -->
<!-- ====================== -->
<!-- A piece of code that can be bound to a button, a menu item, a toolbar 
     button or a trigger. -->
<!ELEMENT action EMPTY>
  <!-- name: Name of this element -->
  <!ATTLIST action name ID #REQUIRED>
  <!-- description: Long text to use for this action -->
  <!ATTLIST action description %text; #IMPLIED>
  <!-- enabled: Determines whether this action can be run -->
  <!ATTLIST action enabled %boolean;>
  <!-- file: External file containing the source code -->
  <!ATTLIST action file %text; #IMPLIED>
  <!-- icon: Icon assigned with this action -->
  <!ATTLIST action icon %name; #IMPLIED>
  <!-- label: Short text to use for this action -->
  <!ATTLIST action label %text; #IMPLIED>
  <!-- language: Programming language the code is written in -->
  <!ATTLIST action language %name; #FIXED "python">

<!-- TODO -->
<!ELEMENT connection EMPTY>
  <!-- name: TODO -->
  <!ATTLIST connection name ID #REQUIRED>
  <!-- provider: TODO -->
  <!ATTLIST connection provider %name; #REQUIRED>
  <!-- comment: TODO -->
  <!ATTLIST connection comment %text; #IMPLIED>
  <!-- dbname: TODO -->
  <!ATTLIST connection dbname %text; #IMPLIED>
  <!-- host: TODO -->
  <!ATTLIST connection host %text; #IMPLIED>
  <!-- service: TODO -->
  <!ATTLIST connection service %text; #IMPLIED>

<!-- A datasource provides a link to a database table or some similar data 
     store. -->
<!ELEMENT datasource (condition*, sortorder*, sql*, staticset*)>
  <!-- name: Unique name of the datasource. -->
  <!ATTLIST datasource name ID #REQUIRED>
  <!-- cache: Cache this number of records -->
  <!ATTLIST datasource cache %whole; "5">
  <!-- connection: The name of the connection as in connections.conf that 
       points to a valid database. -->
  <!ATTLIST datasource connection %name; #IMPLIED>
  <!-- DEPRECATED: The "database" attribute of "datasource" has been 
                 deprecated [Use {connection} attribute instead] -->
  <!ATTLIST datasource database %name; #IMPLIED>
  <!-- detaillink: If this datasource is the child in a master/detail 
       relationship, this property contains a comma-separated list of the this 
       (child's) datasource's field(s) used for linking. -->
  <!ATTLIST datasource detaillink %text; #IMPLIED>
  <!-- detailmax: If this datasource is the child in a master/detail 
       relationship, this property specifies the maximum number of child 
       records that can be created. Usually, this is either omitted (for 
       one-to-many relationships) or 1 (for one-to-one relationships). -->
  <!ATTLIST datasource detailmax %whole; #IMPLIED>
  <!-- detailmin: If this datasource is the child in a master/detail 
       relationship, this property specifies the minimum number of child 
       records that must be present for a commit to be valid. Usually, this is 
       0 (for one-to-many relationships) or 1 (for one-to-one relationships). 
       -->
  <!ATTLIST datasource detailmin %whole; "0">
  <!-- distinct: TODO -->
  <!ATTLIST datasource distinct %boolean;>
  <!-- explicitfields: TODO -->
  <!ATTLIST datasource explicitfields %text; #IMPLIED>
  <!-- master: If this datasource is the child in a master/detail 
       relationship, this property contains the name of the master datasource. 
       -->
  <!ATTLIST datasource master %name; #IMPLIED>
  <!-- masterlink: If this datasource is the child in a master/detail 
       relationship, this property contains a comma-separated list of the 
       master datasource's field(s) used for linking. -->
  <!ATTLIST datasource masterlink %text; #IMPLIED>
  <!-- DEPRECATED: The "order_by" attribute of "datasource" has been 
                 deprecated [Use {sortorder} tag instead] -->
  <!ATTLIST datasource order_by %text; #IMPLIED>
  <!-- prequery: If true, the datasource is populated on form startup. If 
       false (default), the form starts out with an empty record until the 
       user or a trigger queries the database. -->
  <!ATTLIST datasource prequery %boolean;>
  <!-- primarykey: Comma-separated list of the fields that make up the primary 
       key. -->
  <!ATTLIST datasource primarykey %text; #IMPLIED>
  <!-- primarykeyseq: Name of the sequence used to populate a primary key 
       (only applies to relational backends that support sequences; requires a 
       single {primarykey} value. -->
  <!ATTLIST datasource primarykeyseq %text; #IMPLIED>
  <!-- requery: Requery a record after posting it; requires {primarykey} 
       support and a non-null primary key value at the time of update (whether 
       via a trigger or by the use of {primarykeyseq}. -->
  <!ATTLIST datasource requery %boolean;>
  <!-- rowid: Name of the field to use as Row-ID if the connection does not 
       support row ids. -->
  <!ATTLIST datasource rowid %text; #IMPLIED>
  <!-- table: The table in the database this datasource will point to. -->
  <!ATTLIST datasource table %name; "">
  <!ATTLIST datasource type %name; "object">

<!-- Top-level element that encloses all the logic and visuals that the user 
     interface will show to the user. -->
<!ELEMENT dialog (action*, connection*, datasource*, dialog*, import-action*, 
                  import-datasource*, import-dialog*, import-layout?, 
                  import-logic?, import-trigger*, layout?, logic?, menu*, 
                  options*, parameter*, toolbar*, trigger*)>
  <!-- name: A unique name or ID for the form. -->
  <!ATTLIST dialog name ID #IMPLIED>
  <!-- readonly: If set to {Y}, then no modifications to data by the end user 
       will be allowed. The form will become a query-only form. -->
  <!ATTLIST dialog readonly %boolean;>
  <!-- style: Display as normal or dialog-style window. -->
  <!ATTLIST dialog style (dialog | normal) "dialog">
  <!-- title: The title of the form. -->
  <!ATTLIST dialog title %text; "Untitled Form">

<!-- A piece of code that can be bound to a button, a menu item, a toolbar 
     button or a trigger. -->
<!ELEMENT import-action EMPTY>
  <!-- name: Name of this element -->
  <!ATTLIST import-action name ID #REQUIRED>
  <!ATTLIST import-action library %name; #REQUIRED>
  <!-- description: Long text to use for this action -->
  <!ATTLIST import-action description %text; #IMPLIED>
  <!-- enabled: Determines whether this action can be run -->
  <!ATTLIST import-action enabled %boolean;>
  <!-- file: External file containing the source code -->
  <!ATTLIST import-action file %text; #IMPLIED>
  <!-- icon: Icon assigned with this action -->
  <!ATTLIST import-action icon %name; #IMPLIED>
  <!-- label: Short text to use for this action -->
  <!ATTLIST import-action label %text; #IMPLIED>
  <!-- language: Programming language the code is written in -->
  <!ATTLIST import-action language %name; #FIXED "python">

<!-- A datasource provides a link to a database table or some similar data 
     store. -->
<!ELEMENT import-datasource EMPTY>
  <!-- name: Unique name of the datasource. -->
  <!ATTLIST import-datasource name ID #REQUIRED>
  <!ATTLIST import-datasource library %name; #REQUIRED>
  <!-- cache: Cache this number of records -->
  <!ATTLIST import-datasource cache %whole; "5">
  <!-- connection: The name of the connection as in connections.conf that 
       points to a valid database. -->
  <!ATTLIST import-datasource connection %name; #IMPLIED>
  <!-- DEPRECATED: The "database" attribute of "import-datasource" has been 
                 deprecated [Use {connection} attribute instead] -->
  <!ATTLIST import-datasource database %name; #IMPLIED>
  <!-- detaillink: If this datasource is the child in a master/detail 
       relationship, this property contains a comma-separated list of the this 
       (child's) datasource's field(s) used for linking. -->
  <!ATTLIST import-datasource detaillink %text; #IMPLIED>
  <!-- detailmax: If this datasource is the child in a master/detail 
       relationship, this property specifies the maximum number of child 
       records that can be created. Usually, this is either omitted (for 
       one-to-many relationships) or 1 (for one-to-one relationships). -->
  <!ATTLIST import-datasource detailmax %whole; #IMPLIED>
  <!-- detailmin: If this datasource is the child in a master/detail 
       relationship, this property specifies the minimum number of child 
       records that must be present for a commit to be valid. Usually, this is 
       0 (for one-to-many relationships) or 1 (for one-to-one relationships). 
       -->
  <!ATTLIST import-datasource detailmin %whole; "0">
  <!-- distinct: TODO -->
  <!ATTLIST import-datasource distinct %boolean;>
  <!-- explicitfields: TODO -->
  <!ATTLIST import-datasource explicitfields %text; #IMPLIED>
  <!-- master: If this datasource is the child in a master/detail 
       relationship, this property contains the name of the master datasource. 
       -->
  <!ATTLIST import-datasource master %name; #IMPLIED>
  <!-- masterlink: If this datasource is the child in a master/detail 
       relationship, this property contains a comma-separated list of the 
       master datasource's field(s) used for linking. -->
  <!ATTLIST import-datasource masterlink %text; #IMPLIED>
  <!-- DEPRECATED: The "order_by" attribute of "import-datasource" has been 
                 deprecated [Use {sortorder} tag instead] -->
  <!ATTLIST import-datasource order_by %text; #IMPLIED>
  <!-- prequery: If true, the datasource is populated on form startup. If 
       false (default), the form starts out with an empty record until the 
       user or a trigger queries the database. -->
  <!ATTLIST import-datasource prequery %boolean;>
  <!-- primarykey: Comma-separated list of the fields that make up the primary 
       key. -->
  <!ATTLIST import-datasource primarykey %text; #IMPLIED>
  <!-- primarykeyseq: Name of the sequence used to populate a primary key 
       (only applies to relational backends that support sequences; requires a 
       single {primarykey} value. -->
  <!ATTLIST import-datasource primarykeyseq %text; #IMPLIED>
  <!-- requery: Requery a record after posting it; requires {primarykey} 
       support and a non-null primary key value at the time of update (whether 
       via a trigger or by the use of {primarykeyseq}. -->
  <!ATTLIST import-datasource requery %boolean;>
  <!-- rowid: Name of the field to use as Row-ID if the connection does not 
       support row ids. -->
  <!ATTLIST import-datasource rowid %text; #IMPLIED>
  <!-- table: The table in the database this datasource will point to. -->
  <!ATTLIST import-datasource table %name; "">
  <!ATTLIST import-datasource type %name; "object">

<!-- Top-level element that encloses all the logic and visuals that the user 
     interface will show to the user. -->
<!ELEMENT import-dialog EMPTY>
  <!ATTLIST import-dialog library %name; #REQUIRED>
  <!-- name: A unique name or ID for the form. -->
  <!ATTLIST import-dialog name ID #IMPLIED>
  <!-- readonly: If set to {Y}, then no modifications to data by the end user 
       will be allowed. The form will become a query-only form. -->
  <!ATTLIST import-dialog readonly %boolean;>
  <!-- style: Display as normal or dialog-style window. -->
  <!ATTLIST import-dialog style (dialog | normal) "dialog">
  <!-- title: The title of the form. -->
  <!ATTLIST import-dialog title %text; "Untitled Form">

<!-- Separation layer that contains all the visual elements on the form. -->
<!ELEMENT import-layout EMPTY>
  <!ATTLIST import-layout library %name; #REQUIRED>
  <!-- name: A unique name or ID for the form. -->
  <!ATTLIST import-layout name ID #IMPLIED>
  <!-- tabbed: Informs the UI subsystem to display a form's pages as notebook 
       tabs. Allowed values are {left}, {right}, {bottom}, {top}. If the UI 
       driver in use does not support the chosen tab position (or tabs at 
       all,) then the UI driver may choose another tab position. -->
  <!ATTLIST import-layout tabbed (bottom | left | none | right | top) "none">

<!-- Separation layer that contains "Business logic": blocks, fields, 
     block-level and field-level triggers. -->
<!ELEMENT import-logic EMPTY>
  <!ATTLIST import-logic library %name; #REQUIRED>

<!-- A piece of code that can be bound to a specific event. -->
<!ELEMENT import-trigger EMPTY>
  <!ATTLIST import-trigger library %name; #REQUIRED>
  <!-- file: External file containing the source code -->
  <!ATTLIST import-trigger file %text; #IMPLIED>
  <!-- language: Programming language the code is written in -->
  <!ATTLIST import-trigger language %name; #FIXED "python">
  <!-- name: Name of this element -->
  <!ATTLIST import-trigger name ID #IMPLIED>
  <!-- src: Name of a named trigger that contains the program code -->
  <!ATTLIST import-trigger src IDREF #IMPLIED>
  <!-- type: Type of the trigger. Can be either the name of the event that 
       should fire this trigger, or 'NAMED' for named triggers -->
  <!ATTLIST import-trigger type CDATA #IMPLIED>

<!-- Separation layer that contains all the visual elements on the form. -->
<!ELEMENT layout (import-page*, page*)>
  <!-- name: A unique name or ID for the form. -->
  <!ATTLIST layout name ID #IMPLIED>
  <!-- tabbed: Informs the UI subsystem to display a form's pages as notebook 
       tabs. Allowed values are {left}, {right}, {bottom}, {top}. If the UI 
       driver in use does not support the chosen tab position (or tabs at 
       all,) then the UI driver may choose another tab position. -->
  <!ATTLIST layout tabbed (bottom | left | none | right | top) "none">

<!-- Separation layer that contains "Business logic": blocks, fields, 
     block-level and field-level triggers. -->
<!ELEMENT logic (block*, import-block*)>

<!-- A menu or submenu containing menu items and/or submenus -->
<!ELEMENT menu (menu*, menuitem*)>
  <!-- name: Name of this element -->
  <!ATTLIST menu name ID #REQUIRED>
  <!-- label: Text to use if this is a submenu -->
  <!ATTLIST menu label %text; #IMPLIED>

<!-- TODO -->
<!ELEMENT options (author?, description?, name?, option*, tip?, title?, 
                   version?)>

<!-- A form can get parameters from the outer world or a calling form, and can 
     pass values back too in these parameters. -->
<!ELEMENT parameter EMPTY>
  <!-- name: Unique name of the parameter. -->
  <!ATTLIST parameter name ID #REQUIRED>
  <!-- datatype: The type of data for this parameter. -->
  <!ATTLIST parameter datatype (boolean | date | datetime | number | raw | 
                                text | time) "raw">
  <!-- default: Default value for the parameter, if the user does not provide 
       a value for it. -->
  <!ATTLIST parameter default %text; #IMPLIED>
  <!-- description: Description of the parameter for the help text. -->
  <!ATTLIST parameter description %text; #IMPLIED>
  <!-- length: Maximum length of data stored in this parameter. Applies only 
       to parameters with a datatype of 'string' or 'number'. For numbers, 
       this is the total number of digits, including the fractional digits. 
       -->
  <!ATTLIST parameter length %whole; #IMPLIED>
  <!-- required: If set, it is obligatory to provide this parameter to run the 
       form. -->
  <!ATTLIST parameter required %boolean;>
  <!-- scale: Number of fractional digits. Applies only to parameters with a 
       datatype of 'number'. -->
  <!ATTLIST parameter scale %whole; #IMPLIED>
  <!-- DEPRECATED: The "type" attribute of "parameter" has been deprecated 
                 [Use "datatype" instead.] -->
  <!ATTLIST parameter type %name; #IMPLIED>

<!-- A toolbar containing tool buttons -->
<!ELEMENT toolbar (toolbutton*)>
  <!-- name: Name of this element -->
  <!ATTLIST toolbar name ID #REQUIRED>

<!-- A piece of code that can be bound to a specific event. -->
<!ELEMENT trigger EMPTY>
  <!-- file: External file containing the source code -->
  <!ATTLIST trigger file %text; #IMPLIED>
  <!-- language: Programming language the code is written in -->
  <!ATTLIST trigger language %name; #FIXED "python">
  <!-- name: Name of this element -->
  <!ATTLIST trigger name ID #IMPLIED>
  <!-- src: Name of a named trigger that contains the program code -->
  <!ATTLIST trigger src IDREF #IMPLIED>
  <!-- type: Type of the trigger. Can be either the name of the event that 
       should fire this trigger, or 'NAMED' for named triggers -->
  <!ATTLIST trigger type CDATA #IMPLIED>


<!-- ============================ -->
<!-- Child elements of datasource -->
<!-- ============================ -->
<!ELEMENT condition (and*, between*, eq*, exist*, ge*, gt*, le*, like*, lt*, 
                     ne*, not*, notbetween*, notlike*, notnull*, null*, or*)>

<!ELEMENT sortorder (sortfield*)>

<!ELEMENT sql EMPTY>

<!ELEMENT staticset (staticsetrow*)>
  <!ATTLIST staticset fields %text; #REQUIRED>


<!-- ======================== -->
<!-- Child elements of layout -->
<!-- ======================== -->
<!-- Encapsulates visual elements to be displayed on a page. -->
<!ELEMENT import-page EMPTY>
  <!ATTLIST import-page library %name; #REQUIRED>
  <!-- caption: For {tabbed} or {popup} pages, this contains the caption to 
       use for the page. -->
  <!ATTLIST import-page caption %text; #IMPLIED>
  <!-- name: A unique ID for the widget. This is only useful when importing 
       pages from a library. -->
  <!ATTLIST import-page name ID #IMPLIED>
  <!-- style: The type of page. -->
  <!ATTLIST import-page style %name; #FIXED "normal">
  <!-- transparent: If set, then you can tab out of the page via next- or 
       previous-field events. Makes navigation in mutlipage forms easier. If 
       false, focus stays within a page until user explicitly moves to another 
       page -->
  <!ATTLIST import-page transparent %boolean;>

<!-- Encapsulates visual elements to be displayed on a page. -->
<!ELEMENT page (box*, button*, component*, entry*, grid*, hbox*, image*, 
                import-button*, label*, scrollbar*, vbox*)>
  <!-- caption: For {tabbed} or {popup} pages, this contains the caption to 
       use for the page. -->
  <!ATTLIST page caption %text; #IMPLIED>
  <!-- name: A unique ID for the widget. This is only useful when importing 
       pages from a library. -->
  <!ATTLIST page name ID #IMPLIED>
  <!-- style: The type of page. -->
  <!ATTLIST page style %name; #FIXED "normal">
  <!-- transparent: If set, then you can tab out of the page via next- or 
       previous-field events. Makes navigation in mutlipage forms easier. If 
       false, focus stays within a page until user explicitly moves to another 
       page -->
  <!ATTLIST page transparent %boolean;>


<!-- ======================= -->
<!-- Child elements of logic -->
<!-- ======================= -->
<!-- A block contains instructions on how Forms should interact with a 
     datasource. -->
<!ELEMENT block (field*, import-field*)>
  <!-- name: A unique ID (name) for the widget. No blocks can share the same 
       name without causing namespace collisions in user triggers. -->
  <!ATTLIST block name ID #REQUIRED>
  <!-- autoClear: If set, then the block is cleared/emptied on a commit. -->
  <!ATTLIST block autoClear %boolean;>
  <!-- autoCommit: If set, then the datasource will automatically commit 
       changes when trying to navigate out of the current record. -->
  <!ATTLIST block autoCommit %boolean;>
  <!-- autoCreate: If set, then if you attempt to go to the next record while 
       at the last record, a new record is created. -->
  <!ATTLIST block autoCreate %boolean;>
  <!-- autoNextRecord: If set, then if you tab at the end of a block, you will 
       be taken to the next record. If the current record is empty and 
       transparent is true, then you will be taken to the next block -->
  <!ATTLIST block autoNextRecord %boolean;>
  <!-- datasource: The name of a datasource (defined in by a {<datasource>} 
       tag) that provides this block with it's data. -->
  <!ATTLIST block datasource IDREF #IMPLIED>
  <!-- deletable: Can records be deleted? -->
  <!ATTLIST block deletable %boolean;>
  <!-- editable: Can records be edited/created? -->
  <!ATTLIST block editable (N | Y | new | update) "Y">
  <!-- navigable: Can this block be navigated? -->
  <!ATTLIST block navigable %boolean;>
  <!-- queryable: Can records be queried? -->
  <!ATTLIST block queryable %boolean;>
  <!-- DEPRECATED: The "restrictDelete" attribute of "block" has been 
                 deprecated [Use deletable="N"] -->
  <!-- restrictDelete: If set then the user will be unable to request that a 
       record be deleted via the user interface. -->
  <!ATTLIST block restrictDelete %boolean;>
  <!-- DEPRECATED: The "restrictInsert" attribute of "block" has been 
                 deprecated [Use editable="update"] -->
  <!-- restrictInsert: If set then the user will be unable to request that new 
       records be inserted into the block. -->
  <!ATTLIST block restrictInsert %boolean;>
  <!-- rowSpacer: Adjusts the vertical gap of this number of rows between 
       duplicated widgets. Serves the same purpose as some of the gap 
       attributes on individual widgets. -->
  <!ATTLIST block rowSpacer %whole; #IMPLIED>
  <!-- rows: Any widgets inside the block will display this number of copies 
       in a verticle column. Simulates a grid entry system. -->
  <!ATTLIST block rows %whole; #IMPLIED>
  <!-- startup: State in which the block will be on form startup. 'Empty' 
       means the block is filled with a single empty record, 'full' means the 
       block is populated with the result of a full query. -->
  <!ATTLIST block startup (empty | full) "empty">
  <!-- transparent: If set, then you can tab out of the block via next- or 
       previous-field events. Makes navigation in multiblock forms easier. If 
       false, focus stays within a block until user explicitly moves to 
       another block. Note that a block's {autoNextRecord}setting affects 
       {transparent} behavior -->
  <!ATTLIST block transparent %boolean;>

<!-- A block contains instructions on how Forms should interact with a 
     datasource. -->
<!ELEMENT import-block EMPTY>
  <!-- name: A unique ID (name) for the widget. No blocks can share the same 
       name without causing namespace collisions in user triggers. -->
  <!ATTLIST import-block name ID #REQUIRED>
  <!ATTLIST import-block library %name; #REQUIRED>
  <!-- autoClear: If set, then the block is cleared/emptied on a commit. -->
  <!ATTLIST import-block autoClear %boolean;>
  <!-- autoCommit: If set, then the datasource will automatically commit 
       changes when trying to navigate out of the current record. -->
  <!ATTLIST import-block autoCommit %boolean;>
  <!-- autoCreate: If set, then if you attempt to go to the next record while 
       at the last record, a new record is created. -->
  <!ATTLIST import-block autoCreate %boolean;>
  <!-- autoNextRecord: If set, then if you tab at the end of a block, you will 
       be taken to the next record. If the current record is empty and 
       transparent is true, then you will be taken to the next block -->
  <!ATTLIST import-block autoNextRecord %boolean;>
  <!-- datasource: The name of a datasource (defined in by a {<datasource>} 
       tag) that provides this block with it's data. -->
  <!ATTLIST import-block datasource IDREF #IMPLIED>
  <!-- deletable: Can records be deleted? -->
  <!ATTLIST import-block deletable %boolean;>
  <!-- editable: Can records be edited/created? -->
  <!ATTLIST import-block editable (N | Y | new | update) "Y">
  <!-- navigable: Can this block be navigated? -->
  <!ATTLIST import-block navigable %boolean;>
  <!-- queryable: Can records be queried? -->
  <!ATTLIST import-block queryable %boolean;>
  <!-- DEPRECATED: The "restrictDelete" attribute of "import-block" has been 
                 deprecated [Use deletable="N"] -->
  <!-- restrictDelete: If set then the user will be unable to request that a 
       record be deleted via the user interface. -->
  <!ATTLIST import-block restrictDelete %boolean;>
  <!-- DEPRECATED: The "restrictInsert" attribute of "import-block" has been 
                 deprecated [Use editable="update"] -->
  <!-- restrictInsert: If set then the user will be unable to request that new 
       records be inserted into the block. -->
  <!ATTLIST import-block restrictInsert %boolean;>
  <!-- rowSpacer: Adjusts the vertical gap of this number of rows between 
       duplicated widgets. Serves the same purpose as some of the gap 
       attributes on individual widgets. -->
  <!ATTLIST import-block rowSpacer %whole; #IMPLIED>
  <!-- rows: Any widgets inside the block will display this number of copies 
       in a verticle column. Simulates a grid entry system. -->
  <!ATTLIST import-block rows %whole; #IMPLIED>
  <!-- startup: State in which the block will be on form startup. 'Empty' 
       means the block is filled with a single empty record, 'full' means the 
       block is populated with the result of a full query. -->
  <!ATTLIST import-block startup (empty | full) "empty">
  <!-- transparent: If set, then you can tab out of the block via next- or 
       previous-field events. Makes navigation in multiblock forms easier. If 
       false, focus stays within a block until user explicitly moves to 
       another block. Note that a block's {autoNextRecord}setting affects 
       {transparent} behavior -->
  <!ATTLIST import-block transparent %boolean;>


<!-- ====================== -->
<!-- Child elements of menu -->
<!-- ====================== -->
<!-- A menu item that fires a trigger when selected -->
<!ELEMENT menuitem EMPTY>
  <!-- name: Name of this element -->
  <!ATTLIST menuitem name ID #REQUIRED>
  <!-- action: Name of the trigger to run whenever this menu item is selected 
       -->
  <!ATTLIST menuitem action IDREF #IMPLIED>
  <!-- action_off: Name of the trigger to run whenever this menu item is 
       switched to off -->
  <!ATTLIST menuitem action_off IDREF #IMPLIED>
  <!-- description: Text to display in the status bar for this menu item -->
  <!ATTLIST menuitem description %text; #IMPLIED>
  <!-- enabled: Determines whether this menu item will be enabled by default 
       -->
  <!ATTLIST menuitem enabled %boolean;>
  <!-- hotkey: Hotkey to assign to this menu item -->
  <!ATTLIST menuitem hotkey %text; #IMPLIED>
  <!-- icon: Icon to display besides this menu item -->
  <!ATTLIST menuitem icon %name; #IMPLIED>
  <!-- label: Text to use for this menu item -->
  <!ATTLIST menuitem label %text; #IMPLIED>
  <!-- state: Determines whether this menu item will be switched on by default 
       -->
  <!ATTLIST menuitem state %boolean;>


<!-- ========================= -->
<!-- Child elements of options -->
<!-- ========================= -->
<!-- TODO -->
<!ELEMENT author EMPTY>
  <!-- name: TODO -->
  <!ATTLIST author name %name; #FIXED "author">
  <!-- value: TODO -->
  <!ATTLIST author value %text; #IMPLIED>

<!-- TODO -->
<!ELEMENT description EMPTY>
  <!-- name: TODO -->
  <!ATTLIST description name %name; #FIXED "description">
  <!-- value: TODO -->
  <!ATTLIST description value %text; #IMPLIED>

<!-- TODO -->
<!ELEMENT name EMPTY>
  <!-- name: TODO -->
  <!ATTLIST name name %name; #FIXED "name">
  <!-- value: TODO -->
  <!ATTLIST name value %text; #IMPLIED>

<!-- TODO -->
<!ELEMENT option EMPTY>
  <!-- name: TODO -->
  <!ATTLIST option name %name; #REQUIRED>
  <!-- value: TODO -->
  <!ATTLIST option value %text; #IMPLIED>

<!-- TODO -->
<!ELEMENT tip EMPTY>
  <!-- name: TODO -->
  <!ATTLIST tip name %name; #FIXED "tip">
  <!-- value: TODO -->
  <!ATTLIST tip value %text; #IMPLIED>

<!-- DEPRECATED: Use of the <title> element has been deprecated [Use the 
                 <form> attribute "title" instead.] -->
<!-- TODO -->
<!ELEMENT title EMPTY>
  <!-- name: TODO -->
  <!ATTLIST title name %name; #FIXED "title">
  <!-- value: TODO -->
  <!ATTLIST title value %text; #IMPLIED>

<!-- TODO -->
<!ELEMENT version EMPTY>
  <!-- name: TODO -->
  <!ATTLIST version name %name; #FIXED "version">
  <!-- value: TODO -->
  <!ATTLIST version value %text; #IMPLIED>


<!-- ========================= -->
<!-- Child elements of toolbar -->
<!-- ========================= -->
<!-- A button on a toolbar -->
<!ELEMENT toolbutton EMPTY>
  <!-- name: Name of this element -->
  <!ATTLIST toolbutton name ID #REQUIRED>
  <!-- action: Name of the trigger to run whenever this button is clicked -->
  <!ATTLIST toolbutton action IDREF #IMPLIED>
  <!-- action_off: Name of the trigger to run whenever this button is switched 
       to off -->
  <!ATTLIST toolbutton action_off IDREF #IMPLIED>
  <!-- description: Text to display in a tooltip window -->
  <!ATTLIST toolbutton description %text; #IMPLIED>
  <!-- enabled: Determines whether this button will be enabled by default -->
  <!ATTLIST toolbutton enabled %boolean;>
  <!-- icon: Icon to display on the button -->
  <!ATTLIST toolbutton icon %name; #IMPLIED>
  <!-- label: Text to display on the button -->
  <!ATTLIST toolbutton label %text; #IMPLIED>
  <!-- state: Determines whether this button will be switched on by default 
       -->
  <!ATTLIST toolbutton state %boolean;>


<!-- =========================== -->
<!-- Child elements of condition -->
<!-- =========================== -->
<!-- Implements logical AND relation. -->
<!ELEMENT and (and*, between*, eq*, exist*, ge*, gt*, le*, like*, lt*, ne*, 
               not*, notbetween*, notlike*, notnull*, null*, or*)>

<!-- Implements a {field} BETWEEN {value1} {value2} condition. -->
<!ELEMENT between (add*, cconst*, cfield*, cparam*, div*, lower*, mul*, 
                   negate*, sub*, upper*)>

<!-- Implements a {field} = {value} condition. -->
<!ELEMENT eq (add*, cconst*, cfield*, cparam*, div*, lower*, mul*, negate*, 
              sub*, upper*)>

<!-- Implements an exist condition. -->
<!ELEMENT exist (and*, between*, eq*, exist*, ge*, gt*, le*, like*, lt*, ne*, 
                 not*, notbetween*, notlike*, notnull*, null*, or*)>
  <!ATTLIST exist detaillink %text; #REQUIRED>
  <!ATTLIST exist masterlink %text; #REQUIRED>
  <!ATTLIST exist table %name; #REQUIRED>

<!-- Implements a {field} >= {value} condition. -->
<!ELEMENT ge (add*, cconst*, cfield*, cparam*, div*, lower*, mul*, negate*, 
              sub*, upper*)>

<!-- Implements a {field} > {value} condition. -->
<!ELEMENT gt (add*, cconst*, cfield*, cparam*, div*, lower*, mul*, negate*, 
              sub*, upper*)>

<!-- Implements a {field} <= {value} condition. -->
<!ELEMENT le (add*, cconst*, cfield*, cparam*, div*, lower*, mul*, negate*, 
              sub*, upper*)>

<!-- Implements a {field} LIKE {value} condition. -->
<!ELEMENT like (cconst*, cfield*, cparam*, lower*, upper*)>

<!-- Implements a {field} < {value} condition. -->
<!ELEMENT lt (add*, cconst*, cfield*, cparam*, div*, lower*, mul*, negate*, 
              sub*, upper*)>

<!-- Implements a {field} <> {value} condition. -->
<!ELEMENT ne (add*, cconst*, cfield*, cparam*, div*, lower*, mul*, negate*, 
              sub*, upper*)>

<!-- Implements logical NOT relation. -->
<!ELEMENT not (and*, between*, eq*, exist*, ge*, gt*, le*, like*, lt*, ne*, 
               not*, notbetween*, notlike*, notnull*, null*, or*)>

<!-- Implements a {field} NOT BETWEEN {value1} {value2} condition. -->
<!ELEMENT notbetween (add*, cconst*, cfield*, cparam*, div*, lower*, mul*, 
                      negate*, sub*, upper*)>

<!-- Implements a {field} NOT LIKE {value} condition. -->
<!ELEMENT notlike (cconst*, cfield*, cparam*, lower*, upper*)>

<!-- Implements a {field} IS NOT NULL condition. -->
<!ELEMENT notnull (cfield*)>

<!-- Implements a {field} IS NULL condition. -->
<!ELEMENT null (cfield*)>

<!-- Implements logical OR relation. -->
<!ELEMENT or (and*, between*, eq*, exist*, ge*, gt*, le*, like*, lt*, ne*, 
              not*, notbetween*, notlike*, notnull*, null*, or*)>


<!-- =========================== -->
<!-- Child elements of sortorder -->
<!-- =========================== -->
<!ELEMENT sortfield EMPTY>
  <!-- name: The name of the field by which the datasource will be ordered. 
       -->
  <!ATTLIST sortfield name ID #REQUIRED>
  <!-- descending: Selects if the ordering is done in ascending (default) or 
       in descending order. -->
  <!ATTLIST sortfield descending %boolean;>
  <!-- ignorecase: Selects wether the ordering is case-sensitive or not. -->
  <!ATTLIST sortfield ignorecase %boolean;>


<!-- =========================== -->
<!-- Child elements of staticset -->
<!-- =========================== -->
<!ELEMENT staticsetrow (staticsetfield*)>


<!-- ====================== -->
<!-- Child elements of page -->
<!-- ====================== -->
<!-- A box is a visual element that draws a box around other visual elements, 
     thus providing logical separation for them. -->
<!ELEMENT box (box*, button*, component*, entry*, grid*, hbox*, image*, 
               import-button*, label*, scrollbar*, vbox*)>
  <!-- focusorder: Defines what order the focus moves through entries. -->
  <!ATTLIST box focusorder %whole; #IMPLIED>
  <!-- label: An optional text label that will be displayed on the border. -->
  <!ATTLIST box label %text; #IMPLIED>
  <!-- name: The unique name of the box. -->
  <!ATTLIST box name ID #IMPLIED>

<!-- A visual element with text placed on it, that the user can push or click, 
     and that event can run a bound trigger. -->
<!ELEMENT button EMPTY>
  <!-- action: Action to be executed when the button is fired -->
  <!ATTLIST button action %name; #IMPLIED>
  <!-- block: The (optional) name of the block that this ties to. If a button 
       is associated with a block, then the button honors the block's rows= 
       value. -->
  <!ATTLIST button block IDREF #IMPLIED>
  <!-- focusorder: Defines what order the focus moves through entries. -->
  <!ATTLIST button focusorder %whole; #IMPLIED>
  <!-- label: The text that should appear on the button -->
  <!ATTLIST button label %name; #IMPLIED>
  <!-- name: A unique ID for the widget. Useful for importable buttons. -->
  <!ATTLIST button name ID #IMPLIED>
  <!-- navigable: Can this button be navigated? -->
  <!ATTLIST button navigable %boolean;>
  <!-- rowSpacer: Overriders the rowSpace setting defined at the block level. 
       -->
  <!ATTLIST button rowSpacer %whole; #IMPLIED>
  <!-- rows: Overrides the rows setting defined at the block level. -->
  <!ATTLIST button rows %whole; #IMPLIED>

<!-- TODO -->
<!ELEMENT component EMPTY>
  <!-- block: The name of the block that this ties to. -->
  <!ATTLIST component block IDREF #REQUIRED>
  <!-- field: The name of the field that this ties to. -->
  <!ATTLIST component field IDREF #REQUIRED>
  <!-- mimetype: TODO -->
  <!ATTLIST component mimetype %name; #REQUIRED>
  <!-- focusorder: Defines what order the focus moves through entries. -->
  <!ATTLIST component focusorder %whole; #IMPLIED>
  <!-- name: The unique name of the component. -->
  <!ATTLIST component name ID #IMPLIED>
  <!-- type: TODO -->
  <!ATTLIST component type (Base64 | URL) "URL">

<!-- An {entry} is the visual counterpart to a {field}, it defines how the 
     data in a field will be displayed and how it can be edited. -->
<!ELEMENT entry EMPTY>
  <!-- field: The name of the field that this ties to. -->
  <!ATTLIST entry field IDREF #REQUIRED>
  <!-- block: The name of the block that this ties to. -->
  <!ATTLIST entry block IDREF #IMPLIED>
  <!-- displaymask: Defines how the field data will be formatted for display. 
       -->
  <!ATTLIST entry displaymask %text; #IMPLIED>
  <!-- focusorder: Defines what order the focus moves through entries. -->
  <!ATTLIST entry focusorder %whole; #IMPLIED>
  <!-- formatmask: TODO -->
  <!ATTLIST entry formatmask %text; #IMPLIED>
  <!-- grid_link: If an entry is linked to a grid, the user will be able to 
       use the cursor up/down and page up/down keys to move around in the grid 
       while the focus actually is in this entry. -->
  <!ATTLIST entry grid_link %name; #IMPLIED>
  <!-- DEPRECATED: The "hidden" attribute of "entry" has been deprecated [Use 
                 a field without entry instead] -->
  <!ATTLIST entry hidden %boolean;>
  <!-- inputmask: Defines how the user will edit a field's value. -->
  <!ATTLIST entry inputmask %text; #IMPLIED>
  <!-- label: The optional label displayed next to checkbox. -->
  <!ATTLIST entry label %text; #IMPLIED>
  <!-- name: The unique ID of the entry. -->
  <!ATTLIST entry name ID #IMPLIED>
  <!-- navigable: If false, the user will be unable to navigate to this entry. 
       Triggers can still alter the value though. -->
  <!ATTLIST entry navigable %boolean;>
  <!-- rowSpacer: Overrides the rowSpacer setting at the block level. -->
  <!ATTLIST entry rowSpacer %whole; #IMPLIED>
  <!-- rows: Overrides the rows setting defined at the block level. -->
  <!ATTLIST entry rows %whole; #IMPLIED>
  <!-- style: The style of entry widget requested. Currently either {text}, 
       {label}, {checkbox}, {listbox}, or {dropdown}. To use {listbox} or 
       {dropdown} you are required to use both the {fk_source}, {fk_key}, and 
       {fk_description} attributes. The {label} style implies the {readonly} 
       attribute. -->
  <!ATTLIST entry style (auto | checkbox | default | dropdown | label | 
                         listbox | multiline | password) "auto">

<!-- A grid is a layout container grouping fields into repeating rows. -->
<!ELEMENT grid EMPTY>
  <!-- block: The block for this grid. -->
  <!ATTLIST grid block %name; #IMPLIED>
  <!-- name: The unique ID of the grid. -->
  <!ATTLIST grid name ID #IMPLIED>
  <!-- rows: Overrides the rows setting defined at the block level. -->
  <!ATTLIST grid rows %whole; #IMPLIED>

<!-- A box is a visual element that draws a box around other visual elements, 
     thus providing logical separation for them. -->
<!ELEMENT hbox (button*, component*, entry*, grid*, hbox*, image*, 
                import-button*, label*, scrollbar*, vbox*)>
  <!-- block: The {block} to which this scrollbar scrolls. -->
  <!ATTLIST hbox block IDREF #IMPLIED>
  <!-- label: An optional text label that will be displayed on the border. -->
  <!ATTLIST hbox label %text; #IMPLIED>
  <!-- name: The unique name of the box. -->
  <!ATTLIST hbox name ID #IMPLIED>

<!-- Displays an image. -->
<!ELEMENT image EMPTY>
  <!-- block: The name of the block that this ties to. -->
  <!ATTLIST image block IDREF #REQUIRED>
  <!-- field: The name of the field that this ties to. -->
  <!ATTLIST image field IDREF #REQUIRED>
  <!-- editable: Only allow this object to be edited if it is currently empty. 
       -->
  <!ATTLIST image editable (N | Y | new | null | update) "Y">
  <!-- fit: Defines how the image will fill the space provided for it (crop 
       parts outside borders, or stretch width/height/both to fit into given 
       boundaries). -->
  <!ATTLIST image fit (auto | both | height | none | width) "none">
  <!-- focusorder: Defines what order the focus moves through entries. -->
  <!ATTLIST image focusorder %whole; #IMPLIED>
  <!-- label: Label displayed next or above to the image -->
  <!ATTLIST image label %text; #IMPLIED>
  <!-- name: The unique name of the image. -->
  <!ATTLIST image name ID #IMPLIED>
  <!-- type: The type of image reference. Can be {URL} for a url reference, or 
       {PIL} for an embedded image. -->
  <!ATTLIST image type (PIL | URL) "URL">

<!-- A visual element with text placed on it, that the user can push or click, 
     and that event can run a bound trigger. -->
<!ELEMENT import-button EMPTY>
  <!ATTLIST import-button library %name; #REQUIRED>
  <!-- action: Action to be executed when the button is fired -->
  <!ATTLIST import-button action %name; #IMPLIED>
  <!-- block: The (optional) name of the block that this ties to. If a button 
       is associated with a block, then the button honors the block's rows= 
       value. -->
  <!ATTLIST import-button block IDREF #IMPLIED>
  <!-- focusorder: Defines what order the focus moves through entries. -->
  <!ATTLIST import-button focusorder %whole; #IMPLIED>
  <!-- label: The text that should appear on the button -->
  <!ATTLIST import-button label %name; #IMPLIED>
  <!-- name: A unique ID for the widget. Useful for importable buttons. -->
  <!ATTLIST import-button name ID #IMPLIED>
  <!-- navigable: Can this button be navigated? -->
  <!ATTLIST import-button navigable %boolean;>
  <!-- rowSpacer: Overriders the rowSpace setting defined at the block level. 
       -->
  <!ATTLIST import-button rowSpacer %whole; #IMPLIED>
  <!-- rows: Overrides the rows setting defined at the block level. -->
  <!ATTLIST import-button rows %whole; #IMPLIED>

<!-- Displays static text -->
<!ELEMENT label EMPTY>
  <!-- text: The text to be displayed. -->
  <!ATTLIST label text %text; #REQUIRED>
  <!-- alignment: The justification of the label. Can be one of the following: 
       {left}, {right}, or {center}. Requires that the {width} attribute be 
       set. -->
  <!ATTLIST label alignment (center | left | right) "left">
  <!-- for: If this label is for a specific object, name it here. -->
  <!ATTLIST label for IDREF #IMPLIED>
  <!-- name: The unique ID of the label. -->
  <!ATTLIST label name ID #IMPLIED>
  <!-- rowSpacer: Overriders the rowSpace setting defined at the block level. 
       -->
  <!ATTLIST label rowSpacer %whole; #IMPLIED>
  <!-- rows: Overrides the rows setting defined at the block level. -->
  <!ATTLIST label rows %whole; #IMPLIED>

<!-- A scrollbar is a visual element that lets the user move vertically layout 
     elements linked to it. -->
<!ELEMENT scrollbar EMPTY>
  <!-- block: The {block} to which this scrollbar scrolls. -->
  <!ATTLIST scrollbar block IDREF #REQUIRED>
  <!-- name: The unique name of the scrollbar. -->
  <!ATTLIST scrollbar name ID #IMPLIED>
  <!-- scrollrows: Defaults to the rows setting defined at the block level. 
       -->
  <!ATTLIST scrollbar scrollrows %whole; #IMPLIED>

<!-- A box is a visual element that draws a box around other visual elements, 
     thus providing logical separation for them. -->
<!ELEMENT vbox (button*, component*, entry*, grid*, hbox*, image*, 
                import-button*, label*, scrollbar*, vbox*)>
  <!-- block: The {block} to which this scrollbar scrolls. -->
  <!ATTLIST vbox block IDREF #IMPLIED>
  <!-- label: An optional text label that will be displayed on the border. -->
  <!ATTLIST vbox label %text; #IMPLIED>
  <!-- name: The unique name of the box. -->
  <!ATTLIST vbox name ID #IMPLIED>


<!-- ======================= -->
<!-- Child elements of block -->
<!-- ======================= -->
<!-- A field represents a column in the database table designated by the 
     block. -->
<!ELEMENT field EMPTY>
  <!-- name: The unique ID of the entry. Referenced in master/detail setups as 
       well as triggers. -->
  <!ATTLIST field name ID #REQUIRED>
  <!-- autoquery: If {Y} then any changes in this field will cause the form to 
       automatically query and populate itself with matching records. If {New} 
       it will only automatically query if the form is currenly completely 
       empty. If {N} then no automatic query will be performed. -->
  <!ATTLIST field autoquery (N | Y | new) "N">
  <!-- case: Convert the value to uppercase/lowercase or leave it as it is. 
       Applies only to fields with a datatype of 'string'. -->
  <!ATTLIST field case (lower | mixed | upper) "mixed">
  <!-- datatype: The type of data stored in this field. -->
  <!ATTLIST field datatype (boolean | date | datetime | number | raw | text | 
                            time) "raw">
  <!-- default: The default value for this field when a new record is created. 
       If the field is visible the user can override the value. -->
  <!ATTLIST field default %text; #IMPLIED>
  <!-- defaultToLast: If {Y}, then new records will default to the last value 
       the user entered for this field. If no new values have been entered, 
       then defaults back to the normal {default} setting. -->
  <!ATTLIST field defaultToLast %boolean;>
  <!-- editable: Only allow this object to be edited if it is currently empty. 
       -->
  <!ATTLIST field editable (N | Y | new | null | update) "Y">
  <!-- field: The name of the field in the datasource to which this widget is 
       tied. -->
  <!ATTLIST field field %name; #IMPLIED>
  <!-- fk_description: The description used if a style of dropdown is 
       selected. This field's value is displayed in the dropdown but the 
       foreign_key value is actually stored in the field. This allows you to 
       display something like the full name of a US state but only store it's 
       2 character abbreviation. -->
  <!ATTLIST field fk_description %name; #IMPLIED>
  <!-- fk_key: The table column (field) in the foreign key source table that 
       the foreign key links to. -->
  <!ATTLIST field fk_key %name; #IMPLIED>
  <!-- fk_refresh: Decides when the foreign key should be refreshed. -->
  <!ATTLIST field fk_refresh (change | commit | startup) "startup">
  <!-- fk_source: Source table that the foreign key links to. -->
  <!ATTLIST field fk_source IDREF #IMPLIED>
  <!-- length: Maximum length of data stored in this field. Applies only to 
       fields with a datatype of 'string' or 'number'. For numbers, this is 
       the total number of digits, including the fractional digits. -->
  <!ATTLIST field length %whole; #IMPLIED>
  <!-- ltrim: Trim extraneous space at beginning of user input. -->
  <!ATTLIST field ltrim %boolean;>
  <!-- DEPRECATED: The "maxLength" attribute of "field" has been deprecated 
                 [Use length] -->
  <!ATTLIST field maxLength %whole; #IMPLIED>
  <!-- DEPRECATED: The "max_length" attribute of "field" has been deprecated 
                 [Use length] -->
  <!-- max_length: The maximum number of characters the user is allowed to 
       enter into the entry. -->
  <!ATTLIST field max_length %whole; #IMPLIED>
  <!-- minLength: The minimum number of characters the user must enter into 
       the entry. -->
  <!ATTLIST field minLength %whole; "0">
  <!-- DEPRECATED: The "min_length" attribute of "field" has been deprecated 
                 [Use minLength] -->
  <!-- min_length: The minimum number of characters the user must enter into 
       the entry. -->
  <!ATTLIST field min_length %whole; "0">
  <!-- queryDefault: The field will be populated with this value automatically 
       when a query is requested. If the field is visible the user can still 
       override the value. -->
  <!ATTLIST field queryDefault %text; #IMPLIED>
  <!-- query_casesensitive: If "N", the entry widget ignores the case of the 
       information entered into the query mask. -->
  <!ATTLIST field query_casesensitive %boolean;>
  <!-- queryable: Is this object queryable? -->
  <!ATTLIST field queryable %boolean;>
  <!-- required: If set, empty values can not be stored in this field. -->
  <!ATTLIST field required %boolean;>
  <!-- rtrim: Trim extraneous space at end of user input. -->
  <!ATTLIST field rtrim %boolean;>
  <!-- scale: Number of fractional digits. Applies only to fields with a 
       datatype of 'number'. -->
  <!ATTLIST field scale %whole; #IMPLIED>
  <!-- DEPRECATED: The "typecast" attribute of "field" has been deprecated 
                 [Use "type".] -->
  <!ATTLIST field typecast %name; #IMPLIED>
  <!-- DEPRECATED: The "value" attribute of "field" has been deprecated [Use 
                 default="..." instead] -->
  <!-- value: Deprecated -->
  <!ATTLIST field value %text; #IMPLIED>

<!-- A field represents a column in the database table designated by the 
     block. -->
<!ELEMENT import-field EMPTY>
  <!-- name: The unique ID of the entry. Referenced in master/detail setups as 
       well as triggers. -->
  <!ATTLIST import-field name ID #REQUIRED>
  <!ATTLIST import-field library %name; #REQUIRED>
  <!-- autoquery: If {Y} then any changes in this field will cause the form to 
       automatically query and populate itself with matching records. If {New} 
       it will only automatically query if the form is currenly completely 
       empty. If {N} then no automatic query will be performed. -->
  <!ATTLIST import-field autoquery (N | Y | new) "N">
  <!-- case: Convert the value to uppercase/lowercase or leave it as it is. 
       Applies only to fields with a datatype of 'string'. -->
  <!ATTLIST import-field case (lower | mixed | upper) "mixed">
  <!-- datatype: The type of data stored in this field. -->
  <!ATTLIST import-field datatype (boolean | date | datetime | number | raw | 
                                   text | time) "raw">
  <!-- default: The default value for this field when a new record is created. 
       If the field is visible the user can override the value. -->
  <!ATTLIST import-field default %text; #IMPLIED>
  <!-- defaultToLast: If {Y}, then new records will default to the last value 
       the user entered for this field. If no new values have been entered, 
       then defaults back to the normal {default} setting. -->
  <!ATTLIST import-field defaultToLast %boolean;>
  <!-- editable: Only allow this object to be edited if it is currently empty. 
       -->
  <!ATTLIST import-field editable (N | Y | new | null | update) "Y">
  <!-- field: The name of the field in the datasource to which this widget is 
       tied. -->
  <!ATTLIST import-field field %name; #IMPLIED>
  <!-- fk_description: The description used if a style of dropdown is 
       selected. This field's value is displayed in the dropdown but the 
       foreign_key value is actually stored in the field. This allows you to 
       display something like the full name of a US state but only store it's 
       2 character abbreviation. -->
  <!ATTLIST import-field fk_description %name; #IMPLIED>
  <!-- fk_key: The table column (field) in the foreign key source table that 
       the foreign key links to. -->
  <!ATTLIST import-field fk_key %name; #IMPLIED>
  <!-- fk_refresh: Decides when the foreign key should be refreshed. -->
  <!ATTLIST import-field fk_refresh (change | commit | startup) "startup">
  <!-- fk_source: Source table that the foreign key links to. -->
  <!ATTLIST import-field fk_source IDREF #IMPLIED>
  <!-- length: Maximum length of data stored in this field. Applies only to 
       fields with a datatype of 'string' or 'number'. For numbers, this is 
       the total number of digits, including the fractional digits. -->
  <!ATTLIST import-field length %whole; #IMPLIED>
  <!-- ltrim: Trim extraneous space at beginning of user input. -->
  <!ATTLIST import-field ltrim %boolean;>
  <!-- DEPRECATED: The "maxLength" attribute of "import-field" has been 
                 deprecated [Use length] -->
  <!ATTLIST import-field maxLength %whole; #IMPLIED>
  <!-- DEPRECATED: The "max_length" attribute of "import-field" has been 
                 deprecated [Use length] -->
  <!-- max_length: The maximum number of characters the user is allowed to 
       enter into the entry. -->
  <!ATTLIST import-field max_length %whole; #IMPLIED>
  <!-- minLength: The minimum number of characters the user must enter into 
       the entry. -->
  <!ATTLIST import-field minLength %whole; "0">
  <!-- DEPRECATED: The "min_length" attribute of "import-field" has been 
                 deprecated [Use minLength] -->
  <!-- min_length: The minimum number of characters the user must enter into 
       the entry. -->
  <!ATTLIST import-field min_length %whole; "0">
  <!-- queryDefault: The field will be populated with this value automatically 
       when a query is requested. If the field is visible the user can still 
       override the value. -->
  <!ATTLIST import-field queryDefault %text; #IMPLIED>
  <!-- query_casesensitive: If "N", the entry widget ignores the case of the 
       information entered into the query mask. -->
  <!ATTLIST import-field query_casesensitive %boolean;>
  <!-- queryable: Is this object queryable? -->
  <!ATTLIST import-field queryable %boolean;>
  <!-- required: If set, empty values can not be stored in this field. -->
  <!ATTLIST import-field required %boolean;>
  <!-- rtrim: Trim extraneous space at end of user input. -->
  <!ATTLIST import-field rtrim %boolean;>
  <!-- scale: Number of fractional digits. Applies only to fields with a 
       datatype of 'number'. -->
  <!ATTLIST import-field scale %whole; #IMPLIED>
  <!-- DEPRECATED: The "typecast" attribute of "import-field" has been 
                 deprecated [Use "type".] -->
  <!ATTLIST import-field typecast %name; #IMPLIED>
  <!-- DEPRECATED: The "value" attribute of "import-field" has been deprecated 
                 [Use default="..." instead] -->
  <!-- value: Deprecated -->
  <!ATTLIST import-field value %text; #IMPLIED>


<!-- ========================= -->
<!-- Child elements of between -->
<!-- ========================= -->
<!-- Implements addition. -->
<!ELEMENT add (add*, cconst*, cfield*, cparam*, div*, mul*, negate*, sub*)>

<!-- Defines a constant value in a condition. -->
<!ELEMENT cconst EMPTY>
  <!ATTLIST cconst value %text; #REQUIRED>
  <!ATTLIST cconst type %text; #IMPLIED>

<!-- Defines a database table's field in a condition. -->
<!ELEMENT cfield EMPTY>
  <!ATTLIST cfield name %name; #REQUIRED>

<!-- Defines a parameter value in a condition. -->
<!ELEMENT cparam EMPTY>
  <!ATTLIST cparam name ID #REQUIRED>

<!-- Implements division. -->
<!ELEMENT div (add*, cconst*, cfield*, cparam*, div*, mul*, negate*, sub*)>

<!-- Implements lower({value}). -->
<!ELEMENT lower (cfield*)>

<!-- Implements multiplication. -->
<!ELEMENT mul (add*, cconst*, cfield*, cparam*, div*, mul*, negate*, sub*)>

<!-- Implements numerical negation. -->
<!ELEMENT negate (add*, cconst*, cfield*, cparam*, div*, mul*, sub*)>

<!-- Implements subtraction. -->
<!ELEMENT sub (add*, cconst*, cfield*, cparam*, div*, mul*, negate*, sub*)>

<!-- Implements upper({value}). -->
<!ELEMENT upper (cfield*)>


<!-- ============================== -->
<!-- Child elements of staticsetrow -->
<!-- ============================== -->
<!ELEMENT staticsetfield EMPTY>
  <!ATTLIST staticsetfield name %text; #REQUIRED>
  <!ATTLIST staticsetfield value %text; #REQUIRED>


<!-- This DTD was created by gnuedtd
     Updated: 2009-11-20 20:22:24   -->

