## 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.

$page.addStyleSheet("http://www.w3schools.com/lib/w3.css")
$page.addStyleSheet("http://www.w3schools.com/lib/w3-theme-blue-grey.css")
$page.setTitle("Sample Apache Turbine Application")


<html>

#TurbineHtmlHead()

<body #TurbineHtmlBodyAttributes() class="w3-theme-l4">

	<div class="w3-wrapper">

		<!-- Header -->
		<header class="w3-container w3-center w3-padding-32 w3-theme">
        	<img class="w3-right" src="$ui.image('turbine-project.png')" /> 
	        #if ( $data.getUser().hasLoggedIn() ) 
		        #set ( $u = $data.getUser() )
		        <div class="w3-right">
					<h5>Hello $!u.FirstName</h5>
		        </div>
			#end
		</header>

        <!-- Default Menu -->
        $navigation.setTemplate("/Menu.vm")

        <!-- Content -->
        <div class="w3-left w3-padding" id="content">
                $screen_placeholder
        </div>

        <!-- Footer -->
        <footer class="w3-bottom">
			<p>Powered by <img src="$ui.image('powered-by-logo.gif')"/></p>
        </footer>
	</div>

</body>
</html>
