<?xml version="1.0" encoding="UTF-8"?>
<!--
  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 xmlns="http://maven.apache.org/DECORATION/1.3.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/DECORATION/1.3.0
         http://maven.apache.org/xsd/decoration-1.3.0.xsd"
         name="Tajo - A Big Data Warehouse System on Hadoop">
  <skin>
    <groupId>org.apache.maven.skins</groupId>
    <artifactId>maven-fluido-skin</artifactId>
    <version>1.3.0</version>
  </skin>


  <bannerLeft>
    <name>Apache Tajo</name>
	  <src>./images/tajo_logo.png</src>
    <href>http://tajo.apache.org</href>
	  <width>240</width>
  </bannerLeft>

  <bannerRight>
    <name>Apache Software Foundation</name>
	  <src>http://apache.org/images/feather-small.gif</src>
    <href>http://apache.org/</href>
  </bannerRight>

  <poweredBy>
    <!--
    <logo name="ApacheCon 2014" href="http://events.linuxfoundation.org/events/apachecon-north-america"
          img="http://www.apache.org/events/current-event-328x78.png"/>
    -->
    <logo name="Maven" href="http://maven.apache.org/" img="http://maven.apache.org/images/logos/maven-feather.png"/>
  </poweredBy>

  <publishDate position="right" />
  <version position="right" />

  <body>
    <head>
      <meta name="description" content="Apache Tajo,SQL-on-Hadoop,big data warehouse system on Hadoop,relational and distributed query engine" />
      <script type="text/javascript">
(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-38152529-1', 'auto');
ga('send', 'pageview');

function addListener(element, type, callback) {
 if (element.addEventListener) element.addEventListener(type, callback);
 else if (element.attachEvent) element.attachEvent('on' + type, callback);
}

function ga_event_load() {
        var dn_src_0_10_1 = document.getElementById('tajo-0.10.1-src');
        var dn_bin_0_10_1 = document.getElementById('tajo-0.10.1-bin');
        var dn_jdbc_0_10_1 = document.getElementById('tajo-jdbc-0.10.1');

        addListener(dn_src_0_10_1, 'click', function() {
          ga('send', 'event', 'tajo-0.10.1-src', 'click', 'tajo-0.10.1-src');
        });
        addListener(dn_bin_0_10_1, 'click', function() {
          ga('send', 'event', 'tajo-0.10.1-bin', 'click', 'tajo-0.10.1-bin');
        });
        addListener(dn_jdbc_0_10_1, 'click', function() {
          ga('send', 'event', 'tajo-jdbc-0.10.1', 'click', 'tajo-jdbc-0.10.1');
        });


        var dn_src_0_10_0 = document.getElementById('tajo-0.10.0-src');
        var dn_bin_0_10_0 = document.getElementById('tajo-0.10.0-bin');
        var dn_jdbc_0_10_0 = document.getElementById('tajo-jdbc-0.10.0');

        addListener(dn_src_0_10_0, 'click', function() {
          ga('send', 'event', 'tajo-0.10.0-src', 'click', 'tajo-0.10.0-src');
        });
        addListener(dn_bin_0_10_0, 'click', function() {
          ga('send', 'event', 'tajo-0.10.0-bin', 'click', 'tajo-0.10.0-bin');
        });
        addListener(dn_jdbc_0_10_0, 'click', function() {
          ga('send', 'event', 'tajo-jdbc-0.10.0', 'click', 'tajo-jdbc-0.10.0');
        });
}

window.onload = ga_event_load;
      </script>
      <style>
        a.externalLink[href^=http] {
          background-image: none;
          padding-right: 0;
        }
      </style>
    </head>

    <links>
      <item name="GIT" href="https://git-wip-us.apache.org/repos/asf/tajo.git" />
    </links>

    <breadcrumbs>
      <item name="Apache" href="http://www.apache.org" />
      <item name="Tajo" href="/" />
    </breadcrumbs>

    <menu name="Tajo">
      <item name="Overview" href="index.html" />
      <item name="License" href="license.html" />
      <item name="Downloads" href="downloads.html" />
      <item name="Getting Started" href="docs/current/getting_started.html" />
    </menu>

    <menu name="Community">
      <item name="Wiki" href="http://cwiki.apache.org/confluence/display/TAJO/" />
      <item name="Team" href="team-list.html" />
      <item name="Mailing Lists" href="mailing-lists.html" />
      <item name="IRC" href="irc.html" />
      <item name="Issue Tracker" href="https://issues.apache.org/jira/browse/TAJO" />
      <item name="Powered By" href="https://cwiki.apache.org/confluence/display/TAJO/Powered+By" />
      <item name="Presentations" href="https://cwiki.apache.org/confluence/display/TAJO/Presentations" />
    </menu>

    <menu name="Documentation">
      <item name="Devel" href="http://tajo.apache.org/docs/devel/index.html" />
      <item name="Current (0.10.1)" href="http://tajo.apache.org/docs/current/index.html" />
    </menu>

    <menu name="Contributes">
      <item name="Source Code" href="source-code.html" />
      <item name="Get Involved" href="http://www.apache.org/foundation/getinvolved.html" />
      <item name="How To Contribute" href="https://cwiki.apache.org/confluence/display/TAJO/How+to+Contribute+to+Tajo" />
      <item name="Review Board" href="https://reviews.apache.org/groups/tajo" />
      <item name="Review Request Tool" href="review-request-tool.html" />
      <item name="Coding Style" href="https://cwiki.apache.org/confluence/display/TAJO/Code+Style" />
    </menu>

    <menu name="Apache">
      <item name="Web Site" href="http://www.apache.org/" />
      <item name="Sponsorship" 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>

    <footer>
      <div class="row span12">
        Apache Tajo, Tajo, Apache, the Apache feather logo, and the Apache Tajo logo are trademarks
        of The Apache Software Foundation. All other marks mentioned may be trademarks or registered
        trademarks of their respective owners.
      </div>
    </footer>
  </body>

  <custom>
    <fluidoSkin>
      <topBarEnabled>true</topBarEnabled>
      <sideBarEnabled>true</sideBarEnabled>
      <sourceLineNumbersEnabled>false</sourceLineNumbersEnabled>
      <profile>production</profile>
      <googleSearch>
        <sitesearch>http://tajo.apache.org</sitesearch>
      </googleSearch>

      <twitter>
        <user>ApacheTajo</user>
        <showUser>true</showUser>
        <showFollowers>false</showFollowers>
      </twitter>
    </fluidoSkin>
  </custom>
</project>
