<!-- 
  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 drawDetails = ${__drawDetails__};
var scrData = ${__data__};
// i18n
var i18n = {
	'Bundle'                 : '${scr.prop.bundle}',
	'Default State'          : '${scr.prop.defstate}',
	'Activation'             : '${scr.prop.activation}',
	'Service Type'           : '${scr.serv.type}',
	'Services'               : '${scr.serv}',
	'Properties'             : '${scr.prop.properties}',
	'Implementation Class'   : '${scr.prop.class}',
	'Component Factory Name' : '${scr.prop.componentfactory}',
	'Configuration Policy'   : '${scr.prop.configurationpolicy}',
	stat_no_service          : "${scr.status.no_service}",
	stat_no_components       : "${scr.status.no_components}",
	stat_ok                  : "${scr.status.ok}"
}
// ]]>
</script>
<p class="statline">&nbsp;</p>


<div id="scr"> <!-- data available -->
	<!-- top header -->
	<form method='post' enctype='multipart/form-data' action="${pluginRoot}">
		<div class="ui-widget-header ui-corner-top buttonGroup">
			<button class='reloadButton' type='button' name='reload'>${reload}</button>
		</div>
	</form>
	
	<table id="plugin_table" class="tablesorter nicetable noauto">
	<thead>
		<tr>
			<th class="col_Id">${id}</th>
			<th class="col_Name">${scr.title.name}</th>
			<th class="col_Status">${scr.title.status}</th>
			<th class="col_Actions">${scr.title.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="${scr.details.tip}">&nbsp;</div>
			</td> 
			<td>&nbsp;</td> <!-- status -->
			<td>
				<ul class="icons">
					<li class="dynhover ui-helper-hidden" title="${scr.action.enable}"><span class="ui-icon ui-icon-play">&nbsp;</span></li>
					<li class="dynhover ui-helper-hidden" title="${scr.action.disable}"><span class="ui-icon ui-icon-stop">&nbsp;</span></li>
					<li class="dynhover ui-helper-hidden" title="${scr.action.configure}"><span class="ui-icon ui-icon-wrench">&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='reloadButton' type='button' name='reload'>${reload}</button>
	</div>
</form>
