<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
-->
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
      xmlns:grv="http://myfaces.apache.org/groovy"
      xmlns:g="http://java.sun.com/jsf/composite/greet"

        >
<head>
    <title>Hello World</title>
</head>
<body>
<ui:composition template="/template.xhtml">

    <ui:define name="body">
        <h1>
            <ui:insert name="title">Ext-Scripting General Example
            </ui:insert>
        </h1>


        <h:panelGroup styleClass="stdBoxBig" style="color:black;">
            <h2>Hello to Apache MyFaces Extension Scripting</h2>

            <p>This is a testpage which tests the various aspects of the dynamic reloading of Apache MyFaces
                Extension Scripting.
            </p>

            <p>The sources for this example can be found under:<b>WEB-INF/ ...</b></p>
        </h:panelGroup>

        <h:form id="form">
            <h:panelGroup styleClass="left">
                <h:panelGroup styleClass="stdBox">
                    <h:messages/>

                    <h3>Validator Test 1</h3>

                    <g:greet2 who="hello world from composite"/>

                    <h:outputText id="output1" value="Please enter your name"/>
                    <h:outputText value="#{javatestbean4.hello}"/>
                    <h:inputText id="input1" value="#{helloWorld.name}" required="true">
                        <grv:groovyvalidator/>
                    </h:inputText>

                    <h:commandButton id="button1" value="press me" action="#{helloWorld.send}"/>
                </h:panelGroup>
                <h:panelGroup styleClass="stdBox">
                    <h3>Groovy Component</h3>
                    <grv:testcomponent/>
                    <h:message id="message1" for="input1"/>
                </h:panelGroup>
            </h:panelGroup>
            <h:panelGroup styleClass="right">
                <h:panelGroup styleClass="stdBox">
                    <h3>Bean Tests</h3>
                    <h:outputFormat value="#{testbean.xxx}"/>
                    <br/>
                    <h:outputFormat escape="false" value="#{javatestbean.sayHello}"/>
                </h:panelGroup>

                <h:panelGroup styleClass="stdBox">
                    <h3>Converter Test 1</h3>
                    please insert "hello world" into the input field
                    <h:inputText value="#{testbean.xxx}">
                        <grv:testConverter1/>
                        <grv:testValidator1/>
                    </h:inputText>
                </h:panelGroup>
                <h:panelGroup styleClass="stdBox">
                    <h3>Action Test 1</h3>
                    <h:commandButton value="Press me dynamic" action="#{testbean.doit}"/>
                </h:panelGroup>
                <h:panelGroup styleClass="stdBox">
                    <h3>Java Component</h3>
                    <grv:testcomponent2 testAttr="testAttributeValue" testAttr2="testAttribute2Value"/>
                </h:panelGroup>
            </h:panelGroup>

        </h:form>
    </ui:define>
</ui:composition>
</body>
</html>
