<!doctype html>
<!--
   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.
-->
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <title>HTrace</title>
    
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
    <!-- TODO: Add Favicon -->
    <link rel="icon" href="//favicon.ico" type="image/x-icon" sizes="16x16">
    <link href="lib/bootstrap-3.3.1/css/bootstrap.min.css" rel="stylesheet">
    <link href="lib/css/main.css" rel="stylesheet">

    <!-- TODO: Remove shiv -->
    <!--[if lt IE 9]>
      <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.2/html5shiv.js"></script>
    <![endif]-->
  </head>
  <body>
    <header role="banner">
      <nav class="navbar navbar-default navbar-static-top" role="navigation">
        <div class="container-fluid">
          <a class="navbar-brand" href="#">HTrace</a>
        </div>
      </nav>
    </header>
    <div class="container-fluid" role="application">
      <div class="row">
        <div class="col-md-3" role="form">
          <div class="panel panel-default">
            <div class="panel-heading">
              <h3 class="panel-title">Controls</h3>
            </div>
            <div class="panel-body">
              <form class="form-horizontal">
                <div class="form-group">
                  <div class="col-sm-12">
                    <input type="search" class="form-control" id="search" placeholder="Search description">
                  </div>
                </div>
                <hr />
                <div class="form-group">
                  <div class="col-sm-12">
                    <input type="datetime" class="form-control" id="begintime" placeholder="Start time">
                  </div>
                </div>
                <div class="form-group">
                  <div class="col-sm-12">
                    <input type="datetime" class="form-control" id="stoptime" placeholder="End time">
                  </div>
                </div>
                <div class="form-group">
                  <div class="col-sm-12">
                    <input type="datetime" class="form-control" id="duration" placeholder="Duration">
                  </div>
                </div>
                <div class="form-group">
                  <div class="col-sm-12">
                    <button type="button" class="btn btn-default">Search</button>
                  </div>
                </div>
              </form>
            </div>
          </div>
        </div>

        <div class="col-md-9" role="main"></div>
      </div>
    </div>
    <footer></footer>

    <script id="span-template" type="text/html">
    <% _.each(spans, function(span) { %>
    <li class="span">
      <div class="panel panel-primary">
        <div class="panel-heading">
          <h3 class="panel-title">
            <p class="pull-right"><%- span.processId %></p>
            <p class="pull-left"><%- span.spanId %>&nbsp;&nbsp;</p>
            <p class="pull-left"><%- span.description %></p>
            <div style="clear: both; line-height: 0px; font-size: 0px;"></div>
          </h3>
        </div>
        <div class="panel-body">

        </div>
      </div>
    </li>
    <% }); %>
    </script>

    <script src="lib/js/jquery-2.1.3.min.js" type="text/javascript"></script>
    <script src="lib/js/underscore-1.7.0.min.js" type="text/javascript"></script>
    <script src="lib/js/backbone-1.1.2.min.js" type="text/javascript"></script>
    <script src="lib/bootstrap-3.3.1/js/bootstrap.min.js" type="text/javascript"></script>

    <script src="app/app.js" type="text/javascript"></script>
    <script src="app/models/span.js" type="text/javascript"></script>
    
    <script src="app/mock.js" type="text/javascript"></script>

    <script src="app/views/span.js" type="text/javascript"></script>
    <script src="app/views/search.js" type="text/javascript"></script>
    <script src="app/setup.js" type="text/javascript"></script>
    <script type="text/javascript">
      
    </script>
  </body>
</html>
