@*******************************************************************************
 * 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.											   *
 *******************************************************************************@ 

@(serviceLogs: List[metadata.ServiceLog], serviceLogForm: play.data.Form[metadata.ServiceLog])

@import helper._

<link rel="stylesheet"
	href='@routes.Assets.at("stylesheets/livefitler.css")'>
	
@scripts = {
	<script src='@routes.Assets.at("javascripts/edit_button.js")'></script>
	<script src='@routes.Assets.at("javascripts/livefilter.js")'></script>
}

@main("Service Execution Logs", scripts){
	
	@flash_message()   
	 
    <h1>@serviceLogs.size() Service Logs Found</h1>
    <!-- 
    @helper.form(routes.AccountController.syncData()) {
    	<div class = "col-sm-2">
    		<input class="btn btn-primary" type="submit" value="Sync data" style="margin-top:18px">
    	</div>
    }
     -->
    @helper.form(routes.AccountController.getSearchServiceLog()) {
    <div class = "container">
    	<div class = "col-sm-offset-2 col-sm-1">
    		<!-- @inputText(serviceLogForm("User Id"),  'class -> "form-control", 'id -> "userId", '_label -> Messages("User Id"), 'placeholder -> "123") -->
    	</div>
    	<div class = "col-sm-4" >
    		@inputText(serviceLogForm("Start Time"), 'class -> "form-control", 'id -> "startTime", 'type -> "datetime-local", '_label -> Messages("Execution Start Time"))
    	</div>
    	<div class = "col-sm-4">
	    	@inputText(serviceLogForm("End Time"),  'class -> "form-control", 'id -> "endTime", 'type -> "datetime-local", '_label -> Messages("Execution End Time"))
    	</div>
    	<input class="btn btn-success" type="submit" value="Search" style="margin-top:23px">
    </div>
    }

    <table class="table table-striped table-bordered table-condensed tablesorter" id ="myTable2">
    <thead>
	<tr>
		<th style = "vertical-align: top;" class="col-sm-4">Service Name</td>
 		<th style = "vertical-align: top;" class="col-sm-2">User Name</td> 
		<th style = "vertical-align: top;" class="col-sm-2">Purpose</td>
		<th style = "vertical-align: top;" class="col-sm-2">Execution Start Time</td>
		<th style = "vertical-align: top;" class="col-sm-2">Execution End Time</td>		
		<th style = "vertical-align: top;" class="col-sm-1">DataSet Start Time</td>
		<th style = "vertical-align: top;" class="col-sm-1">DataSet End Time</td>
		<th style = "vertical-align: top;" class="col-sm-1">Details</td>
		<!-- 
		<td class="col-md-2">Operation</td>
		 -->
	</tr>
	</thead>
	@for(serviceLog <- serviceLogs) {
	<tr>
	<td><font size="2">@serviceLog.getServiceName</font></td>
 	<td><font size="2">@serviceLog.getUserId</font></td>
	<td><font size="2">@serviceLog.getPurpose</font></td>
	<td><font size="2">@serviceLog.getExecutionStartTime</font></td>
	<td><font size="2">@serviceLog.getExecutionEndTime</font></td>
	<td><font size="2">@serviceLog.getDataSetStartTime</font></td>
	<td><font size="2">@serviceLog.getDataSetEndTime</font></td>
	<td>
	@form(routes.ClimateServiceController.getConfigurationByConfId()){
		<input
			name="logId" class="hidden" type="hidden"
			value="@serviceLog.getServiceExecutionLogId">
		<input
			type="submit"  value="see details">
	}
	</td>
	<!--  
	<td>
	@form(routes.ClimateServiceController.deleteServiceLog()){ 
		<input
			name="idHolder" class="hidden" type="hidden"
			value="@serviceLog.getServiceExecutionLogId">
		<input
			type="submit" class="btn btn-primary delete-btn span2" value="Delete"
			onclick="return confirm('Are you sure you want to delete this log?')">
		}
	</td>
	-->
	</tr>
	}
    </table>

	}