<%#encoding:UTF-8%><!DOCTYPE html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <!-- No caching headers -->
    <meta http-equiv="cache-control" content="no-cache"/>
    <meta http-equiv="pragma" content="no-cache"/>
    <meta http-equiv="expires" content="-1"/>
    <meta name="keywords" content="JDO, Apache, Java, Data, Objects"/>
    <meta name="description" content="Apache JDO - Java Data Objects"/>

    <title><%= doctitle(:sanitize => true) || (attr 'untitled-label') %></title>

    <link rel="icon" type="image/png" href="<%= (attr :_basedir) %>images/JDO_32x32.png"/>

    <!--
        Apache JDO Documentation Template
        ==================================
        This template derived various aspects from Apache Deltaspike template, the Apache ISIS template and the Datanucleus template.
        This template uses 
        * Bootstrap v3.3.7 (https://getbootstrap.com/) for navbar.
        * Asciidoctor "foundation" CSS
        * Bootswatch "cosmo" theme for Bootstrap (https://bootswatch.com/cosmo).
        * Bootstrap TOC plugin v0.4.1 (https://afeld.github.io/bootstrap-toc/) for the table of contents.
        * jQuery (necessary for Bootstrap's JavaScript plugins)
        * Font-Awesome for some icons used by Asciidoctor
        NOTE: tried using Font-Awesome CSS hosted locally but then fails to work!
    -->
    <link href="<%= (attr :_basedir) %>css/bootswatch/3.3.7/bootstrap-cosmo.css" rel="stylesheet"/>
    <link href="<%= (attr :_basedir) %>css/bootstrap-toc/0.4.1/bootstrap-toc.min.css" rel="stylesheet"/>

    <link href="<%= (attr :_basedir) %>css/asciidoctor/foundation.css" rel="stylesheet"/>
    <link href="<%= (attr :_basedir) %>css/datanucleus_theme.css" rel="stylesheet"/>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">

    <%
       def is_toc?
         not (attributes.has_key?('notoc'))
       end
     %>
    
     <%
       def is_footer?
        not (attributes.has_key?('nofooter'))
       end
     %>

    <%
       def is_no_title?
         attributes.has_key?('notitle')
       end
    %>

    <%
       def is_general?
         attributes.has_key?('general')
       end
    %>
    <%
       def is_usage?
         attributes.has_key?('usage')
       end
      %>
    <%
       def is_metadata?
         attributes.has_key?('metadata')
       end
    %>

    <%
       def is_query?
         attributes.has_key?('query')
       end
    %>
    <%
       def is_community?
         attributes.has_key?('community')
       end
    %>
    <%
       def is_development?
         attributes.has_key?('development')
       end
      %>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="<%= (attr :_basedir) %>js/bootstrap/3.3.7/bootstrap.min.js"></script>
    <script src="<%= (attr :_basedir) %>js/bootstrap-toc/0.4.1/bootstrap-toc.min.js"></script>

    <!-- Coderay syntax formatter -->
    <style type="text/css">
        <%= ::Asciidoctor::Stylesheets.instance.coderay_stylesheet_data %>
    </style>
</head>
<body data-spy="scroll" data-target="#toc">
<!-- Navbar -->
<nav class="navbar navbar-default navbar-static-top">
    <div class="container">
        <div class="navbar-header">
            <!-- Three line menu button for use on mobile screens -->
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <!-- 'style' added to align image with navbar. FIX THIS -->
            <a class="navbar-brand" href="https://db.apache.org/jdo/">
                <img style="margin-top: -12px;" alt="Brand" src="<%= (attr :_basedir) %>images/JDO_44x44.png"/>
            </a>
            <!-- TODO Any way to abstract the version from Maven? -->
            <a class="navbar-brand" href="<%= (attr :_basedir) %>index.html">Apache JDO</a>
        </div>
        <!-- Navbar that will collapse on mobile screens -->
        <div id="navbar" class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li class="dropdown">

                  <!-- menu item General -->

                  <% if is_general? then %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" style="background-color:#2385c6">General<span class="caret"></span></a>
                  <% else %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">General<span class="caret"></span></a>
                  <% end %>
                  <ul class="dropdown-menu">
                        <li><a href="<%= (attr :_basedir) %>why_jdo.html">Why JDO?</a></li>
                        <li><a href="<%= (attr :_basedir) %>getting-started.html">Getting Started</a></li>
                        <li><a href="<%= (attr :_basedir) %>specifications.html">Specifications</a></li>
                        <li><a href="<%= (attr :_basedir) %>tck.html">TCK</a></li>
                        <li><a href="<%= (attr :_basedir) %>javadoc.html">API Javadoc</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="<%= (attr :_basedir) %>jdo_v_jpa.html">JDO v JPA</a></li>
                        <li><a href="<%= (attr :_basedir) %>jdo_v_jpa_api.html">JDO v JPA : API</a></li>
                        <li><a href="<%= (attr :_basedir) %>jdo_v_jpa_orm.html">JDO v JPA : ORM</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="<%= (attr :_basedir) %>license.html">License</a></li>
                        <li><a href="<%= (attr :_basedir) %>impls.html">Implementations</a></li>
                        <li><a href="<%= (attr :_basedir) %>jdo_3_0_overview.html">JDO 3.0 Overview</a></li>
                        <li><a href="<%= (attr :_basedir) %>references.html">References</a></li>
                        <li><a href="<%= (attr :_basedir) %>glossary.html">Glossary</a></li>
                    </ul>
                </li>

                <!-- menu item API Usage -->

                <li class="dropdown">
                  <% if is_usage? then %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" style="background-color:#2385c6">API Usage<span class="caret"></span></a>
                  <% else %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">API Usage<span class="caret"></span></a>
                  <% end %>
                    <ul class="dropdown-menu">
                        <li><a href="<%= (attr :_basedir) %>jdohelper.html">JDO Helper</a></li>
                        <li><a href="<%= (attr :_basedir) %>pmf.html">PersistenceManagerFactory</a></li>
                        <li><a href="<%= (attr :_basedir) %>pm.html">PersistenceManager</a></li>
                        <li><a href="<%= (attr :_basedir) %>transactions.html">Transactions</a></li>
                        <li><a href="<%= (attr :_basedir) %>attach_detach.html">Attach-Detach</a></li>
                        <li><a href="<%= (attr :_basedir) %>fetchgroups.html">Fetch Groups</a></li>
                        <li><a href="<%= (attr :_basedir) %>state_transition.html">Object States</a></li>
                        <li><a href="<%= (attr :_basedir) %>object_retrieval.html">Object Retrieval</a></li>
                        <li><a href="<%= (attr :_basedir) %>exceptions.html">Exceptions</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="<%= (attr :_basedir) %>guides-replication.html">Data Replication</a></li>
                    </ul>
                </li>

                <!-- menu item Types & Metadata -->

                <li class="dropdown">
                  <% if is_metadata? then %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" style="background-color:#2385c6">Types &amp; Metadata<span class="caret"></span></a>
                  <% else %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Types &amp; Metadata<span class="caret"></span></a>
                  <% end %>
                    <ul class="dropdown-menu">
                        <li><a href="<%= (attr :_basedir) %>class_types.html">Types of Classes</a></li>
                        <li><a href="<%= (attr :_basedir) %>field_types.html">Types of Fields</a></li>
                        <li role="separator" class="divider"></li>
                        <!-- <li class="dropdown-header">Metadata</li> -->
                        <li><a href="<%= (attr :_basedir) %>metadata.html">MetaData</a></li>
                        <li><a href="<%= (attr :_basedir) %>annotations.html">Annotations</a></li>
                        <li><a href="<%= (attr :_basedir) %>jdo_dtd.html">jdo DTD/XSD</a></li>
                        <li><a href="<%= (attr :_basedir) %>orm_dtd.html">orm DTD/XSD</a></li>
                        <li><a href="<%= (attr :_basedir) %>jdoquery_dtd.html">jdoquery DTD/XSD</a></li>
                        <li><a href="<%= (attr :_basedir) %>jdoconfig_dtd.html">jdoconfig DTD/XSD</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="<%= (attr :_basedir) %>enhancement.html">Bytecode Enhancement</a></li>
                    </ul>
                </li>

                <!-- menu item Query -->

                <li class="dropdown">
                  <% if is_query? then %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" style="background-color:#2385c6">Query<span class="caret"></span></a>
                  <% else %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Query<span class="caret"></span></a>
                  <% end %>
                    <ul class="dropdown-menu">
                        <li><a href="<%= (attr :_basedir) %>jdoql.html">JDOQL</a></li>
                        <li><a href="<%= (attr :_basedir) %>jdoql_result.html">Result</a></li>
                        <li><a href="<%= (attr :_basedir) %>jdoql_methods.html">Methods</a></li>
                        <li><a href="<%= (attr :_basedir) %>jdoql_quickref.pdf">Quick Ref PDF</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="<%= (attr :_basedir) %>extents.html">Extents</a></li>
                    </ul>
               </li>

                <!-- menu item Community -->

               <li class="dropdown">
                  <% if is_community? then %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" style="background-color:#2385c6">Community<span class="caret"></span></a>
                  <% else %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Community<span class="caret"></span></a>
                  <% end %>
                    <ul class="dropdown-menu">
                        <li><a href="<%= (attr :_basedir) %>get-involved.html">Get Involved</a></li>
                        <li><a href="<%= (attr :_basedir) %>team-list.html">Project Team</a></li>
                        <li><a href="<%= (attr :_basedir) %>mail-lists.html">Mailing Lists</a></li>
                        <li><a href="<%= (attr :_basedir) %>faq.html">FAQ</a></li>
                    </ul>
               </li>

                <!-- menu item Development -->

               <li class="dropdown">
                  <% if is_development? then %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" style="background-color:#2385c6">Development<span class="caret"></span></a>
                  <% else %>
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Development<span class="caret"></span></a>
                  <% end %>
                    <ul class="dropdown-menu">
                        <li><a href="<%= (attr :_basedir) %>roadmap.html">RoadMap / TODO</a></li>
                        <li><a href="<%= (attr :_basedir) %>downloads.html">Downloads</a></li>
                        <li><a href="<%= (attr :_basedir) %>source-code.html">Source Code</a></li>
                        <li><a href="<%= (attr :_basedir) %>coding-standards.html">Coding Standards</a></li>
                        <li><a href="<%= (attr :_basedir) %>issuetracking.html">Issue Tracking</a></li>
                    </ul>
                </li>
            </ul>
           <!-- 'style' added to fix height of input box. FIX THIS -->
            <form class="navbar-form navbar-left" role="search" id="search-form" action="https://www.google.com/search" method="get" style="padding: 1px 15px;">
                <div class="form-group">
                    <input name="sitesearch" value="db.apache.org/jdo" type="hidden">
                    <input name="q" type="text" class="form-control" placeholder="Search" style="margin-top: 7px; padding: 1px; border-radius: 5px; height: 30px; vertical-align: middle;">
                </div>
            </form>
        </div>
    </div>
</nav>
<div class="container">
    <% if is_toc? then %>
        <div class="row-fluid">
            <div class="col-sm-9">
<!--                <div class="page-title">
                    <h3><%= document.name %></h3>
                </div>
-->
                <div id="doc-content">
                    <%= document.content %>
                </div>
            </div>
            <div class="col-sm-3">
                <nav id="toc" data-spy="affix" data-toggle="toc"></nav>
            </div>
        </div>
    <% else %>
        <!-- No TOC -->
        <div class="row-fluid">
            <div class="col-sm-12">
                <% if is_no_title? then %>
                    <!-- no heading -->
                <% else %>
                    <div class="page-title">
                        <h4><%= document.name %></h4>
                    </div>
                <% end %>
                <div id="doc-content">
                    <%= document.content %>
                </div>
            </div>
        </div>
    <% end %>
</div>
<% if is_footer? then %>
  <footer style="color:#fff; background-color:#222222; padding: 5px;">
  <div class="container">
      <div class="row" style="margin-top:25px">
          <div class="col-sm" align="center">
      <a href="https://www.facebook.com/JavaDataObjects" class="externalLink" title="Facebook">Facebook</a>
              |
                          <a href="https://twitter.com/JavaDataObjects" class="externalLink" title="Twitter">Twitter</a>
              |
                          <a href="http://wiki.apache.org/jdo" class="externalLink" title="Wiki">Wiki</a>
              |
                          <a href="http://issues.apache.org/jira/secure/BrowseProject.jspa?id=10630" class="externalLink" title="Issue Tracker">Issue Tracker</a>
              |
                          <a href="mail-lists.html" title="Mailing Lists">Mailing Lists</a>
              |
                          <a href="api31/apidocs/index.html" title="Latest Javadocs">Latest Javadocs</a>
          </div>
      </div>
      <p class="text-center" style="margin-top:16px">&copy; 2005-2020 Apache Software Foundation. All Rights Reserved.</p>
  </div>
  </footer>
<% end %>
</body>
</html>

