<?xml version="1.0" encoding="UTF-8"?>
<ae:configurations xmlns:ae="http://agavi.org/agavi/config/global/envelope/1.0" xmlns="http://agavi.org/agavi/config/parts/filters/1.0">

    <!-- this section is only for web contexts -->
    <ae:configuration context="web">
        <filters>

            <filter name="FormPopulationFilter" class="AgaviFormPopulationFilter">

                <!-- only run for request method "write" (=POST on web) by default (can be changed at runtime, of course) -->
                <!-- if you omit this, it will never run -->
                <ae:parameter name="methods">
                    <ae:parameter>write</ae:parameter>
                </ae:parameter>

                <!-- only run for output type "html" (so it doesn't break on, say, JSON data) -->
                <!-- if you omit this, it will run for all output types -->
                <ae:parameter name="output_types">
                    <ae:parameter>html</ae:parameter>
                </ae:parameter>

                <!-- error message insertion rules -->
                <!-- they are run in sequence; once the first one matched, execution stops -->
                <!--
                    errors that belong to more than one field (e.g. date validator) can be handled using "multi_field_error_messages"
                    "normal" errors are handled through "field_error_messages"
                    errors that yield no match and those that have no corresponding field are inserted using rules defined in "error_messages".
                -->

                <!--
                    for all field error messages.
                -->
                <ae:parameter name="field_error_messages">
                    <!-- ${htmlnsPrefix} is either empty (for HTML) or something like "html:" for XHTML documents with xmlns="..." notation. Always use this, makes your code more bullet proof. XPath needs the namespaces when the document is namespaced -->

                    <!-- all input fields that are not checkboxes or radios, and all textareas -->
                    <ae:parameter name="self::${htmlnsPrefix}input[not(@type='checkbox' or @type='radio')] | self::${htmlnsPrefix}textarea">
                        <!-- if this rule matched, then the node found by the rule is our starting point for inserting the error message(s). -->

                        <!-- can be any of "before", "after" or "child" (to insert as prev, next sibling or last child) -->
                        <ae:parameter name="location">after</ae:parameter>
                        <!-- a container groups all errors for one element. ${errorMessages} is a string containing all errors (see below) -->
                        <ae:parameter name="container"><![CDATA[<div class="errors">${errorMessages}</div>]]></ae:parameter>
                        <!-- this defines the HTML for each individual error message; those are then put into the container. ${errorMessage} is the error message string -->
                        <ae:parameter name="markup"><![CDATA[<p class="error">${errorMessage}</p>]]></ae:parameter>
                    </ae:parameter>

                    <!-- all other inputs - note how we select the parent element and insert ourselves as last child of it -->
                    <ae:parameter name="parent::*">
                        <ae:parameter name="location">child</ae:parameter>
                        <ae:parameter name="container"><![CDATA[<div class="errors">${errorMessages}</div>]]></ae:parameter>
                        <ae:parameter name="markup"><![CDATA[<p class="error">${errorMessage}</p>]]></ae:parameter>
                    </ae:parameter>
                </ae:parameter>

                <!--
                <ae:parameter name="multi_field_error_messages">
                </ae:parameter>
                -->

                <!-- everything that did not match any of the rules above, or errors that do not belong to a field -->
                <ae:parameter name="error_messages">
                    <!-- insert before the element -->
                    <!-- that can be an input, or a form, if the error does not belong to a field or didn't match anywhere else -->
                    <ae:parameter name="self::*">
                        <ae:parameter name="location">before</ae:parameter>
                        <!-- no container here! we just insert paragraph elements -->
                        <ae:parameter name="markup"><![CDATA[<p class="error">${errorMessage}</p>]]></ae:parameter>
                    </ae:parameter>
                </ae:parameter>

            </filter>

            <!-- <filter name="TidyFilter" class="AgaviTidyFilter">
                <ae:parameter name="tidy_options">
                    <ae:parameter name="output-xhtml">true</ae:parameter>
                    <ae:parameter name="numeric-entities">true</ae:parameter>
                </ae:parameter>
                <ae:parameter name="tidy_encoding">utf8</ae:parameter>
            </filter> -->

        </filters>

    </ae:configuration>

</ae:configurations>
