// 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}

import * as common from 'com/google/gitiles/templates/Common.soy';

/**
 * Default Doc Footer
 */
{deltemplate gitiles.customDocFooter}
  {@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. */
<!-- default customDocFooter -->
<footer class="Site-footer">
  <div class="Footer">
    {delcall gitiles.footerPoweredBy /}
    <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}
    </div>
  </div>
</footer>
{/deltemplate}

/**
 * Documentation page rendered from markdown.
 */
{template markdownDoc}
  {@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? navbarHtml: ?}  /** navar.md converted to SafeHtml. */
  {@param? customVariant: ?}  /** variant name for custom styling. */
  {@inject staticUrls: ?}
<!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="{$staticUrls.BASE_CSS_URL}" />
  <link rel="stylesheet" type="text/css" href="{$staticUrls.DOC_CSS_URL}" />
  <link rel="stylesheet" type="text/css" href="{$staticUrls.PRETTIFY_CSS_URL}" />
  {delcall gitiles.customHeadTagPart variant="$customVariant ?: ''" /}
</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}
      </nav>
    {/if}
  </header>
  <div class="Site-content Site-Content--markdown">
    <div class="Container">
      <div class="doc">
        {call common.streamingPlaceholder /}
      </div>
    </div>
  </div>
  {delcall gitiles.customDocFooter variant="$customVariant ?: ''" /}
  {if $analyticsId}
    /* From https://developers.google.com/analytics/devguides/collection/analyticsjs/ */
    <script>
    window.ga=window.ga||function(){lb}(ga.q=ga.q||[]).push(arguments){rb};ga.l=+new Date;

    ga('create', '{$analyticsId}', 'auto');
    ga('send', 'pageview', {lb}title: '{$pageTitle}'{rb});
    </script>
    <script async src="https://www.google-analytics.com/analytics.js"></script>
  {/if}
</body>
</html>
{/template}
