<!--
  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.
 -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>$chart.getTitle()</title>
    <link href="/hicc/css/bootstrap-theme.min.css" type="text/css" rel="stylesheet" />
    <link href="/hicc/css/bootstrap.min.css" type="text/css" rel="stylesheet" />
    <link href="/hicc/css/chartist.css" type="text/css" rel="stylesheet" />
    <script src="/hicc/js/jquery.js"></script>
    <script src="/hicc/js/bootstrap.min.js" type="text/javascript"></script>
    <script src="/hicc/js/chartist.min.js" type="text/javascript"></script>
<style>
.outer {
    display: table;
    position: absolute;
    height: 100%;
    width: 100%;
}

.middle {
    display: table-cell;
    vertical-align: middle;
}

.inner {
    margin-left: auto;
    margin-right: auto;
}

</style>
  </head>
  <body>
    <div class="outer">
      <div class="middle">
        <div class="ct-chart ct-perfect-fourth inner"></div>
      </div>
    </div>
    <script>
      var _series=$seriesMetaData;
      #if ( $chart.getType() == $chartTypeDonut )
        var donut=true;
      #else
        var donut=false;
      #end
    </script>
    <script src="/hicc/js/pie.js"></script>
  </body>
</html>
