<?xml version='1.0' encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V5.0//EN" "http://www.oasis-open.org/docbook/xml/5.0/docbookx.dtd" [
        <!ENTITY % cms_entities SYSTEM "../cms.ent">
        %cms_entities;
        ]>
<book xmlns="http://docbook.org/ns/docbook" version="5.0"
      xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink"
      xml:lang="en">
    <info>
        <title>&flexivecms; 0.5 Reference Documentation</title>

        <author>
            <personname>Daniel Lichtenberger</personname>
            <email>daniel.lichtenberger@flexive.com</email>
        </author>

        <copyright>
            <year>2009-2010</year>
            <holder>UCS - unique computing solutions gmbh</holder>
        </copyright>

        <abstract>
            <para>
                &flexivecms; is a Content Management System based on &jee5; and &jsf12;.
            </para>

            <para>
                Its main features include:

                <itemizedlist>
                    <listitem>
                        XHTML-based templating with JSF
                    </listitem>
                    <listitem>
                        Integration of business logic via JSF and EJB
                    </listitem>
                    <listitem>
                        Out-of-the-box functionality for multilanguage websites, pretty URLs,
                        fine-grained security, and much more.
                    </listitem>
                    <listitem>
                        Front-end editing for immediate feedback.
                    </listitem>
                </itemizedlist>
            </para>
        </abstract>
    </info>

    <chapter id="getting_started">
        <title>Getting started</title>

        <section id="gs_download">
            <title>Download &flexivecms;</title>

            <para>
                Download and run the installer from the &downloadPage;.
            </para>
            <para>
                The installer will prepare a fully functional installation on your local machine.
                After the installation process is finished, start the CMS server using the application menu
                shortcut or manually with the
                <command>start.sh</command>/<command>start.bat</command>
                scripts in the root installation directory.
            </para>
        </section>

        <section id="gs_completing">
            <title>Completing the installation</title>

            <para>
                When the server is running and you first access the CMS through the browser (&refLocalhost;),
                you are redirected to the &refBackendDocs;. Complete the installation by logging in with the
                default superuser credentials,
                <userinput>supervisor/supervisor</userinput>,
                and wait a few moments until the initialization is complete.
            </para>

            <para>
                If something went wrong, please stop by in our
                <link xlink:href="&urlForum;">forum</link>.
            </para>
        </section>

        <section id="ds_accesscms">
            <title>Accessing the CMS</title>

            <para>
                After the initialization was completed, you can access the actual CMS website on &refLocalhost;.
                By default, there are three example CMS users available:

                <itemizedlist>
                    <listitem>
                        <para>
                            <userinput>cms-author/cms-author</userinput>
                            can create pages,
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            <userinput>cms-editor/cms-editor</userinput>
                            can modify all contents and publish changes, and
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            <userinput>cms-admin/cms-admin</userinput>
                            can edit the page templates.
                        </para>
                    </listitem>
                </itemizedlist>
            </para>
        </section>

        <section id="ds_firststeps">
            <title>First Steps</title>

            <para>
                To login, click on the "Login" link in the upper right corner or open
                <link xlink:href="http://localhost:8080/admin/login.xhtml">http://localhost:8080/admin/login.xhtml</link>.
                Use the default admin user and password to login (cms-admin/cms-admin).
            </para>

            <para>
                After successful login the CMS control bar appears above the page:
            </para>

            <mediaobject>
                <alt>The CMS administration bar after successful login.</alt>
                <imageobject>
                    <imagedata fileref="ui_headerbar.png" />
                </imageobject>
            </mediaobject>

            <para>
                Here you can perform the common tasks for managing the web site:

                <itemizedlist>
                    <listitem>
                        <para>
                            <emphasis>Edit</emphasis>
                            allows you to edit the current page,
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            <emphasis>New Page</emphasis>
                            is for creating new pages,
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            <emphasis>Templates</emphasis>
                            allows you to edit and assign the templates of the current page,
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            <emphasis>Actions</emphasis>
                            is for publishing changes from the edit mode to the live website,
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            and the select box in the middle provides a sitemap as quick navigation.
                            On the far right the current user is displayed, as well as the
                            current view settings:
                        </para>
                        <para>
                            <emphasis>Templates: edit</emphasis>
                            and
                            <emphasis>Contents: edit</emphasis>
                            indicate that the "edit" versions of templates and contents are shown.
                            You can toggle both settings independently to preview the content changes
                            with the live template settings, or the live contents with the anticipated
                            template changes. For now, leave both settings on "edit", this is by far the most
                            common mode unless you are heavily editing both contents and templates.
                        </para>
                    </listitem>
                </itemizedlist>
            </para>

            <section id="dsf_new_page">
                <title>Creating new pages</title>

                <para>
                    Let's create a new page. Click on the "New Page" icon in the administration bar and enter
                    the new page data:
                </para>

                <mediaobject>
                    <alt>Creating a new page.</alt>
                    <imageobject>
                        <imagedata fileref="ui_newpage.png" />
                    </imageobject>
                </mediaobject>

                <para>
                    The
                    <emphasis>Page path</emphasis>
                    determines the initial URI of this page (in this case,
                    <code>first_page.xhtml</code>),
                    and the
                    <emphasis>Page title</emphasis>
                    is used as the HTML page title e.g. in the website navigation or in the HTML page title.
                    You can change both values afterwards.
                </para>

                <para>
                    For now, leave the other input fields. They are set to sensible defaults based on the
                    current page.
                </para>

                <para>
                    Click on
                    <emphasis>Create child page</emphasis>
                    to actually create the new page. You will then see the
                    new page in the navigation panel on the left and in the sitemap in the administration bar: 
                </para>

                <mediaobject>
                    <alt>The demo website after creating a new page.</alt>
                    <imageobject>
                        <imagedata fileref="ui_website_newpage.png" />
                    </imageobject>
                </mediaobject>

            </section>
            <section id="dsf_page_editing">
                <title>Page editing</title>
                
                <para>
                    What are those funny blobs near the reference our new page? Clicking on them reveals
                    a context menu that can be used to move the page around (in the navigation pane)
                    or to edit the page content (in the content pane). The color indicates the
                    <emphasis>publishing state</emphasis>
                    of the page:

                    <itemizedlist>
                        <listitem>
                            green pages are visible on the website and have no unpublished pages,
                        </listitem>
                        <listitem>
                            orange pages do have unpublished changes, but may already be visible on the website,
                        </listitem>
                        <listitem>
                            and gray pages are new and do not exist on the public website yet
                            (logically, the orange blob in the image above should be gray, it's an implementation
                            quirk of the current CMS version).
                        </listitem>
                    </itemizedlist>

                    To check this, click on the "Contents: edit" link in the upper right corner.
                    Now you see the website as an anonymous visitor would see it currently: our new page
                    has not been published, thus it is not visible to anyone but other CMS users. Click on
                    "Contents: live" again to switch back to edit mode.
                </para>

                <para>
                    Now, let's fill our new page with content. Navigate to the new page by clicking on
                    the link. The page renders OK, but is devoid of any content:
                </para>

                <mediaobject>
                    <alt>The CMS after navigating to the created page.</alt>
                    <imageobject>
                        <imagedata fileref="ui_newpage_empty.png" />
                    </imageobject>
                </mediaobject>

                <para>
                    To change this, click on the
                    <emphasis>Edit</emphasis>
                    button in the upper left corner. This opens the page editor in an overlay popup window:
                </para>

                <mediaobject>
                    <alt>The generic page content editor.</alt>
                    <imageobject>
                        <imagedata fileref="ui_newpage_contenteditor.png" />
                    </imageobject>
                </mediaobject>

                <para>
                    The amount of buttons and inputs may seem intimidating at first, but it's actually
                    pretty simple:

                    <itemizedlist>
                        <listitem>
                            <para>
                                The
                                <emphasis>Templates</emphasis>
                                box is a group of properties that determines the templates to be used for this page.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                <emphasis>Path name</emphasis>
                                and
                                <emphasis>title</emphasis>
                                are the page parameters you set when creating the page.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                <emphasis>Node reference</emphasis>
                                is a CMS-internal setting (it should not be visible actually), please ignore it for now.
                            </para>
                        </listitem>
                    </itemizedlist>

                    Each property has a few control buttons on the left: The first opens a context-sensitive menu
                    for this node, the arrows can be used to change the property position
                    (irrelevant for our current page template), and the plus/minus symbols add an additional
                    line for the field (if possible) or remove the field (unless it is mandatory).
                </para>

                <para>
                    To add page content, we have to create a property that is not yet visible. To do this,
                    click on a context menu icon on the far left:

                    <mediaobject>
                        <alt>Opening the context menu for adding new properties to a content.</alt>
                        <imageobject>
                            <imagedata fileref="ui_newpage_contenteditor_openmenu.png" />
                        </imageobject>
                    </mediaobject>

                </para>

                <para>
                    You get a selection of properties that can be added to the current instance:

                    <mediaobject>
                        <alt>The context menu for adding new properties to a content.</alt>
                        <imageobject>
                            <imagedata fileref="ui_newpage_contenteditor_contextmenu.png" />
                        </imageobject>
                    </mediaobject>
                    
                    Since we want
                    to add text content, select
                    <emphasis>Paragraph</emphasis>
                    and click
                    <emphasis>Insert selected assignments</emphasis>.
                    This creates a new paragraph with the properties that are defined by our page type:

                    <mediaobject>
                        <alt>A new paragraph for your page.</alt>
                        <imageobject>
                            <imagedata fileref="ui_newpage_contenteditor_para.png" />
                        </imageobject>
                    </mediaobject>
                </para>

                <para>
                    In the default page type, the page content is described by paragraphs with a title,
                    a HTML text body, and an optional image. The text fields are multilingual,
                    so you can use a single content instance for different languages.
                    Enter some text (you can leave the image property empty for now) and click the
                    <emphasis>Save content</emphasis>
                    button on the bottom of the page. The content instance is saved and the paragraph
                    should be rendered immediately.
                </para>
            </section>

            <section id="dsf_publish">
                <title>Publishing the changes</title>

                <para>
                    Now that you created a new page you want the rest of the world to see it. To do this,
                    navigate to the page and click on the
                    <emphasis>Actions</emphasis>
                    button in the toolbar. Currently there are two actions available,
                    <emphasis>Publish</emphasis>
                    and
                    <emphasis>Publish all</emphasis>:

                    <mediaobject>
                        <alt>The actions menu for "My first page".</alt>
                        <imageobject>
                            <imagedata fileref="ui_newpage_publish.png" />
                        </imageobject>
                    </mediaobject>

                </para>

                <para>
                    <emphasis>Publish all</emphasis>
                    publishes a complete part of a web page, i.e. the page itself and all subpages.
                    Since we only have a single page, it's sufficient to click on
                    <emphasis>Publish</emphasis>.
                    This will add the page to the live website navigation and make the content readable for
                    everyone. You can verify this by clicking on the "Content: edit" link in the upper right
                    corner again. You can also logout and view the page as an anonymous user, but be sure to
                    refresh it since the CMS allows browsers to cache public pages for a certain amount of time
                    (currently 30 minutes).
                </para>
            </section>

            <section id="dsf_outlook">
                <title>Outlook</title>

                <para>
                    Congratulations, you now have the tools to build pages with &flexivecms;. However, there
                    is still a lot of stuff to know to
                    <emphasis>really</emphasis>
                    use the possibilities that &flexive; provides:

                    <itemizedlist>
                        <listitem>
                            Build a multilanguage website with a URI-based locale selection (e.g. /en vs. /de).
                        </listitem>
                        <listitem>
                            Create custom page types in the backend to suit your web page requirements.
                        </listitem>
                        <listitem>
                            Create new templates and build more complex layouts.
                        </listitem>
                        <listitem>
                            Implement custom functionality as JSF managed beans and Enterprise Java Beans (EJBs),
                        </listitem>
                        <listitem>
                            and much more.
                        </listitem>
                    </itemizedlist>
                </para>

                <para>
                    We will cover these topics eventually, but for the moment let's take a step back and look at the
                    fundamental concepts we used for building this page in the next chapter.
                </para>
            </section>


        </section>
    </chapter>

    <chapter id="concepts">
        <title>Concepts</title>

        <section id="c_tree">
            <title>Page organization</title>

            <para>
                Websites in &flexivecms; are organized in a hierarchical
                <glossterm>page tree</glossterm>
                similar to the folders of a file system.
            </para>

            <para>
                When logging into the backend application under
                <link xlink:href="http://localhost:8080/flexive/">http://localhost:8080/flexive/</link>,
                the page tree is visible in the left panel:

                <mediaobject>
                    <alt>The backend content tree.</alt>
                    <imageobject>
                        <imagedata fileref="ui_backend_tree.png" />
                    </imageobject>
                </mediaobject>
            </para>
        </section>

        <section id="c_page">
            <title>Page content</title>

            <para>
                Pages are &flexive; content instances derived from a common type,
                <type>CMS_PAGE</type>.
                <type>CMS_PAGE</type>
                defines the bare minimum of properties that a &flexivecms; page has:

                <variablelist>
                    <varlistentry>
                        <term>Path name</term>
                        <listitem>
                            <para>
                                The unique name for the URI of this page.
                            </para>
                        </listitem>
                    </varlistentry>
                    <varlistentry>
                        <term>Title</term>
                        <listitem>
                            <para>
                                The (possibly localized) title of this page that is used for building a site map or
                                navigation panel with
                                <link linkend="tc_navigation">cms:navigation</link>
                                and can also be used for the HTML
                                <code><![CDATA[<title>]]></code>
                                element.
                            </para>
                        </listitem>
                    </varlistentry>
                    <varlistentry>
                        <term>Page template</term>
                        <listitem>
                            <para>The
                                <glossterm>template</glossterm>
                                that is used for rendering this page as a standalone frontend page
                                (i.e. with complete HTML headers and so on).
                                It can use content templates to defer the rendering of the
                                page content to a separate template.
                            </para>
                        </listitem>
                    </varlistentry>
                    <varlistentry>
                        <term>Content template</term>
                        <listitem>
                            The page template uses the content template to render the actual page content.
                        </listitem>
                    </varlistentry>
                    <varlistentry>
                        <term>Teaser template</term>
                        <listitem>
                            <para>
                                The template to be used for rendering a
                                <glossterm>teaser</glossterm>
                                (short preview of the content for embeddeding in another page)
                                for this page.
                            </para>
                        </listitem>
                    </varlistentry>
                </variablelist>
            </para>

            <para>
                Since every website has different requirements on how its content is organized,
                &flexivecms; does not impose a predefined structure for page contents.
            </para>

            <para>
                Instead, the user controls both data structures and display templates,
                making it a very versatile site generation tool similar to a
                <link xlink:href="http://en.wikipedia.org/wiki/Structured_wiki#Structured_wikis">Structured Wiki</link>.
            </para>

            <para>
                An example is the
                <type>CMS_BASIC_PAGE</type>
                type that is used for the packaged example website.
                <emphasis>In addition to the properties listed above</emphasis>,
                this type defines the following properties:

                <variablelist>
                    <varlistentry>
                        <term>Teaser/Title</term>
                        <term>Teaser/Text</term>

                        <listitem>
                            <para>
                                The
                                <glossterm>teaser</glossterm>
                                definition. Briefly describes this content when listed on another page.
                            </para>
                        </listitem>
                    </varlistentry>

                    <varlistentry>
                        <term>Paragraph/Title</term>
                        <term>Paragraph/Text</term>
                        <term>Paragraph/Image</term>

                        <listitem>
                            <para>
                                A list of paragraphs that make up the page content. Each paragraph can contain
                                a title, HTML text, and an image.
                            </para>
                        </listitem>
                    </varlistentry>
                </variablelist>
            </para>
        </section>

        <section id="c_templates">
            <title>Templating</title>

            <para>
                Templates determine how a page is rendered to the user. Usually the output is some sort
                of HTML, but you can also create templates for different output formats like plain text
                or binary formats like PDF.
            </para>

            <para>
                Templating is based on the &facelets; XHTML templating language for &jsf12;.
                A basic template could look like this:
            </para>

            <programlisting language="xml"><xi:include href="../examples/basic_template.xhtml" parse="text"/></programlisting>

            <para>
                For someone familiar with JSF, this template contains no surprises. The CMS-specific part is the
                <code><![CDATA[<fx:content>]]></code> tag that provides the all page properties in the variable
                <code>#{page}</code>.

                <code><![CDATA[<cms:value>]]></code> is used to render the title. Then the paragraph(s) of the
                page are rendered using the <code><![CDATA[<fx:children>]]></code> component that iterates
                over all paragraphs of the page.
            </para>
        </section>

        <section id="c_editlive">
            <title>Publishing or: Edit and Live</title>

            <para>
                A &flexivecms; page exists in two mostly independent versions:

                <itemizedlist>
                    <listitem>
                        <para>
                            The
                            <emphasis>live version</emphasis>
                            is the public-facing version of the website.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            The
                            <emphasis>edit version</emphasis>
                            is only visible to authorized CMS users. Changes can be made in the
                            edit version and even follow a custom workflow, before they eventually get
                            <emphasis>published</emphasis>
                            to the live website.
                        </para>
                    </listitem>
                </itemizedlist>
            </para>

            <para>
                Contents can be published individually, or as a group. In the latter case, all contents
                of a part of the website including their templates are published in one
                sweep.
            </para>
        </section>

        <section id="c_userroles">
            <title>User groups</title>

            <para>
                A user accessing a CMS page falls into one of the following categories:

                <itemizedlist>
                    <listitem>
                        Visitor
                    </listitem>
                    <listitem>
                        Author
                    </listitem>
                    <listitem>
                        Editor
                    </listitem>
                    <listitem>
                        Administrator
                    </listitem>
                </itemizedlist>

                A visitor can only view published contents, while an administrator has complete access
                to the CMS. Authors and Editors are CMS users that manage the page content.
            </para>

            <para>
                <emphasis>Authors</emphasis>
                generate page content. They can create articles and make changes to their own articles,
                but cannot modify articles created by other users. They also cannot publish contents,
                and cannot undo publishing of contents (including their own).
            </para>

            <para>
                <emphasis>Editors</emphasis>
                manage the website. They can edit all contents, publish contents, remove contents from the
                website. They cannot, however, change page templates.
            </para>

            <para>
                <emphasis>Administrators</emphasis>
                are the CMS superusers. They are the only ones who can change the page templates. They also
                can create new users and data structures in the backend.
            </para>

            <para>
                A user is member of one of these user groups, all users of a group share the same
                permission configuration.
            </para>

            <!-- TODO: permission matrix -->
        </section>

        
        <section id="c_putting_together">
            <title>Putting it all together</title>

            <itemizedlist>
                <listitem>
                    <para>
                        A
                        <emphasis>page</emphasis>
                        is a single content instance of a predefined, structured type. It contains all
                        non-presentational content in all languages that are supported by the website.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <emphasis>Pages</emphasis>
                        are kept in a hierarchical,
                        <emphasis>filesystem-like structure</emphasis>.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        A page determines how it should be rendered by referencing
                        <emphasis>templates</emphasis>.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        A
                        <emphasis>template</emphasis>
                        is a &facelets; XHTML template for &jsf12;.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        A page can include and reference arbitrary contents, either through common subfolders
                        referenced by the template or through SQL-like queries with &refFxSQL;.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        A content included on a page either knows how to render itself in a given context
                        through an assigned template, or the enclosing template specifies a template to render
                        the child content.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        The website exists in a
                        <emphasis>live</emphasis>
                        and in an
                        <emphasis>edit</emphasis>
                        version. The former is the public-facing website, the latter is only accessible
                        to authorized CMS users and is used to prepare the next live version of
                        the website.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        <emphasis>User groups</emphasis>
                        control the permissions of a user. The predefined groups are
                        Author, Editor, and Administrator.
                    </para>
                </listitem>
            </itemizedlist>
        </section>
    </chapter>

    <chapter id="templating">
        <title>Templating</title>

        <section id="tc_rendering">
            <title>Value rendering components</title>

            <section id="tc_content">
                <title>
                    <code><![CDATA[<fx:content>]]></code>
                </title>

                <para>
                    Page templates usually load the content associated with the page with the fx:content tag:

                    <programlisting language="xhtml"><![CDATA[<fx:content var="page" pk="#{fxPageBean.pagePK}">
... (page content) ...
</fx:content>]]></programlisting>
                </para>

                <para>
                    The properties of the content type can then be accessed through the
                    <code>page</code>
                    variable, e.g.
                    <code>#{page.title}</code>
                    or
                    <code>#{page.paragraph[0].title}</code>.

                    Please check the
                    <link xlink:href="&urlDocBase;/jsfsupport.html#jcl_fx_content">&flexive; documentation on fx:content</link>
                    for further details.
                </para>
            </section>


            <section id="tc_image">
                <title>
                    <code><![CDATA[<cms:image>]]></code>
                </title>

                <para>
                    Renders an image tag, based on fx:thumbnail and fx:fxValueInput.
                </para>

                <section>
                    <title>Parameters</title>

                    <variablelist>
                        <varlistentry>
                            <term>value</term>
                            <listitem>
                                the value (of type FxBinary) pointing to an image. If empty, nothing is rendered.
                            </listitem>
                        </varlistentry>
                        <varlistentry>
                            <term>previewSize</term>
                            <listitem>
                                size of the image (default: ORIGINAL). Valid values are taken from
                                <link xlink:href="&urlJavadocBase;/shared/com/flexive/shared/value/BinaryDescriptor.PreviewSizes.html">BinaryDescriptor.PreviewSizes</link>:
                                <itemizedlist>
                                    <listitem>
                                        <para><code>PREVIEW1</code>,
                                        </para>
                                    </listitem>
                                    <listitem>
                                        <para>
                                            <code>PREVIEW2</code>,
                                        </para>
                                    </listitem>
                                    <listitem>
                                        <para><code>PREVIEW3</code>,
                                        </para>
                                    </listitem>
                                    <listitem>
                                        <para><code>SCREENVIEW</code>,
                                        </para>
                                    </listitem>
                                    <listitem>
                                        <para>
                                            <code>ORIGINAL</code>
                                            (default).
                                        </para>
                                    </listitem>
                                </itemizedlist>
                            </listitem>
                        </varlistentry>
                        <varlistentry>
                            <term>title</term>
                            <term>alt</term>
                            <listitem>
                                passed to the img tag.
                            </listitem>
                        </varlistentry>
                    </variablelist>
                </section>
            </section>


            <section id="tc_value">
                <title>
                    <code><![CDATA[<cms:value>]]></code>
                </title>

                <para>
                    Renders content values, based on fx:fxValueInput.
                    This field will turn into an edit component when inline editing is activated.
                    If this functionality is not required, the output is similar to writing
                    the (string) value directly, e.g. through
                    <code>#{page.field}</code>.
                </para>

                <section>
                    <title>Parameters</title>

                    <variablelist>
                        <varlistentry>
                            <term>value</term>
                            <listitem>the FxValue to be rendered</listitem>
                        </varlistentry>
                    </variablelist>
                </section>
            </section>
        </section>

        <section id="tc_templating">
            <title>Templating components</title>

            <section id="tc_applytemplate">
                <title>
                    <code><![CDATA[<cms:applyTemplate>]]></code>
                </title>

                <para>
                    Apply a template on a content.
                </para>

                <para>
                    The goal is to achieve a decoupling of the page template
                    (which may be shared for many different types of pages)
                    from the rendering of the actual page content 
                    (e.g. an article, news item, product description, etc.).
                </para>

                <para>
                    For example, the default page template uses the component like this:
                    <code>&lt;cms:applyTemplate template="/templates/content"/></code>.
                    The templating engine will now perform two steps:

                    <itemizedlist>
                        <listitem>
                            <para>
                                Lookup the template defined in
                                <code>/templates/content</code>
                                for the current page content (defined through the page URL).
                            </para>
                        </listitem>

                        <listitem>
                            <para>
                                Render the page content using this template and include the output in the page.
                            </para>
                        </listitem>
                    </itemizedlist>
                </para>

                <para>
                    The current FxContent entry is exposed to the body in the variable "content",
                    the page path in the variable "path",
                    and the node ID in "nodeId" (as in 
                    <link linkend="tc_renderchildren">cms:renderChildren</link>).
                </para>

                <section>
                    <title>Parameters</title>

                    <variablelist>
                        <varlistentry>
                            <term>pk</term>
                            <listitem>
                                <para>
                                    The PK of the content to be rendered (default:
                                    the page content, i.e.
                                    <code>#{fxPageBean.pagePK}</code>).
                                </para>
                            </listitem>
                        </varlistentry>
                        
                        <varlistentry>
                            <term>template</term>
                            <listitem>
                                <para>
                                    The name of the template assignment. The default value is
                                    <code>/TEMPLATES/CONTENT</code>
                                    (the default page content template).
                                </para>

                            </listitem>
                        </varlistentry>
                    </variablelist>
                </section>
            </section>

            <section id="tc_renderchildren">
                <title>
                    <code><![CDATA[<cms:renderChildren>]]></code>
                </title>

                <para>
                    This component is vital for including other contents into the current page.
                    In its current form, it only supports rendering the contents stored in a subfolder
                    of the page (including the page itself, i.e. all page contents linked under the current
                    page).
                </para>

                <para>
                    There are two modes of operation:
                    <itemizedlist>
                        <listitem>
                            <para>
                                When the
                                <emphasis>template</emphasis>
                                attribute is set, all contents that contain a template reference
                                under this path are rendered
                                <emphasis>using the corresponding template</emphasis>.
                                I.e. the contents themselves control how they are rendered, the
                                caller only determines which logical template class is selected
                                (teaser templates).
                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                When the
                                <emphasis>type</emphasis>
                                attribute is set, the template is provided in the tag body. 
                            </para>
                        </listitem>
                    </itemizedlist>
                </para>

                <para>
                    The template can use the following variables to access the content to be rendered:

                    <variablelist>
                        <varlistentry>
                            <term>content</term>
                            <listitem>
                                <para>
                                    The node content, as exposed by
                                    <link xlink:href="&urlDocBase;/jsfsupport.html#jcl_fx_content">
                                        fx:content
                                    </link>.
                                </para>
                            </listitem>
                        </varlistentry>
                        <varlistentry>
                            <term>path</term>
                            <listitem>
                                The (absolute) page path.
                            </listitem>
                        </varlistentry>
                        <varlistentry>
                            <term>nodeId</term>
                            <listitem>
                                The (tree) node ID, for custom lookup functions.
                            </listitem>
                        </varlistentry>
                    </variablelist>
                </para>

                <section>
                    <title>Parameters</title>

                    <variablelist>
                        <varlistentry>
                            <term>id</term>
                            <listitem>
                                A unique ID for the component. Unfortunately, we need this to prevent
                                JSF errors due to duplicate IDs.
                            </listitem>
                        </varlistentry>

                        <varlistentry>
                            <term>folder</term>
                            <listitem>
                                the folder name (must be a direct child of the current article node). If not set,
                                all direct children of the current page are rendered (i.e. folder="").
                            </listitem>
                        </varlistentry>

                        <varlistentry>
                            <term>template</term>
                            <listitem>
                                <para>
                                    the name of the template assignment,
                                    including the root type that defines it (e.g.
                                    <code>CMS_PAGE/TEMPLATES/PAGE</code>
                                    or
                                    <code>CMS_MY_ARTICLE/TEMPLATES/SNIPPET</code>
                                    ).
                                    This implicitly limits the type of the rendered children, which must have a
                                    content type derived from this root type.
                                    If template is not set, the template must be provided in the tag body and the
                                    <code>type</code>
                                    attribute must be set to specify the root type.
                                </para>
                            </listitem>
                        </varlistentry>

                        <varlistentry>
                            <term>type</term>
                            <listitem>
                                <para>
                                    the base type of the contents to be rendered, e.g.
                                    <code>CMS_PAGE</code>
                                    (if
                                    <code>template</code>
                                    is not set, otherwise this attribute will be ignored,
                                    default: CMS_PAGE).
                                </para>
                            </listitem>
                        </varlistentry>

                        <varlistentry>
                            <term>itemBefore</term>
                            <listitem>
                                <para>
                                    header markup of an item. To work around entity encoding issues
                                    with some browsers (even if the entities are correctly escaped, some
                                    browsers replace the escaped entities when editing the template
                                    in a textarea), you may want to use the
                                    <code>cms:openTag</code>
                                    and
                                    <code>cms:closeTag</code>
                                    functions instead. For example:
                                    <code>#{cms:openTag('li')}</code>
                                    instead of
                                    <code>&amp;lt;li></code>.
                                </para>
                            </listitem>
                        </varlistentry>

                        <varlistentry>
                            <term>itemAfter</term>
                            <listitem>
                                trailing markup of an item.
                            </listitem>
                        </varlistentry>
                    </variablelist>
                </section>
            </section>

            <section id="tc_navigation">
                <title>
                    <code><![CDATA[<cms:navigation>]]></code>
                </title>

                <para>
                    This component renders links for a part of the page tree, e.g.
                    for creating the website navigation menu.
                </para>

                <para>
                    Please refer to the
                    <link xlink:href="&urlDocBase;/jsfsupport.html#jcl_fx_navigation">&flexive; documentation on fx:navigation</link>
                    for a complete description of its parameters.
                    A short snippet using this component can be found in
                    <link linkend="recipe_navigation">the navigation example</link>.
                </para>

                <section>
                    <title>Parameters</title>

                    <variablelist>
                        <varlistentry>
                            <term>depth</term>
                            <listitem>
                                <para>
                                    The maximum depth (relative to the root node) of the navigation
                                    (default: 1).
                                </para>
                            </listitem>
                        </varlistentry>
                        <varlistentry>
                            <term>output</term>
                            <listitem>
                                <para>
                                    The output mode:
                                    <code>default</code> (nested ul/li lists),
                                    <code>csspopup</code> (pure CSS popup),
                                    or
                                    <code>yui</code> (Yahoo UI-based menu).
                                </para>
                            </listitem>
                        </varlistentry>
                        <varlistentry>
                            <term>var</term>
                            <listitem>
                                <para>
                                    Name of the JSF-EL variable provided to the tag body for rendering
                                    a menu item.
                                </para>
                            </listitem>
                        </varlistentry>
                    </variablelist>
               </section>
            </section>
        </section>

        <section id="tc_menus">
            <title>Menu components</title>

            <para>
                These components can be added to own templates to offer popup menus when the
                CMS frontend editor is active.
            </para>

            <section id="tc_childmenu">
                <title>
                    <code><![CDATA[<cms:childMenu>]]></code>
                </title>

                <para>
                    Renders a menu with options for a child rendered by cms:renderChildren when the edit mode
                    is active.
                </para>

                <section>
                    <title>Parameters</title>

                    <variablelist>
                        <varlistentry>
                            <term>id</term>
                            <listitem>
                                A unique ID for the component.
                            </listitem>
                        </varlistentry>
                    </variablelist>
                </section>

            </section>

            <section id="tc_loginmenu">
                <title>
                    <code><![CDATA[<cms:loginMenu>]]></code>
                </title>

                <para>
                    Renders a login button for guest users or a logout button if the user is already logged in.
                </para>

                <section>
                    <title>Parameters</title>

                    <variablelist>
                        <varlistentry>
                            <term>showLoginLink</term>
                            <listitem>
                                If true, a login link for the CMS is always rendered. Otherwise the menu is
                                only visible when the edit mode is active.
                            </listitem>
                        </varlistentry>
                    </variablelist>
                </section>


            </section>

            <section id="tc_navigationmenu">
                <title>
                    <code><![CDATA[<cms:navigationMenu>]]></code>
                </title>

                <para>
                    The  edit mode menu for a navigation item rendered by
                    <link linkend="tc_navigation">cms:navigation</link>.
                </para>
            </section>

            <section id="tc_pagecontent">
                <title>
                    <code><![CDATA[<cms:pageContent>]]></code>
                </title>

                <para>
                    Wrapper for the page content. Inserts a form and content-related buttons in edit mode,
                    does not alter the page otherwise.
                </para>
            </section>

        </section>

        <section id="tc_functions">
            <title>JSF-EL functions</title>

            <para>
                &flexivecms; offers static helper functions that can be used in page templates,
                e.g. for converting strings to uppercase or for creating absolute page URLs.
            </para>

            <section id="tcf_urls">
                <title>URL-related functions</title>

                <section id="tcfu_url">
                    <title>fx:url</title>

                    <para>
                        Renders an absolute URL for the given page URL that obeys (optional) rewriting rules,
                        e.g. from .xhtml to .html extensions.
                    </para>
                    <para>
                        For example:
                        <code>#{fx:url('/test')}</code>
                        =>
                        <code>/test.xhtml</code>
                    </para>
                </section>
            </section>

            <section id="tcf_queries">
                <title>Query functions</title>

                <section id="tcfq_query">
                    <title>cms:query</title>

                    <para>
                        Submit a &refFxSQL; query and return the
                        <link xlink:href="&urlJavadocBase;shared/com/flexive/shared/search/FxResultSet.html">result set</link>.
                        For complex queries is is usually easier to construct them in a separate expression
                        or provide them from a managed bean.
                    </para>

                    <example id="tcfq_query_example">
                        <title>Submitting a FxSQL query in a template</title>

                        <programlisting language="xhtml"><![CDATA[<c:set var="queryString" value="
       SELECT @pk, modified_at, caption
       FILTER version=live
       WHERE typedef = 'CMS_BASIC_PAGE'
       ORDER BY modified_at DESC
"/>

<c:set var="result" value="#{cms:query(queryString)}"/>

<ui:repeat var="row" value="#{result.rows}">

    <h3>PK: #{row[0]}</h3>
    
    <p>
        Title: #{row[2]}<br/>
        Last modified: #{row[1]}<br/>
    </p>
</ui:repeat>
]]></programlisting>
                    </example>
                </section>

                <section id="tcfq_escapeSql">
                    <title>cms:escapeSql</title>

                    <para>
                        Escape the argument for use in a SQL expression. For example, strings get quoted
                        and escaped, dates get properly formatted, and so on.
                    </para>

                    <para>
                        For example, to escape a parameter passed from a request parameter (e.g.
                        <code>page.xhtml?queryName=name</code>):

                        <programlisting language="xhtml"><![CDATA[<c:set var="query"
      value="SELECT @pk FILTER version=live
             WHERE caption=#{cms:escapeSql(request.parameterMap['queryName'])}"
/>]]></programlisting>
                    </para>
                </section>
            </section>

            <section id="tcf_navigation">
                <title>Navigation and templating</title>

                <section id="tcfn_pagesForLevel">
                    <title>cms:pagesForLevel</title>

                    <para>
                        Returns the tree nodes for the given navigation level. The CMS root node is at level
                        #{fxPageBean.treeRootLevel}.
                    </para>

                    <example id="tcfn_pagesForLevel_example">
                        <title>Using the cms:pagesForLevel function</title>
                        <programlisting language="xhtml"><![CDATA[<ui:repeat var="node" value="#{cms:pagesForLevel(fxPageBean.treeRootLevel)}">
    <li>
        <cms:navigationMenu/>

        Root navigation:
        <h:outputLink value="#{fx:url(node.name)}">#{node.label}</h:outputLink>
    </li>
</ui:repeat>
]]></programlisting>
                    </example>
                </section>
            </section>



            <section id="tcf_strings">
                <title>String and data handling</title>

                <section id="tcfu_escapeQuotes">
                    <title>cms:escapeQuotes</title>

                    <para>
                        Escapes quotes in its String argument with backslashes, e.g. for use in JavaScript expressions.
                    </para>

                </section>
                <section id="tcfu_toLowerCase">
                    <title>cms:toLowerCase</title>

                    <para>
                        Converts its argument to lower case.
                    </para>

                    <para>
                        For example:
                        <code>#{cms:toLowerCase('Pete')}</code>
                        =>
                        <code>pete</code>.
                    </para>
                </section>

                <section id="tcfu_toUpperCase">
                    <title>cms:toUpperCase</title>

                    <para>
                        Converts its argument to upper case.
                    </para>

                    <para>
                        For example:
                        <code>#{cms:toUpperCase('Pete')}</code>
                        =>
                        <code>PETE</code>.
                    </para>
                </section>

                <section id="tcfu_tagOpen">
                    <title>cms:tagOpen</title>

                    <para>
                        Renders an opening tag. This is useful to avoid issues with escaping control
                        characters in XHTML contexts, e.g. in tag attributes.
                    </para>

                    <para>
                        For example:
                        <code>#{cms:tagOpen('li')}</code>
                        =>
                        <code>&lt;li></code>
                    </para>
                </section>

                <section id="tcfu_tagClose">
                    <title>cms:tagClose</title>

                    <para>
                        Renders a closing tag. This is useful to avoid issues with escaping control
                        characters in XHTML contexts, e.g. in tag attributes.
                    </para>

                    <para>
                        For example:
                        <code>#{cms:tagClose('li')}</code>
                        =>
                        <code>&lt;/li></code>
                    </para>
                </section>

                <section id="tcfu_replace">
                    <title>cms:replace</title>

                    <para>
                        Replaces a part of an input string and returns the new string.
                    </para>

                    <para>
                        For example:
                        <code>#{cms:replace('Hello NAME', 'NAME', 'Pete')}</code>
                        =>
                        <code>"Hello Pete"</code>
                    </para>
                </section>
            </section>
        </section>
    </chapter>

    <chapter id="recipes">
        <title>Recipes</title>

        <para>
        </para>

        <section id="recipe_navigation">
            <title>Navigation</title>

            <para>
                <emphasis>Objective:</emphasis>
                Automatically generate a top-level navigation for the pages of the website.
            </para>

            <para>
                To create a navigation that resembles the pages of your website use the
                <link linkend="tc_navigation">cms:navigation</link>
                component, for example: 
            </para>

            <example id="rnav_example">
                <title>Using cms:navigation</title>

                <programlisting language="xml"><![CDATA[<cms:navigation depth="3">

    <f:facet name="item">
        <h:panelGroup>

            <h:outputLink value="#{fx:url(node.path)}">
                #{node.label}
            </h:outputLink>

            <cms:navigationMenu/>

        </h:panelGroup>
    </f:facet>

</cms:navigation>]]></programlisting>

                <!-- TODO: Screenshot -->
            </example>
        </section>

        <section id="recipe_teasers">
            <title>Teasers</title>

            <para>
                <emphasis>Objective:</emphasis>
                Render short preview texts (teasers) of pages attached to the current page.
            </para>

            <para>
                Use the
                <link linkend="tc_renderchildren">cms:renderChildren</link>
                component to render the pages in a specific subfolder with a teaser template.
            </para>

            <example id="rteaser_example">
                <title>Rendering teasers with cms:renderChildren</title>

                <para>
                    <emphasis>Page template:</emphasis>
                    <programlisting language="xml"><![CDATA[<cms:renderChildren id="teasers" template="CMS_PAGE/TEMPLATES/TEASER" folder=""/>
    ]]></programlisting>
                </para>

                <para>
                    <emphasis>Teaser template:</emphasis>
                    <programlisting language="xml"><![CDATA[<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:fx="http://www.flexive.com/jsf/core"
      xmlns:cms="http://www.flexive.com/jsf/cms">

<ui:composition>

    <!-- Link to the article -->
    <h3>
        <a href="#{fx:url(path)}"><cms:value value="#{content.title}"/></a>
    </h3>

    <!-- Render teaser text --> 
    <p>
        <cms:value value="#{content['teaser/text']}"/>
    </p>

</ui:composition>

</html>]]></programlisting>
                </para>
            </example>
        </section>

        <section id="recipe_urlrewriting">
            <title>URL rewriting</title>

            <para>
                <emphasis>Objective:</emphasis>
                Map arbitrary URLs to CMS pages.
            </para>

            <para>
                &flexivecms; does all internal URL rewriting with
                <link xlink:href="http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/3.2/index.html">UrlRewriteFilter</link>.
                You can define additional rules that are applied before the CMS rules.
            </para>

            <example id="rurlrewriting_example">
                <title>Custom URL rewriting with UrlRewriteFilter</title>

                <para>
                    Execute the following Groovy script in the backend script console with a user that has
                    "Script Execution" privileges, e.g. the supervisor user. This example configuration
                    redirects requests to
                    <code>/legacy-url</code>
                    to
                    <code>/info.xhtml</code>
                    and use page URLs ending in
                    <code>.html</code>
                    instead of
                    <code>.xhtml</code>.
                </para>

                <programlisting language="groovy"><![CDATA[import com.flexive.shared.EJBLookup

EJBLookup.configurationEngine.put(com.flexive.cms.shared.CMSConst.REWRITE_RULES, """
<urlrewrite>

    <!-- Rewrite /legacy-url to /info.xhtml -->
    <rule>
        <from>/legacy-url</from>
        <to type="permanent-redirect" last="true">/info.xhtml</to>
    </rule>

    <!-- Support .html URLs -->
    <rule>
    	<from>(.+)\\.html</from>
    	<to>\$1.xhtml</to>
    </rule>

    <!-- Rewrite generated URLs to .html suffix -->
    <outbound-rule>
        <from>(.*)\\.xhtml</from>
        <to>\$1.html</to>
    </outbound-rule>

</urlrewrite>
""")]]></programlisting>
            </example>

        </section>

        <section id="recipe_resources">
            <title>Website resources like images and stylesheets</title>

            <para>
                <emphasis>Objective:</emphasis>
                store website resources like images or stylesheets in the CMS.
            </para>

            <para>
                &flexivecms; provides two special folders,
                <code>/files</code>
                and
                <code>/resources</code>,
                for dealing with website resources:

                <mediaobject>
                    <alt>The backend content tree with files and resources folders.</alt>
                    <imageobject>
                        <imagedata fileref="ui_backend_tree.png" />
                    </imageobject>
                </mediaobject>

                <itemizedlist>
                    <listitem>
                        <para>
                            <emphasis>/files</emphasis>
                            acts as a simple, path-based store for binary objects like images. Anything
                            that is put there can be reached through the tree path that is visible
                            in the backend.
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis>/resources</emphasis>
                            is a collection of text-based resources like stylesheets and scripts.
                            These resources are actually normal CMS pages with custom templates that set
                            the correct content types, e.g.
                            <code>text/css</code>
                            for CSS files. 
                        </para>
                    </listitem>
                </itemizedlist>

                In the screenshot above, the resources can be reached from the website with the following paths:
                <itemizedlist>
                    <listitem>
                        <para>
                            <filename>/files/flexive.jpg</filename>
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            <filename>/resources/default.css</filename>
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            <filename>/resources/perfect-3col-liquid.css</filename>
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            <filename>/resources/perfect-2col-liquid.css</filename>
                        </para>
                    </listitem>
                </itemizedlist>


            </para>
            <para>

                To create a new content in one of these folders, right-click the folder, select
                <emphasis>Create content...</emphasis>
                and then the appropriate content type:

                <itemizedlist>
                    <listitem>
                        <para>
                            For image formats like PNG or JPG, select "Image".
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            For other binary formats like PDF files select "Document".
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            For text resources like CSS or JS files, select "CMS Resource". You then have to set
                            the page template according to the resource type, like
                            "Resource: CSS" or "Resource: Javascript". 
                        </para>
                    </listitem>
                </itemizedlist>

                These resource can be reached through the URI that is displayed in the backend
                <emphasis>when node paths are displayed</emphasis>
                (activate the ":/" icon in the content tree menu).
                In the image above, this mode is not activated. You are viewing node paths if the page root node
                has the name "flexiveCMS" instead of the page title ("Welcome to...").
            </para>

            <para>
                Note that you have to
                <emphasis>activate</emphasis>
                the resources for them to be available on the public website. To do this, right-click the
                resource and choose
                <emphasis>Activate</emphasis>.
                You can also activate the whole resource folder by right-clicking the folder and choosing
                <emphasis>Activate subtree</emphasis>.
            </para>
        </section>
    </chapter>

    <!-- TODO: a complex example -->

    <chapter id="deployment">
        <title>Deployment</title>

        <para>
            Using the
            <link linkend="getting_started">installer</link>
            gets you started with little effort, but it is not advisable to turn this version directly into
            a production instance.
        </para>

        <para>
            The installer uses Jetty, OpenEJB, and H2. While all of them are mature technologies,
            we we recommend using a
            <link xlink:href="http://wiki.flexive.org/confluence/display/FX/FAQ#FAQ-Whatapplicationserver%2FdatabasedoIneedtorun\fleXive\%3F">
                supported application server
            </link>
            and a scalable, standalone database system. JBoss with MySQL or PostgreSQL is
            usually a fine and free combination.
            The website itself can be migrated between databases with the
            import/export tools in the backend <!-- TODO: DOC! -->.
        </para>

        <para>
            For detailed installation instructions please refer to the
            <link xlink:href="&urlDocBase;/installation.html">
                &flexive; installation guide
            </link>.
        </para>

        <section id="deploy_ear">
            <title>Deploying the CMS to an application server</title>

            <para>
                The CMS comes pre-packaged as an EAR application including the &flexive; backend.
                You can download the latest stable release from the &downloadPage;.
            </para>
        </section>

    </chapter>

    <chapter id="custom_development">
        <title>Custom development</title>

        <para>
            While the CMS is a fine out-of-the-box solution for relatively static websites,
            one can only go so far without writing custom business logic.
        </para>

        <para>
            <link xlink:href="http://maven.apache.org/plugins/maven-war-plugin/overlays.html">Maven WAR overlays</link>
            provide a way to override or extend the CMS web application's configuration.
            The existing CMS web application,
            <code>flexive-cms-war</code>,
            is used as an overlay where existing configuration
            files can be replaced (e.g. web.xml for adding servlets or filters).
        </para>

        <para>
            The easiest way to integrate custom logic is by creating a Maven JAR module and implementing one
            or more custom JSF managed beans. These can be initialized with an additional
            <filename>faces-config.xml</filename>
            that will be discovered by JSF when the JAR file is added to the EAR.
        </para>

        <para>
            The JAR file with custom business logic can then be added to a stock CMS EAR file.
            To achieve fully automatic packaging a new EAR Maven module similar to flexive-cms-ear,
            but including the additional dependency, must be created. This is also necessary to include
            additional EJB modules, which have to be listed in the EAR's
            <filename>application.xml</filename>.
        </para>
    </chapter>

    <chapter id="links">
        <title>Links</title>

        <itemizedlist>
            <listitem>
                <para>
                    <link xlink:href="&urlHomepage;">Official Homepage</link>
                </para>
            </listitem>
            <listitem>
                <para>
                    <link xlink:href="&urlDownload;">Download page</link>
                </para>
            </listitem>
            <listitem>
                <para>
                    <link xlink:href="http://svn.flexive.org/repository/flexiveCMS/trunk">Source code</link>
                    (<link xlink:href="http://source.flexive.org/browse/fleXiveCMS">FishEye</link>)
                </para>
            </listitem>

            <listitem>
                <para>
                    <link xlink:href="&urlDocBase;">&flexive; core documentation</link>
                </para>
            </listitem>
        </itemizedlist>
    </chapter>

    <chapter id="todos">
        <title>Things still missing</title>

        <para>
            As of today, &flexivecms; is not yet a complete product. However, it is stable enough that
            we use it for our own projects, and it should serve well as a base technology for a 
            wider range of websites. Among the things still missing are:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    Referencing pages from contents (dynamic link replacement).
                    (<link xlink:href="http://issuetracker.flexive.org/jira/browse/CMS-2">CMS-2</link>)
                </para>
            </listitem>
            <listitem>
                <para>
                    Frontend editing of resources (images, stylesheets, etc.).
                    (<link xlink:href="http://issuetracker.flexive.org/jira/browse/CMS-3">CMS-3</link>)
                </para>
            </listitem>
            <listitem>
                User-defined URL mappings/routing. 
            </listitem>
            <listitem>
                User-defined tags.
            </listitem>
            <listitem>
                Tree-based templating (i.e. the position in the page tree determines the template).
            </listitem>
            <listitem>
                Inline editing (partially implemented)
            </listitem>
            <listitem>
                Multiple websites (i.e. mapping domains to page tree root nodes).
                You can already serve multiple websites from a single server using &flexive; divisions,
                but this prevents any data sharing.
            </listitem>
            <listitem>
                WebDAV-based template and content editing (sort of works, but not extensively tested).
            </listitem>
            <listitem>
                <para>
                    A Maven quickstart archetype for a customized CMS application.
                    (<link xlink:href="http://issuetracker.flexive.org/jira/browse/CMS-4">CMS-4</link>)
                </para>

            </listitem>
            <listitem>
                JSF 2 support.
            </listitem>
            <listitem>
                Caching of tree-based components (e.g. navigation,
                path lookups, etc.).
            </listitem>
            <listitem>
                Page fragment caching.
            </listitem>
            <listitem>
                <para>...and more.
                    <link xlink:href="mailto:contact@flexive.org">Contact us</link>
                    if you have suggestions that are not listed here.
                </para>
            </listitem>
        </itemizedlist>
   </chapter>
</book>
