## 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")
$page.addScript($ui.getScript("page.js"))
<html>

#TurbineHtmlHead()

<link href="$ui.getStylecss()" rel="stylesheet" type="text/css" />

<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('turbine4-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('pb-turbine100px.png')"/></p>
        </footer>
	</div>

</body>
</html>
