<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You 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.
-->
<div>
     <h4 (click)="toggleBoolean('showGeneralProxyInformation')"><span [class]="'clickable inline-glyph glyhpicon glyphicon-' + (this['showGeneralProxyInformation'] ? 'minus' : 'plus')"></span>&nbsp;General Proxy Information</h4>
</div>
<div class="table-responsive" *ngIf="this['showGeneralProxyInformation']">
    <table class="table table-striped table-hover">
       <colgroup>
            <col width="30%">
            <col width="70%">
        </colgroup>
        <tbody>
            <tr *ngIf="this['showKnoxVersion']">
                <td>Knox Version</td>
                <td>{{ getVersion() }}</td>
            </tr>
            <tr *ngIf="this['showPublicCerts']">
                <td>TLS Public Certificate</td>
                <td>
                    <a href="{{ getMetadataAPIUrl('publicCert?type=pem') }}">PEM</a>
                    &nbsp;&nbsp;|&nbsp;&nbsp;
                    <a href="{{ getMetadataAPIUrl('publicCert?type=jks') }}">JKS</a>
                </td>
            </tr>
            <tr *ngIf="this['showAdminUI']">
                <td>Admin UI URL</td>
                <td><a href="{{ getAdminUiUrl() }}" target="_blank">{{ getAdminUiUrl() }}</a></td>
            </tr>
            <tr *ngIf="this['showAdminAPI']">
                <td>
                    Admin API Details
                    <span class="inline-glyph glyphicon glyphicon-info-sign btn btn-xs"
                    title="{{ getAdminApiDescription() }}" data-toggle="tooltip"></span>
                </td>
                <td>
                    <a href="{{ getAdminApiBookUrl() }}" target="_blank">{{ getAdminApiBookUrl() }}</a>
                </td>
            </tr>
            <tr *ngIf="this['showMetadataAPI']">
                <td>
                    Metadata API
                </td>
                <td>
                    <a href="{{ getMetadataAPIUrl('info') }}" target="_blank">General Proxy Information</a>
                    &nbsp;&nbsp;|&nbsp;&nbsp;
                    <a href="{{ getMetadataAPIUrl('topologies') }}" target="_blank">Topologies</a>
                </td>
            </tr>
            <tr *ngIf="this['showTokens']">
                <td>
                    Integration Tokens
                </td>
                <td>
                    <a href="{{ getTokenGenerationUrl() }}" target="_blank">Token Generation</a>
                </td>
            </tr>
         </tbody>
    </table>
</div>