<?xml version="1.0" encoding="ISO-8859-1"?>

<!--
 ! Copyright 2009-2013 by The Regents of the University of California
 ! 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 from
 ! 
 !     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="AsterixDB" xmlns="http://maven.apache.org/DECORATION/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd">
  <bannerLeft>
    <name>AsterixDB</name>
    <src>images/asterixlogo.png</src>
    <href>http://asterixdb.ics.uci.edu/</href>
  </bannerLeft>
  
  <version position="right"/>

  <poweredBy>
    <logo name="Hyracks"
          href="https://code.google.com/p/hyracks/"
          img="images/hyrax_ts.png"/>
  </poweredBy>

  <skin>
    <groupId>org.apache.maven.skins</groupId>
    <artifactId>maven-fluido-skin</artifactId>
    <version>1.3.0</version>
  </skin>
  <custom>
    <fluidoSkin>
      <!-- <topBarEnabled>true</topBarEnabled>
      <topBarIcon>
        <name>AsterixDB</name>
        <alt>AsterixDB</alt>
        <src>images/asterixlogo.png</src>
        <href>/index.html</href>
      </topBarIcon>
      <sideBarEnabled>false</sideBarEnabled> -->
      <!-- <topBarContainerStyle>width: 90%;</topBarContainerStyle> -->
      <sourceLineNumbersEnabled>true</sourceLineNumbersEnabled>
      <!-- <googlePlusOne /> -->
    </fluidoSkin>
  </custom>

  <body>
    <head>
      <script>
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
    
        ga('create', 'UA-41536543-1', 'uci.edu');
        ga('send', 'pageview');
      </script>
    </head>
    <links>
      <item name="Documentation Home" href="index.html"/>
    </links>

    <menu name="Documentation">
      <item name="Installing and Managing AsterixDB using Managix" href="install.html"/>
      <item name="AsterixDB 101: An ADM and AQL Primer" href="aql/primer.html"/>
      <item name="Asterix Data Model (ADM)" href="aql/datamodel.html"/>
      <item name="Asterix Query Language (AQL)" href="aql/manual.html"/>
      <item name="AQL Functions" href="aql/functions.html"/>
      <item name="AQL Allen's Relations Functions" href="aql/allens.html"/>
      <item name="AQL Support of Similarity Queries" href="aql/similarity.html"/>
      <item name="Accessing External Data" href="aql/externaldata.html"/>
      <item name="REST API to AsterixDB" href="api.html"/>
    </menu>

    <menu ref="reports"/>

    <footer>&copy; Copyright 2013 University of California, Irvine</footer>

  </body>
</project>
