<!-- 
  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.
-->
<script type="text/javascript" src="${pluginRoot}/res/plugin.js"></script>
<script type="text/javascript">
// <![CDATA[
var ssData = ${__data__};
var i18n = {
    status: "${subsystems.status}"
};
// ]]>
</script>
<p class="statline">&nbsp;</p>


<div id="subsystems"> <!-- data available -->
	<!-- top header -->
	<form method='post' enctype='multipart/form-data' action="${pluginRoot}">
        <div class="ui-widget-header ui-corner-top buttonGroup">
            <button class='installButton' type='button'>${install}</button>
		</div>
	</form>
	
	<table id="plugin_table" class="tablesorter nicetable noauto">
	<thead>
		<tr>
			<th class="col_Id">${id}</th>
                        <th class="col_Name">${subsystems.name}</th>
			<th class="col_Version">${version}</th>
			<th class="col_Status">Status</th>
			<th class="col_Actions">Actions</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>&nbsp;</td> <!-- id -->
			<td> <!-- name with arrow -->
				<div class="bIcon ui-icon ui-icon-triangle-1-e" style="float:left" title="Details">&nbsp;</div>
			</td> 
            <td>&nbsp;</td> <!-- version -->
			<td>&nbsp;</td> <!-- status -->
			<td>
				<ul class="icons">
					<li class="dynhover ui-helper-hidden" title="${start}"><span class="ui-icon ui-icon-play">&nbsp;</span></li>
					<li class="dynhover ui-helper-hidden" title="${stop}"><span class="ui-icon ui-icon-stop">&nbsp;</span></li>
                    <li class="dynhover" title="${bundles.uninstall}"><span class="ui-icon ui-icon-trash">&nbsp;</span></li>
				</ul>
			</td>
		</tr>
	</tbody>
	</table>
</div> <!-- end data available -->

<!-- bottom header -->
<form method='post' enctype='multipart/form-data' action="${pluginRoot}">
    <div class="ui-widget-header ui-corner-bottom buttonGroup">
        <button class='installButton' type='button'>${install}</button>
	</div>
</form>

<!-- status line -->
<p class="statline">&nbsp;</p>

<div id="uploadDialog" class="ui-helper-hidden" title="Upload / Install Subsystem">
    <form method="post" enctype="multipart/form-data" action="${pluginRoot}">
    <table class="nicetable">
        <tr>
            <td style="text-align:right">Start Subsystem</td>
            <td>
                <input type="hidden" name="action" value="install"/>
                <input type="checkbox" name="subsystemstart" value="start"/>
            </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td><input class="multi" accept="jar|zip|esa" type="file" name="subsystemfile" /></td>
        </tr>
    </table>
    </form>
</div>
