<%--
Copyright (C) 2009-2010 the original author or authors.
See the notice.md file distributed with this work for additional
information regarding copyright ownership.

Licensed 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.
--%>
<%@ var body: String %>
<%@ var title: String = "" %>
<%@ var style : String = null %>
<%@ var navigation: Boolean = true %>
<% escapeMarkup = false %>
<% import org.fusesource.scalate.servlet.ServletRenderContext._ %>
<% import org.apache.servicemix.documentation.Helper._ %>
<!DOCTYPE html>
<html>
<head>
  <title>Apache ServiceMix Documentation - ${title}</title>

  <link href="${uri("/theme/master.css")}" rel="stylesheet" type="text/css" />
  <link href="${uri("/theme/pygmentize.css")}" rel="stylesheet" type="text/css" />
  <% if (style != null) { %>
    <link href="${style}" rel="stylesheet" type="text/css" />
  <% } %>

  <script type="text/javascript" src="${uri("/scripts/jquery.js")}"></script>
  <script type="text/javascript" src="${uri("/scripts/jquery.cookie.js")}"></script>
  <script type="text/javascript" src="${uri("/scripts/jquery.jstree.js")}"></script>

  <script>
    $(document).ready(function(){
	  $("#nav").jstree({
		"themes": {
		  "theme": "apple", "dots": false
		},
		"plugins" : [ "themes", "html_data", "cookies", "themes" ]
  	  });
    });
  </script>
  <script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-398545-1']);
    _gaq.push(['_trackPageview']);

    (function() {
      var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
      ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
      var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();
  </script>
</head>
<body>
    <div id="siteHeader">
      <table width="100%">
      <tr valign="middle">
        <td align="left">
            <a href="http://servicemix.apache.org/" title="An open source ESB">
            <img border="0" src="${uri("/images/logodesign.png")}" height="100"/><img border="0" src="${uri("/images/new-logo.png")}" />
            </a>
          </td>
          <td align="right">
            <a href="http://www.apache.org/" title="The Apache Sofware Foundation">
              <img border="0" src="${uri("http://activemq.apache.org/images/asf-logo.png")}">
            </a>
          </td>
        </tr>
        <tr>
          <td colspan="2">
            <ul class="siteNav">
              <li ><a href="http://servicemix.apache.org/" title="Overview">Overview</a></li>
              <li><a href="http://servicemix.apache.org/download.html" title="Download">Download</a></li>
              <li><a href="${uri("/index.html")}" title="Documentation">Documentation</a></li>
              <li>
                <a href="http://servicemix.apache.org/support/index.html" title="Support">Support</a>
                <ul>
                  <li><a href="http://servicemix.apache.org/support/mailing-lists.html" title="Mailing Lists">Mailing Lists</a></li>
                  <li><a href="http://servicemix.apache.org/support/discussion-forums.html" title="Discussion Forums">Forums</a></li>
                  <li><a href="http://servicemix.apache.org/irc.html" title="IRC">IRC</a></li>
                <li><a href="http://servicemix.apache.org/support/faq.html" title="FAQ">FAQ</a></li>
                  <li><a href="http://servicemix.apache.org/support/presentations.html" title="Presentations">Presentations</a></li>
                </ul>
              </li>
              <li>
                <a href="http://servicemix.apache.org/contrib/index.html" title="Contributing">Contributing</a>
                <ul>
                  <li><a href="http://servicemix.apache.org/contrib/becoming-a-committer.html" title="Committing">Become a committer</a></li>
                  <li><a href="http://servicemix.apache.org/contrib/committers-guide.html" title="Committing Guide">Committer Guide</a></li>
                  <li><a href="http://servicemix.apache.org/contrib/source.html" title="Source">Source</a></li>
                  <li><a href="http://issues.apache.org/activemq/browse/SM" title="JIRA">JIRA</a></li>
                  <li><a href="http://servicemix.apache.org/contrib/developers.html" title="Developers">Developer Resources</a></li>
                </ul>
              </li>
              <% if (sitegen(engine)) { %>
              <li>
                <form action="http://www.google.com/search" method="get" style="font-size: 10px;">
                <input name="ie" type="hidden" value="UTF-8"></input>
                <input name="oe" type="hidden" value="UTF-8"></input>
                  <input maxlength="255" name="q" size="15" type="text" value=""></input>
                  <input name="btnG" type="submit" value="Search"></input>
                  <input name="domains" type="hidden" value="servicemix.apache.org/docs/4.3.0-SNAPSHOT/"></input>
                  <input name="sitesearch" type="hidden" value="servicemix.apache.org/docs/4.3.0-SNAPSHOT/"></input>
                </form>
              </li>
              <% } %>
            </ul>
          </td>
        </tr>
      </table>
    </div>
    <div id="sectHeader">
      <table width="100%">
        <tr>
          <td>
            <a href="${uri("/index.html")}><h1>Apache ServiceMix Guides</h1></a>
          </td>
          <td align="right" valign="middle">
            <ul class="sectNav">
              <li><a href="${uri("/index.html")}" title="Home">Home</a></li>
              <li>Guides</li>
              <li><a href="${uri("/contribute.html")}">Contribute</a></li>
            </ul>
          </td>
        </tr>
      </table>
    </div>
    <div id="content">
      <% if (navigation) { %>
        <div id="nav">
            ${include(toc(requestUri))}
        </div>
        <div id="body">
          <% if (jbi(requestUri)) { %>
          <div class="note">
            <h1>JBI Support deprecated in Apache ServiceMix 4</h1>
            <p>JBI 1.0 support is available in Apache ServiceMix 4 to allow existing users to migrate more easily to this latest version - if you're a new user, you should consider JBI deprecated and not use it for your project.
            Take a look at our <a href="${uri("/users-guide/getting-started/technology-selection.html")}"</a>technology selection guidelines</a> for more information.</p>
          </div>
          <% } %>
          <%= body %>
        </div>
      <% } %>

      <% if (!navigation) { %>
        <%= body %>
      <% } %>
    </div>
      <div id="siteFooter">
        <p>Thanks for using Apache ServiceMix!</p>
  </div>
</body>
</html>