// Copyright 2015 Google Inc. All Rights Reserved.
//
// 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.
{namespace gitiles autoescape="strict"}

/**
 * Documentation page rendered from markdown.
 *
 * @param? siteTitle h1 title from navbar.md.
 * @param pageTitle h1 title from specific page.
 * @param? logoUrl url of image logo.
 * @param? homeUrl url to jump to top of site.
 * @param? analyticsId Google Analytics Property ID.
 * @param sourceUrl url for source view of the page.
 * @param logUrl url for log history of page.
 * @param blameUrl url for blame of page source.
 * @param? navbarHtml markdown ast node to convert.
 * @param bodyHtml safe html to embed into the body of the page.
 */
{template .markdownDoc}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>
    {if $siteTitle}{$siteTitle} -{sp}{/if}
    {$pageTitle}
  </title>
  <link rel="stylesheet" type="text/css" href="{gitiles.BASE_CSS_URL}" />
  <link rel="stylesheet" type="text/css" href="{gitiles.DOC_CSS_URL}" />
  <link rel="stylesheet" type="text/css" href="{gitiles.PRETTIFY_CSS_URL}" />
</head>
<body class="Site">
  <header class="Site-header {if $navbarHtml}Site-header--withNavbar{/if}">
    <div class="Header">
      <div class="Header-title">
        {if $homeUrl}<a class="Header-anchor" href="{$homeUrl}">{/if}
        {if $logoUrl}<img class="Header-anchorLogo" src="{$logoUrl}" alt="project logo" />{/if}
        {if $siteTitle}<span class="Header-anchorTitle">{$siteTitle}</span>{/if}
        {if $homeUrl}</a>{/if}
      </div>
    </div>
    {if $navbarHtml}
      <nav class="Header-nav" role="navigation">
        {$navbarHtml}
      </div>
    {/if}
  </header>
  <div class="Site-content Site-Content--markdown">
    <div class="Container">
      <div class="doc">
        {$bodyHtml}
      </div>
    </div>
  </div>
  <footer class="Site-footer">
    <div class="Footer">
      <div class="Footer-poweredBy">
        Powered by <a href="https://gerrit.googlesource.com/gitiles/">Gitiles</a>
      </div>
      <div class="Footer-links">
        {if $sourceUrl}<a class="Footer-link" href="{$sourceUrl}">{msg desc="text for the source link"}source{/msg}</a>{/if}
        {if $logUrl}<a class="Footer-link" href="{$logUrl}">{msg desc="text for the log link"}log{/msg}</a>{/if}
        {if $blameUrl}<a class="Footer-link" href="{$blameUrl}">{msg desc="text for the blame link"}blame{/msg}</a>{/if}
      </ul>

    </div>
  </footer>
  {if $analyticsId}
    /* From https://developers.google.com/analytics/devguides/collection/analyticsjs/ */
    <script>
    (function(i,s,o,g,r,a,m){lb}i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){lb}
    (i[r].q=i[r].q||[]).push(arguments){rb},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)
    {rb})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

    ga('create', '{$analyticsId}', 'auto');
    ga('send', 'pageview', {lb}title: '{$pageTitle}'{rb});
    </script>
  {/if}
</body>
</html>
{/template}
