<!--
	Copyright 2009 The Go Authors. All rights reserved.
	Use of this source code is governed by a BSD-style
	license that can be found in the LICENSE file.
-->
<!--
	Note: Static (i.e., not template-generated) href and id
	attributes start with "pkg-" to make it impossible for
	them to conflict with generated attributes (some of which
	correspond to Go identifiers).
-->
{{$pkg := .Data}}
{{with $pkg.PDoc}}
	{{if $pkg.IsMain}}
		{{/* command documentation */}}
		{{$pkg.Comment .Doc}}
	{{else}}
		{{/* package documentation */}}
		<div id="short-nav">
			<dl>
			<dd><code>import "{{.ImportPath}}"</code></dd>
			</dl>
			<dl>
			<dd><a href="#pkg-overview" class="overviewLink">Overview</a></dd>
			<dd><a href="#pkg-index" class="indexLink">Index</a></dd>
			{{if $pkg.Examples}}
				<dd><a href="#pkg-examples" class="examplesLink">Examples</a></dd>
			{{end}}
			{{if $pkg.Dirs}}
				<dd><a href="#pkg-subdirectories">Subdirectories</a></dd>
			{{end}}
			</dl>
		</div>
		<!-- The package's Name is printed as title by the top-level template -->
		<div id="pkg-overview" class="toggleVisible">
			<div class="collapsed">
				<h2 class="toggleButton" title="Click to show Overview section">Overview ▹</h2>
			</div>
			<div class="expanded">
				<h2 class="toggleButton" title="Click to hide Overview section">Overview ▾</h2>
				{{$pkg.Comment .Doc}}
				{{range $pkg.FmtExamples ""}}{{template "example" .}}{{end}}
			</div>
		</div>

		<div id="pkg-index" class="toggleVisible">
		<div class="collapsed">
			<h2 class="toggleButton" title="Click to show Index section">Index ▹</h2>
		</div>
		<div class="expanded">
			<h2 class="toggleButton" title="Click to hide Index section">Index ▾</h2>

		<!-- Table of contents for API; must be named manual-nav to turn off auto nav. -->
			<div id="manual-nav">
			<dl>
			{{if .Consts}}
				<dd><a href="#pkg-constants">Constants</a></dd>
			{{end}}
			{{if .Vars}}
				<dd><a href="#pkg-variables">Variables</a></dd>
			{{end}}
			{{range .Funcs}}
				<dd><a href="#{{.Name}}">{{$pkg.NodeTOC .Decl}}</a></dd>
			{{end}}
			{{range .Types}}
				{{$typeName := .Name}}
				<dd><a href="#{{.Name}}">type {{.Name}}</a></dd>
				{{range .Funcs}}
					<dd>&nbsp; &nbsp; <a href="#{{.Name}}">{{$pkg.NodeTOC .Decl}}</a></dd>
				{{end}}
				{{range .Methods}}
					<dd>&nbsp; &nbsp; <a href="#{{$typeName}}.{{.Name}}">{{$pkg.NodeTOC .Decl}}</a></dd>
				{{end}}
			{{end}}
			{{if $pkg.Bugs}}
				<dd><a href="#pkg-note-BUG">Bugs</a></dd>
			{{end}}
			</dl>
			</div><!-- #manual-nav -->

		{{if $pkg.Examples}}
		<div id="pkg-examples">
			<h3>Examples</h3>
			<div class="js-expandAll expandAll collapsed">(Expand All)</div>
			<dl>
			{{range $pkg.Examples}}
			<dd><a class="exampleLink" href="#example_{{.Name}}">{{$pkg.ExampleName .Name}}</a></dd>
			{{end}}
			</dl>
		</div>
		{{end}}

		{{with .Filenames}}
			<h3>Package files</h3>
			<p>
			<span style="font-size:90%">
			{{range .}}
				<a href="/{{.}}">{{basename .}}</a>
			{{end}}
			</span>
			</p>
		{{end}}
		</div><!-- .expanded -->
		</div><!-- #pkg-index -->

		{{with .Consts}}
			<h2 id="pkg-constants">Constants</h2>
			{{range .}}
				{{$pkg.Comment .Doc}}
				<pre>{{$pkg.Node .Decl}}</pre>
			{{end}}
		{{end}}
		{{with .Vars}}
			<h2 id="pkg-variables">Variables</h2>
			{{range .}}
				{{$pkg.Comment .Doc}}
				<pre>{{$pkg.Node .Decl}}</pre>
			{{end}}
		{{end}}
		{{range .Funcs}}
			{{/* Name is a string - no need for FSet */}}
			<h2 id="{{.Name}}">func <a href="{{$pkg.SrcPosLink .Decl}}">{{.Name}}</a>
				<a class="permalink" href="#{{.Name}}">&#xb6;</a>
				{{$since := $pkg.Since "func" "" .Name}}
				{{if $since}}<span title="Added in Go {{$since}}">{{$since}}</span>{{end}}
			</h2>
			<pre>{{$pkg.Node .Decl}}</pre>
			{{$pkg.Comment .Doc}}
			{{range $pkg.FmtExamples .Name}}{{template "example" .}}{{end}}
		{{end}}
		{{range .Types}}
			{{$typeName := .Name}}
			<h2 id="{{.Name}}">type <a href="{{$pkg.SrcPosLink .Decl}}">{{$typeName}}</a>
				<a class="permalink" href="#{{.Name}}">&#xb6;</a>
				{{$since := $pkg.Since "type" "" .Name}}
				{{if $since}}<span title="Added in Go {{$since}}">{{$since}}</span>{{end}}
			</h2>
			{{$pkg.Comment .Doc}}
			<pre>{{$pkg.Node .Decl}}</pre>

			{{range .Consts}}
				{{$pkg.Comment .Doc}}
				<pre>{{$pkg.Node .Decl}}</pre>
			{{end}}

			{{range .Vars}}
				{{$pkg.Comment .Doc}}
				<pre>{{$pkg.Node .Decl}}</pre>
			{{end}}

			{{range $pkg.FmtExamples .Name}}{{template "example" .}}{{end}}

			{{range .Funcs}}
				<h3 id="{{.Name}}">func <a href="{{$pkg.SrcPosLink .Decl}}">{{.Name}}</a>
					<a class="permalink" href="#{{.Name}}">&#xb6;</a>
					{{$since := $pkg.Since "func" "" .Name}}
					{{if $since}}<span title="Added in Go {{$since}}">{{$since}}</span>{{end}}
				</h3>
				<pre>{{$pkg.Node .Decl}}</pre>
				{{$pkg.Comment .Doc}}
				{{range $pkg.FmtExamples .Name}}{{template "example" .}}{{end}}
			{{end}}

			{{range .Methods}}
				<h3 id="{{$typeName}}.{{.Name}}">func ({{html .Recv}}) <a href="{{$pkg.SrcPosLink .Decl}}">{{.Name}}</a>
					<a class="permalink" href="#{{$typeName}}.{{.Name}}">&#xb6;</a>
					{{$since := $pkg.Since "method" .Recv .Name}}
					{{if $since}}<span title="Added in Go {{$since}}">{{$since}}</span>{{end}}
				</h3>
				<pre>{{$pkg.Node .Decl}}</pre>
				{{$pkg.Comment .Doc}}
				{{range $pkg.FmtExamples (printf "%s_%s" $typeName .Name)}}{{template "example" .}}{{end}}
			{{end}}
		{{end}}
	{{end}}

	{{with $pkg.Bugs}}
		<h2 id="pkg-note-BUG">Bugs</h2>
		<ul style="list-style: none; padding: 0;">
		{{range .}}
		<li><a href="{{$pkg.SrcPosLink .}}" style="float: left;">&#x261e;</a> {{$pkg.Comment .Body}}</li>
		{{end}}
		</ul>
	{{end}}
{{end}}

{{with $pkg.Dirs}}
	{{/* DirList entries are numbers and strings - no need for FSet */}}
	{{if $pkg.PDoc}}
		<h2 id="pkg-subdirectories">Subdirectories</h2>
	{{end}}
	<div class="pkg-dir">
		<table>
			<tr>
				<th class="pkg-name">Name</th>
				<th class="pkg-synopsis">Synopsis</th>
			</tr>

			{{if not (or (eq $pkg.Dirname "/src/cmd") $pkg.DirFlat)}}
			<tr>
				<td colspan="2"><a href="..">..</a></td>
			</tr>
			{{end}}

			{{range .}}
				<tr>
				{{if $pkg.DirFlat}}
					{{if .HasPkg}}
						<td class="pkg-name">
							<a href="{{.Path}}/{{$pkg.ModeQuery}}">{{.Path}}</a>
						</td>
					{{end}}
				{{else}}
					<td class="pkg-name" style="padding-left: {{mul .Depth 20}}px;">
						<a href="{{.Path}}/{{$pkg.ModeQuery}}">{{.Name}}</a>
					</td>
				{{end}}
					<td class="pkg-synopsis">
						{{.Synopsis}}
					</td>
				</tr>
			{{end}}
		</table>
	</div>
{{end}}

{{define "example"}}
<div id="example_{{.Name}}" class="toggle">
  <div class="collapsed">
    <p class="exampleHeading toggleButton">▹ <span class="text">Example{{.Page.ExampleSuffix .Name}}</span></p>
  </div>
  <div class="expanded">
    <p class="exampleHeading toggleButton">▾ <span class="text">Example{{.Page.ExampleSuffix .Name}}</span></p>
    {{with .Doc}}<p>{{.}}</p>{{end}}
    {{$output := .Output}}
    {{with .Play}}
      <div class="play">
        <div class="input"><textarea class="code" spellcheck="false">{{.}}</textarea></div>
        <div class="output"><pre>{{html $output}}</pre></div>
        <div class="buttons">
          <button class="Button Button--primary run" title="Run this code [shift-enter]">Run</button>
          <button class="Button fmt" title="Format this code">Format</button>
          {{if not $.Page.Web.GoogleCN}}
            <button class="Button share" title="Share this code">Share</button>
          {{end}}
        </div>
      </div>
    {{else}}
      <p>Code:</p>
      <pre class="code">{{.Code}}</pre>
      {{with .Output}}
        <p>Output:</p>
        <pre class="output">{{.}}</pre>
      {{end}}
    {{end}}
  </div>
</div>
{{end}}
