<!--
@license
Copyright (C) 2016 The Android Open Source Project

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.
-->
<link rel="import" href="../../../bower_components/polymer/polymer.html">

<link rel="import" href="../../../behaviors/docs-url-behavior/docs-url-behavior.html">
<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
<link rel="import" href="../../../behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.html">
<link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
<link rel="import" href="../../shared/gr-dropdown/gr-dropdown.html">
<link rel="import" href="../../shared/gr-icons/gr-icons.html">
<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
<link rel="import" href="../gr-account-dropdown/gr-account-dropdown.html">
<link rel="import" href="../gr-smart-search/gr-smart-search.html">

<dom-module id="gr-main-header">
  <template>
    <style include="shared-styles">
      :host {
        display: block;
      }
      nav {
        align-items: center;
        display: flex;
      }
      .bigTitle {
        color: var(--header-text-color);
        font-size: var(--header-title-font-size);
        text-decoration: none;
      }
      .bigTitle:hover {
        text-decoration: underline;
      }
      /* TODO (viktard): Clean-up after chromium-style migrates to component. */
      .titleText::before {
        background-image: var(--header-icon);
        background-size: var(--header-icon-size) var(--header-icon-size);
        background-repeat: no-repeat;
        content: "";
        display: inline-block;
        height: var(--header-icon-size);
        margin-right: calc(var(--header-icon-size) / 4);
        vertical-align: text-bottom;
        width: var(--header-icon-size);
      }
      .titleText::after {
        content: var(--header-title-content);
      }
      ul {
        list-style: none;
        padding-left: 1em;
      }
      .links > li {
        cursor: default;
        display: inline-block;
        padding: 0;
        position: relative;
      }
      .linksTitle {
        display: inline-block;
        font-weight: var(--font-weight-bold);
        position: relative;
        text-transform: uppercase;
      }
      .linksTitle:hover {
        opacity: .75;
      }
      .rightItems {
        align-items: center;
        display: flex;
        flex: 1;
        justify-content: flex-end;
      }
      .rightItems gr-endpoint-decorator:not(:empty) {
        margin-left: 1em;
      }
      gr-smart-search {
        flex-grow: 1;
        margin-left: .5em;
        max-width: 500px;
      }
      gr-dropdown,
      .browse {
        padding: .6em .5em;
      }
      gr-dropdown {
        --gr-dropdown-item: {
          color: var(--primary-text-color);
        }
      }
      .settingsButton {
        margin-left: .5em;
      }
      .browse {
        color: var(--header-text-color);
        /* Same as gr-button */
        margin: 5px 4px;
        text-decoration: none;
      }
      .invisible,
      .settingsButton,
      gr-account-dropdown {
        display: none;
      }
      :host([loading]) .accountContainer,
      :host([logged-in]) .loginButton,
      :host([logged-in]) .registerButton {
        display: none;
      }
      :host([logged-in]) .settingsButton,
      :host([logged-in]) gr-account-dropdown {
        display: inline;
      }
      .accountContainer {
        align-items: center;
        display: flex;
        margin: 0 -.5em 0 .5em;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
      }
      .loginButton, .registerButton {
        padding: .5em 1em;
      }
      .dropdown-trigger {
        text-decoration: none;
      }
      .dropdown-content {
        background-color: var(--view-background-color);
        box-shadow: 0 1px 5px rgba(0, 0, 0, .3);
      }
      /*
       * We are not using :host to do this, because :host has a lowest css priority
       * compared to others. This means that using :host to do this would break styles.
       */
      .linksTitle,
      .bigTitle,
      .loginButton,
      .registerButton,
      iron-icon,
      gr-account-dropdown {
        color: var(--header-text-color);
      }
      #mobileSearch {
        display: none;
      }
      @media screen and (max-width: 50em) {
        .bigTitle {
          font-size: var(--font-size-large);
          font-weight: var(--font-weight-bold);
        }
        gr-smart-search,
        .browse,
        .rightItems .hideOnMobile,
        .links > li.hideOnMobile {
          display: none;
        }
        #mobileSearch {
          display: inline-flex;
        }
        .accountContainer {
          margin-left: .5em !important;
        }
        gr-dropdown {
          padding: .5em 0 .5em .5em;
        }
      }
    </style>
    <nav>
      <a href$="[[_computeRelativeURL('/')]]" class="bigTitle">
        <gr-endpoint-decorator name="header-title">
          <span class="titleText"></span>
        </gr-endpoint-decorator>
      </a>
      <ul class="links">
        <template is="dom-repeat" items="[[_links]]" as="linkGroup">
          <li class$="[[linkGroup.class]]">
          <gr-dropdown
              link
              down-arrow
              items = [[linkGroup.links]]
              horizontal-align="left">
            <span class="linksTitle" id="[[linkGroup.title]]">
              [[linkGroup.title]]
            </span>
          </gr-dropdown>
          </li>
        </template>
      </ul>
      <div class="rightItems">
        <gr-endpoint-decorator
            class="hideOnMobile"
            name="header-small-banner"></gr-endpoint-decorator>
        <gr-smart-search
            id="search"
            search-query="{{searchQuery}}"></gr-smart-search>
        <gr-endpoint-decorator
            class="hideOnMobile"
            name="header-browse-source"></gr-endpoint-decorator>
        <div class="accountContainer" id="accountContainer">
          <iron-icon id="mobileSearch" icon="gr-icons:search" on-tap='_onMobileSearchTap'></iron-icon>
          <div class$="[[_computeIsInvisible(_registerURL)]]">
            <a
                class="registerButton"
                href$="[[_registerURL]]">
              [[_registerText]]
            </a>
          </div>
          <a class="loginButton" href$="[[_loginURL]]">Sign in</a>
          <a
              class="settingsButton"
              href$="[[_generateSettingsLink()]]"
              title="Settings">
            <iron-icon icon="gr-icons:settings"></iron-icon>
          </a>
          <gr-account-dropdown account="[[_account]]"></gr-account-dropdown>
        </div>
      </div>
    </nav>
    <gr-js-api-interface id="jsAPI"></gr-js-api-interface>
    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
  </template>
  <script src="gr-main-header.js"></script>
</dom-module>
