<!--
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.
-->
<project name="VXQuery">
  <bannerLeft>
    <name>VXQuery</name>
    <src>images/VXQuery.png</src>
    <href>http://vxquery.apache.org/</href>
  </bannerLeft>

  <bannerRight>
    <name>Apache Software Foundation</name>
    <src>images/asf_logo_wide.png</src>
    <href>http://www.apache.org/</href>
  </bannerRight>

  <skin>
    <groupId>org.apache.maven.skins</groupId>
    <artifactId>maven-fluido-skin</artifactId>
    <version>1.3.1</version>
  </skin>

  <body>
    <menu name="Apache Software Foundation">
      <item name="Home" href="http://www.apache.org/"/>
      <item name="Donate" href="http://www.apache.org/foundation/sponsorship.html"/>
      <item name="Thanks" href="http://www.apache.org/foundation/thanks.html"/>
      <item name="Security" href="http://www.apache.org/security/"/>
    </menu>

    <menu name="Get VXQuery">
      <item name="Download" href="http://www.apache.org/dyn/closer.cgi/incubator/vxquery/" />
    </menu>
      
    <menu name="For Users">
      <item name="Installation" href="user_installation.html"/>
      <item name="Executing a Query" href="user_query.html"/>
      <item name="Running the Test Suite" href="user_running_tests.html"/>
    </menu>

    <menu name="For Developers">
      <item name="Data Basic Types" href="development_tips.html"/>
      <item name="Data XML and Node Types" href="development_xml_node_details.html"/>
      <item name="Eclipse Setup" href="development_eclipse_setup.html"/>
      <item name="Release steps" href="release.html"/>
    </menu>

    <menu ref="reports"/>      
    <menu ref="modules"/>

    <footer>
      <div class="row-fluid">Apache VXQuery, VXQuery, Apache, the Apache
        feather logo, and the Apache VXQuery project logo are either
        registered trademarks or trademarks of The Apache Software
        Foundation in the United States and other countries.
        All other marks mentioned may be trademarks or registered
        trademarks of their respective owners.</div>
    </footer>
  </body>
</project>

