// Copyright 2012 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"}

/**
 * Detail page for a path within a tree.
 *
 * @param title human-readable name of this path.
 * @param repositoryName name of this repository.
 * @param? menuEntries menu entries.
 * @param? customVariant variant name for custom styling.
 * @param breadcrumbs breadcrumbs for this page.
 * @param type path type, matching one of the constant names defined in
 *         org.eclipse.jgit.lib.FileMode.
 * @param data path data, matching the params for one of .treeDetail,
 *     .blobDetail, .symlinkDetail, or .gitlinkDetail as appropriate.
 */
{template .pathDetail stricthtml="false"}
{if $type == 'REGULAR_FILE' or $type == 'EXECUTABLE_FILE'}
  {call .header data="all"}
    {param css: [gitiles.PRETTIFY_CSS_URL] /}
  {/call}
{elseif $data.readmeHtml}
  {call .header data="all"}
    {param css: [gitiles.DOC_CSS_URL, gitiles.PRETTIFY_CSS_URL] /}
  {/call}
{else}
  {call .header data="all" /}
{/if}

{switch $type}
  {case 'TREE'}{call .treeDetail data="$data" /}
  {case 'SYMLINK'}{call .symlinkDetail data="$data" /}
  {case 'REGULAR_FILE'}{call .blobDetail data="$data" /}
  {case 'EXECUTABLE_FILE'}{call .blobDetail data="$data" /}
  {case 'GITLINK'}{call .gitlinkDetail data="$data" /}
  {default}
    <div class="error">
      {msg desc="Error message for an unknown object type"}Object has unknown type.{/msg}
    </div>
{/switch}

{call .footer}
  {param customVariant: $customVariant /}
{/call}
{/template}

/**
 * Detail for a symbolic link.
 *
 * @param target target of this symlink.
 * @param? targetUrl optional URL for the target, if it is within this repo.
 */
{template .symlinkDetail}
<div class="symlink-detail">
  {msg desc="Lead-in text for the symbolic link target."}Symbolic link to{/msg}
  {sp}{if $targetUrl}<a href="{$targetUrl}">{$target}</a>{else}{$target}{/if}
</div>
{/template}

/**
 * Detail for a git submodule link.
 *
 * @param sha submodule commit SHA.
 * @param remoteUrl URL of the remote repository.
 * @param? httpUrl optional HTTP URL pointing to a web-browser-compatible URL of
 *     the remote repository.
 */
{template .gitlinkDetail}
<div class="gitlink-detail">
  {msg desc="Lead-in text for the git link URL"}Submodule link to {$sha} of{/msg}
  {if $remoteUrl}
    {sp}{if $httpUrl}<a href="{$httpUrl}">{$remoteUrl}</a>{else}{$remoteUrl}{/if}
  {else}
    {sp}{msg desc="Text describing an unknown submodule URL"}a submodule with an unknown URL{/msg}
  {/if}
</div>
{/template}
