## 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.

#*

If user is logged in, display "Welcome ${username}!"
Else display "Welcome World!"
Display link to log in page; maintain session id if needed.
If user is logged in, display a link to the sign-out page.

Note: Only the minimum required html or Sruts custom tags
are used in this example.

*#

<html>
    <head>
        <title>Welcome World!</title>
        <base href="$link.baseRef">
    </head>

    <body>
        #if( $user )
        <h3>Welcome $user.username! (Velocity Version)</h3>
        #else
        <h3>Welcome World! (Velocity Version)</h3>
        #end

        #macro (errorMarkup)
            #if ($errors.exist() )
                <ul>
                #foreach ($e in $errors.all )
                    $e
                #end
                </ul>
            #end
        #end
        #errorMarkup()

        <ul>
            <li><a href="$link.forward.logon_vm">Sign in</a></li>
            #if( $user )
            <li><a href="$link.forward.logoff_vm">Sign out</a></li>
            #end
        </ul>

        <a href="$link.action.welcome_jsp">Switch to JSP</a><br>
        <a href="$link.forward.index_vm_src">View Template</a><br>

    </body>

</html>
