<!--
   Copyright 2012 Google Inc.

   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 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.

   @fileoverview Layout for the mod_pagespeed console.

   @author joseantonio@google.com (Jose Antonio Martinez)
   @author sarahdw@google.com (Sarah Dapul-Weberman)
   @author bvb@google.com (Ben VanBerkum)

   Note: this file is combined with others during the build process and should
   only contain the body of the console HTML.
-->

<title>mod_pagespeed console</title>
<div id="mod" class="mod-container">
  <div id="mod-header" style="z-index:60;">
    <div class="mod-appname">
      <span>mod_pagespeed console</span>
    </div>
  </div>
  <div id="mod-toolbar"></div>
  <div class="mod-widgetbar">
    <ul>
      <li>
        <span class="row">
          <a id="modal-launcher" class="mod-button" style="-webkit-user-select: none;">+ Add Graph</a>
        </span>
      </li>
      <li>
        <span class="row">
          <a id="auto-update" class="mod-button">Auto-Update Off</a>
        </span>
      </li>
      <li class="last">
        <span class="row">
          <a id="toggle-messages" class="mod-button">Show recent messages</a>
        </span>
      </li>
    </ul>
  </div><!-- End widgetbar -->
  <div id="mod-wrap">
    <div id="mod-error">There was an error updating the data.</div>
    <div id="container"></div>
    <div class="mod-widgets errors" id="messages-div" style="display: none;">
      <div class="mod-widgets-topbar">
        <span class="title" id="error-messages-title">Recent Messages</span>
      </div>
      <div id="messages"></div>
    </div>
  </div>
  <!-- End mod-wrap -->
  <div id="mod-footer">
    Copyright Google Inc, 2012
  </div>
  <div id="add-widget" style="display: none;">
    <p>Show the following metric:<br/>
      <select id="add-graph-list"></select>
    </p><br/>
    <p id="mod-compare-with">Compare with: <span class="optional">(optional)</span><br/>
      <select id="add-graph-compare-list"></select>
    </p>
    <br/>
    <p><b>Filter this data: </b>&nbsp;&nbsp;&nbsp;<a id="hide-filter" style="display: none;">Hide</a><br/>
      <a id="add-filter">Add a Filter</a>
      <span id="date-filter" style="display: none;">
        <span id="start-date-filter">
          Start Date: <span id="start-date"></span>&nbsp;&nbsp;&nbsp;<span class="mod-button" id="start-date-calendar-button"><img alt="Choose a date" id="start-date-calendar"/></span><br/>
        </span>

        <span id="end-date-label">End Date: </span><span id="end-date"></span>&nbsp;&nbsp;&nbsp;<span class="mod-button" id="end-date-calendar-button"><img alt="Choose a date" id="end-date-calendar"/></span><br/>
        Granularity (s): <input type="number" id="granularity" min="1"/>
      </span>
    </p>
    <br/>
    <p><b>Widget Title</b><br/>
      <input type="text" id="widget-title"/>
    </p>
  </div>

  <div id="edit-widget" style="display: none;">
    <p>Show the following metric:<br/>
      <select id="edit-graph-list"></select>
    </p>
    <br/>
     <p id="mod-compare-with-edit">Compare with: <span class="optional">(optional)</span><br/>
      <select id="edit-graph-compare-list"></select>
    </p>
    <br/>
    <p>Filter this data: &nbsp;&nbsp;&nbsp;<a id="hide-filter-edit" style="display: none;">Hide</a><br/>
      <a id="add-filter-edit">Add a Filter</a>
      <span id="date-filter-edit" style="display: none;">
        <span id="start-date-filter-edit">
          Start Date: <span id="start-date-edit"></span>&nbsp;&nbsp;&nbsp;<span class="mod-button" id="start-date-calendar-button-edit"><img alt="Choose a date" id="start-date-calendar-edit"/></span><br/>
        </span>

        <span id="end-date-label-edit">End Date: </span><span id="end-date-edit"></span>&nbsp;&nbsp;&nbsp;<span class="mod-button" id="end-date-calendar-button-edit"><img alt="Choose a date" id="end-date-calendar-edit"/></span><br/>
        Granularity (s): <input type="number" id="granularity-edit" min="1"/>
      </span>
    </p><br/>
    <p><b>Widget Title</b><br/>
      <input type="text" id="widget-title-edit" value="title"/>
    </p>
  </div>

</div><!-- End container -->
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
