<!--
   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>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<link rel='stylesheet' type='text/css' href='help.css'/>
<style type='text/css'>
a.navLink {
 color:navy;
}
a.navLink-external {
 color:navy;
}
a.navLink:visited {
 color:navy;
}
a.navLink-external:visited {
 color:navy;
}
</style>
</head>
<body>

<table width="100%" height="100%" style="border-right:1px solid #a0a0a0;">

<tr><td align="left">
<a target='topic' class='navLinkSection' href='docs/click.html' title=' Click Overview'>
Click </a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/why-click.html' title=' Click Background'>
Why Click?</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/user-guide.html' title=' User Guide'>
User Guide</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/downloads.html' title=' Downloads'>
Downloads</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/quick-start.html' title=' Click Quick Start Guide'>
Quick Start Guide</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/faq.html' title=' Frequently Asked Questions'>
FAQ</a>
</td></tr>

<tr><td>
<a target='_blank' class='navLinkTopic' href='docs/click-cheat-sheet.pdf' title=' Click Framework Cheat Sheet'>
Cheat Sheet PDF</a>
<img src='images/external.png' align='baseline' border='0'/>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/roadmap-changes.html' title=' RoadMap and Changes'>
RoadMap &amp; Changes</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/developer-guide/developer-guide.html' title=' Guide for developers and contributors'>
Developer Guide</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/who-we-are.html' title=' Who we are'>
Who we are</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkSection' href='docs/javadoc.html' title=' Click Javadoc API'>
Javadoc</a>
</td></tr>

<tr><td>
<a target="topic" class="navLinkTopic" href="docs/click-api/overview-summary.html" title=" Click Javadoc API">
Click API</a>
</td></tr>

<tr><td>
<a target="topic" class="navLinkTopic" href="docs/extras-api/overview-summary.html" title=" Click Extras Javadoc API" >
Extras API</a>
</td></tr>

<tr><td>
<a target="topic" class="navLinkTopic" href="docs/mock-api/overview-summary.html" title=" Click Extras Javadoc API">
Mock API</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkSection' href='docs/click-online.html' title=' Click Online'>
Click Online</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/examples.html' title=' Example Applications'>
Examples</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/extentions.html' title=' Extention Projects'>
Extention Projects</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/click-online.html#mailing-lists' title=' Mailing Lists'>
Mailing Lists</a>
</td></tr>

<tr><td>
<a target='_blank' class='navLinkTopic' href='https://issues.apache.org/jira/browse/CLK' title=' Issue Tracker'>
Issue Tracker</a>
<img src='images/external.png' align='baseline' border='0'/>
</td></tr>

<tr><td>
<a target='topic' class='navLinkSection' style="color:navy;" href='docs/click-ide.html' title=' ClickIDE Eclipse Plugin'>
ClickIDE</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' style="color:navy;" href='docs/click-ide-roadmap-changes.html' title=' ClickIDE RoadMap and Changes'>
RoadMap &amp; Changes</a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/click-ide-downloads.html' title=' ClickIDE Download'>
Downloads</a>
</td></tr>

<tr><td>
<img src='images/book.gif' align='absbottom' border='0'/>&nbsp;
References </a>
</td></tr>

<tr><td>
<a target='topic' class='navLinkTopic' href='docs/velocity/velocity.html' title=' Velocity'>
Velocity </a>
</td></tr>

<tr><td>
<a target="_blank" class="navLinkTopic" href="http://www.w3.org/TR/html401/" title=" W3C HTML 4.01 Specification" >
HTML 4.01 </a>
<img border="0" align="baseline" src="images/external.png"/>
</td></tr>

<tr><td>
<a target="_blank" class="navLinkTopic" href="http://www.w3.org/TR/CSS21/" title=" W3C CSS 2.1 Specification">
CSS 2.1 </a>
<img border="0" align="baseline" src="images/external.png"/>
</td></tr>

<tr><td>
<a target="_blank" class="navLinkTopic" href="http://java.sun.com/products/servlet/2.3/javadoc/overview-summary.html" title=" Servlet 2.3 Javadoc API">
Servlet 2.3 API</a>
<img border="0" align="baseline" src="images/external.png"/>
</td></tr>

<tr><td>
<a target='topic' class='navLinkSection' href='docs/thanks.html' title=' Apache Sponsors'>
Thanks</a>
</td></tr>


<tr height="100%">
<td>&nbsp;</td>
</tr>

</table>

</body>
</html>