<!--
  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" class="no-js">
  <head>
    <title>Tile</title>
    <link href="../css/bootstrap-theme.min.css" type="text/css" rel="stylesheet" />
    <link href="../css/bootstrap.min.css" type="text/css" rel="stylesheet" />
    <script src="../js/jquery.js" type="text/javascript"></script>
    <script src="../js/bootstrap.min.js" type="text/javascript"></script>
    <style>
      .tile {
        color: #ffffff;
        background-color: #5bc0de;
      }
      .row {
        display: -webkit-box;
        display: -webkit-flex;
        display: -ms-flexbox;
        display:         flex;
      }
      .banner {
        background-color: #ffffff;
      }
    </style>
  </head>
  <body onResize="resize()">
    <div class="jumbotron">
    <div class="container">
      <div class="row">
        <div class="col-xs-5 col-md-5 text-center tile">
            <h2><span class="glyphicon glyphicon-cloud" aria-hidden="true"></span></h2>
            Clusters
        </div>
        <div class="col-xs-7 col-md-7 text-center banner">
          <p><h1>98</h1> Running</p>
        </div>
      </div>
    </div>
    </div>

    <script src="js/jquery.js"></script>
    <script>
      var tracker;

      function resize() {
        clearTimeout(tracker);
        tracker = setTimeout(render, 50);
      }

      function render() {
        document.body.style.overflow = 'hidden';
        tracker = setTimeout(render, 3000);
      }

      $( document ).ready(function() {
        render();
      });
    </script>
  </body>
</html>
