<!--
@license
Copyright (C) 2017 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.
-->

<script>
(function(window) {
  'use strict';

  window.Gerrit = window.Gerrit || {};

  const PROJECT_DASHBOARD_PATTERN = /\/p\/(.+)\/\+\/dashboard\/(.*)/;
  const REPO_URL_PATTERN = /^\/admin\/repos/;
  const PROJECT_URL = '/admin/projects';
  /** @polymerBehavior Gerrit.BaseUrlBehavior */
  Gerrit.BaseUrlBehavior = {
    /** @return {string} */
    getBaseUrl() {
      return window.CANONICAL_PATH || '';
    },

    computeGwtUrl(path) {
      const base = this.getBaseUrl();
      let clientPath = path.substring(base.length);
      const match = clientPath.match(PROJECT_DASHBOARD_PATTERN);
      if (match) {
        clientPath = `/projects/${match[1]},dashboards/${match[2]}`;
      }
      // Replace any '/admin/project' links to '/admin/repo'
      clientPath = clientPath.replace(REPO_URL_PATTERN, PROJECT_URL);
      return base + '/?polygerrit=0#' + clientPath;
    },
  };
})(window);
</script>
