<!--
   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>
<head>
<title>Click Examples</title>
<link type="text/css" rel="stylesheet" href="${context}/assets/css/style.css" title="Style"/>
${cssImports}
#if($headInclude)#parse($headInclude)#end
</head>
<body>
<center>
<table height="100%" border="0" cellpadding="0" cellspacing="4" class="page">
## Title Header
<tr>
	<td width="100%">			
		<table cellpadding="0" cellspacing="0" width="100%" border="0" style="border-collapse:collapse;">
			<tr>
				<td class="title-icon">
					<a target="blank" href="http://incubator.apache.org/click/"><img src="${context}/assets/images/click-icon-blue-32.png" border="0" alt="Click"/></a>
				</td>
				<td class="title-left" width="100%">
					$title
				</td>
				<td class="title-hosted">
					<p>Version ${messages.version}</p>
					<a target="blank" href="http://www.avoka.com">Hosted by Avoka Technologies</a>
				</td>
			</tr>
			<tr>
				<td class="header-color" colspan="3">&nbsp;</td>
			</tr>
		</table>
	</td>
</tr>
## Menu
<tr>		
	<td>
#if (${rootMenu})
#writeMenu(${rootMenu})
#end
	</td>
</tr>
## Page Content
<tr>		
	<td class="content">
#parse(${path})
	</td>
</tr>
## Vertical Spacer
<tr>		
	<td height="100%">&nbsp;</td>
</tr>
</table>
</center>
</body>
</html>
${jsImports}
#if (${jsInclude}) #parse(${jsInclude}) #end
