<!--
  ~ 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.
  -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="viewport" content="width=device-width"/>
		<style>
			body {
				width:100% !important;
				min-width: 100%;
				-webkit-text-size-adjust:100%;
				-ms-text-size-adjust:100%;
				margin:0;
				padding:0;
			}

			table {
				border-spacing: 0;
				border-collapse: collapse;
			}

			table th,
			table td {
				padding: 3px 0 3px 0;
			}

			.body {
				width: 100%;
			}

			p,a,h1,h2,h3,ul,ol,li {
				font-family: Helvetica, Arial, sans-serif;
				font-weight: normal;
				margin: 0;
				padding: 0;
			}
			p {
				font-size: 14px;
				line-height: 19px;
			}
			a {
				color: #3294b1;
			}
			h1 {
				font-size: 36px;
				margin: 15px 0 5px 0;
			}
			h2 {
				font-size: 32px;
			}
			h3 {
				font-size: 28px;
			}

			ul,ol {
				margin: 0 0 0 25px;
				padding: 0;
			}

			.btn {
				background: #2ba6cb !important;
				border: 1px solid #2284a1;
				padding: 10px 20px 10px 20px;
				text-align: center;
			}
			.btn:hover {
				background: #2795b6 !important;
			}
			.btn a {
				color: #FFFFFF;
				text-decoration: none;
				font-weight: bold;
				padding: 10px 20px 10px 20px;
			}

			.tableBordered {
				border-top: 1px solid #b9e5ff;
			}
			.tableBordered th {
				background: #ECF8FF;
			}
			.tableBordered th p {
				font-weight: bold;
				color: #3294b1;
			}
			.tableBordered th,
			.tableBordered td {
				color: #333333;
				border-bottom: 1px solid #b9e5ff;
				text-align: center;
				padding-bottom: 5px;
			}

			.panel {
				height: 100px;
			}
		</style>
	</head>
	<body>
		#set ( $elem = $alertList[0] )
		#set ( $alertUrl = $elem["alertDetailUrl"] )
		#set ( $policyUrl = $elem["policyDetailUrl"] )
		<table class="body">
			<tr>
				<td align="center" valign="top" style="background: #999999; padding: 0 0 0 0;">
					<!-- Eagle Header -->
					<table width="580">
						<tr>
							<td style="padding: 0 0 0 0;" align="left" >
								<p style="color:#FFFFFF;font-weight: bold; font-size: 24px">Eagle</p>
							</td>
							<td style="padding: 0 0 0 0;" align="right">
								<p style="color:#FFFFFF;font-weight: bold;">DAM Alert</p>
							</td>
						</tr>
					</table>
				</td>
			</tr>

			<tr>
				<td align="center" valign="top">
					<!-- Eagle Body -->
					<table width="580">
						<tr>
							<!-- Title -->
							<td align="center">
								<h1>Malicious Data Operation Detected</h1>
							</td>
						</tr>
						<tr>
							<!-- Time -->
							<td>
								<table width="580">
									<tr>
										<td>
											<p><b>Detected Time: $elem["alertTimestamp"]</b></p>
										</td>
										#set ( $severity = $elem["severity"] )
										#if (!$severity || ("$severity" == ""))
											#set ( $elem["severity"] = "WARNING")
										#end
										<td align="right">
											<p><b>
												Severity:
									            #if ($elem["severity"] == "WARNING")
													<span>$elem["severity"]</span>												
    											#else
													<span style="color: #FF0000;">$elem["severity"]</span>
    											#end
											</b></p>
										</td>
									</tr>
								</table>
							</td>
						</tr>
						<tr>
							<!-- Description -->
							<td valign="top" style="background: #ECF8FF; border: 1px solid #b9e5ff; padding: 10px 10px 12px 10px;">
								<p>$elem["alertMessage"]</p>
							</td>
						</tr>
						<tr>
							<!-- View Detail -->
							<td align="center" style="padding: 10px 0 0 0;">
								<table width="580">
									<tr>
										<td class="btn">
											<a href="$alertUrl">View Alert Details on Eagle Web</a>
										</td>
									</tr>
								</table>
							</td>
						</tr>
						<tr>
							<!-- Basic Information -->
							<td style="padding: 20px 0 0 0;">
								<p><b>Basic Information:</b></p>
							</td>
						</tr>
						<tr>
							<!-- Basic Information Content -->
							<td>
								<table class="tableBordered" width="580">
									<tr>
										<th>
											<p>Site</p>
										</th>
										<th>
											<p>Data Source</p>
										</th>
									</tr>
									<tr>
										<td>
											<p>$elem["site"]</p>
										</td>
										<td>
											<p>$elem["dataSource"]</p>
										</td>
									</tr>
									<tr>
										<th>
											<p>Alert Type</p>
										</th>
										<th>
											<p>Policy Name</p>
										</th>
										<th>
											<p>Severity</p>
										</th>
									</tr>
									<tr>
										<td>
											<p>DAM Alert</p>
										</td>									
										<td>
											<p>$elem["policyId"]</p>
										</td>
										<td>
											<p>$elem["severity"]</p>
										</td>
									</tr>
								</table>
							</td>
						</tr>
						<tr>
							<!-- View Detail -->
							<td align="center" style="padding: 10px 0 0 0;">
								<table width="580">
									<tr>
										<td class="btn">
											<a href="$policyUrl">View Policy Details on Eagle Web</a>
										</td>
									</tr>
								</table>
							</td>
						</tr>						
						<tr>
							<!-- Actions Required -->
							<td style="padding: 20px 0 0 0;">
								<p><b>Actions Required:</b></p>
							</td>
						</tr>
						<tr>
							<!-- Possible Root Causes Content -->
							<td class="panel" valign="top" style="background: #F4F4F4; border: 1px solid #AAAAAA; padding: 10px 10px 12px 10px;">
								<p> Malicious data operation found, please check.</p>
							</td>
						</tr>
						<tr>
							<!-- Copyright -->
							<td align="center">
								<p><a href="http://123.xyz.com/alerts/alertlist.html">Copyright 2014 @ Hadoop Eagle</a></p>
							</td>
						</tr>
					</table>
				</td>
			</tr>
		</table>
	</body>
</html>