<html>
<head>
	<style rel="stylesheet" type="text/css">
	#popupAlert  {
		z-index : 100;
		display : none;
		position : absolute;
		border : 1px solid #000;
		background-color : #89ffa7;
		color : #000;
		opacity : 0.6;
		padding : 5px;
	}

	#alertInfo  {
		display : none;
		border  : 1px solid #888;
		padding : 3px;
		height  : 150px;
	}

	#alertInfoTable  {
		font : Fixed;
		font-size : 12px;
		width : 100%;
	}

	a  {
		color : #22dd22;
	}
	</style>

	<script type="text/javascript" src="js/raphael.js"></script>
	<script type="text/javascript" src="js/dracula_graffle.js"></script>
	<script type="text/javascript" src="js/dracula_graph.js"></script>
	<script type="text/javascript">
<!--

redraw = null;
width = 0;
height = 0;
layouter = null;
renderer = null;
json = [];

window.onload = function()  {
	var req = new XMLHttpRequest();

	if ( navigator.appName.indexOf('Microsoft') != -1 )
	{
		width  = (document.body.offsetWidth > 20) ?
			document.body.offsetWidth - 20 : 20;
		height = (document.body.offsetHeight > 200 ) ?
			document.body.offsetHeight - 200 : 200;
	} else {
		width  = (window.innerWidth > 20) ?
			window.innerWidth - 20 : 20;
		height = (window.innerHeight > 200) ?
			window.innerHeight - 200 : 200;
	}

	req.open ( 'GET', 'http://' + window.location.host + '/correlation_graph.json', true );
	req.onreadystatechange = function()  {
		if ( req.readyState == 4 && req.status == 200 )
		{
			var g = new Graph();
			var connections = [];
			json = JSON.parse ( req.responseText );

			for ( var i=0; i < json.length; i++ )
			{
				g.addNode ( json[i].id, { label: json[i].label });

				if ( json[i].connectedTo )
				{
					for ( var j=0; j < json[i].connectedTo.length; j++ )
					{
						connections.push ({
							"from": json[i].id,
							"to"  : json[i].connectedTo[j].id
						});
					}
				}
			}

			for ( var i=0; i < connections.length; i++ )
			{
				g.addEdge ( connections[i].from, connections[i].to, { directed: true });
			}

			var canvas = document.getElementById ( 'canvas' );
			canvas.style.width = width;
			canvas.style.height = height;

			var layouter = new Graph.Layout.Spring ( g );
			layouter.layout();

			var renderer = new Graph.Renderer.Raphael ( 'canvas', g, width, height );
			renderer.draw();

			redraw = function() {
				layouter.layout();
				renderer.draw();
			};

			for ( var i=0; i < json.length; i++ )
			{
				var node = document.getElementById ( 'alert' + json[i].id );

				if ( node )
				{
					node.onclick = function()  {
						var div = document.getElementById ( 'alertInfo' );

						if ( div )
						{
							var id = this.id.replace ( /^alert/, "" );
							var json_element = null;

							for ( var i=0; i < json.length; i++ )
							{
								if ( json[i].id == id )
								{
									json_element = json[i];
									break;
								}
							}

							div.style.display = 'block';
							var content =
								'<table id="alertInfoTable" cellspacing="5"><tr style="background-color:#99ff99">' +
								'<td><b>Type</b></td><td><b>From</b></td>' +
								'<td><b>To</b></td><td><b>Date</b></td></tr>' +
								'<tr><td>' + json_element.label;

							if ( json_element.packets )
							{
								content += ' (<a href="http://' + window.location.host + '/pcap.cgi?packets=' +
									json_element.packets.length;

								for ( var j=0; j < json_element.packets.length; j++ )
								{
									json_element.packets[j].match ( /^.*(=*)$/ );
									var pad = RegExp.$1;
									var len = parseInt ( json_element.packets[j].length * 3 / 4 ) - pad.length;
									json_element.date.match ( /[a-zA-Z]+\s+([a-zA-Z]+)\s+([0-9]+)\s+([0-9]+):([0-9]+):([0-9]+)\s+([0-9]+)/ );
									var month = RegExp.$1;
									var day   = RegExp.$2;
									var hour  = RegExp.$3;
									var min   = RegExp.$4;
									var sec   = RegExp.$5;
									var year  = RegExp.$6;

									switch ( month )
									{
										case 'Jan': month =  1; break;
										case 'Feb': month =  2; break;
										case 'Mar': month =  3; break;
										case 'Apr': month =  4; break;
										case 'May': month =  5; break;
										case 'Jun': month =  6; break;
										case 'Jul': month =  7; break;
										case 'Ago': month =  8; break;
										case 'Sep': month =  9; break;
										case 'Oct': month = 10; break;
										case 'Nov': month = 11; break;
										case 'Dec': month = 12; break;
										default   : month =  1; break;
									}

									var timestamp = new Date ( year, month, day, hour, min, sec).getTime().toString();
									timestamp = timestamp.replace ( /0{3}$/, "" );

									content += '&packet_len' + j + '=' + len +
									'&time' + j + '=' + timestamp +
									'&packet' + j + '=' + escape ( json_element.packets[j] );
								}
									
								content += '">save as pcap file</a>)';
							}
							
							content += '</td><td>' +
								json_element.from + '</td><td>' + json_element.to + '</td>' +
								'<td>' + json_element.date + '</td></tr>';

							if ( json_element.clusteredAlerts )
							{
								for ( var j=0; j < json_element.clusteredAlerts.length; j++ )
								{
									content +=
										'<tr><td>' + json_element.clusteredAlerts[j].label;

									if ( json_element.clusteredAlerts[j].packets )
									{
										content += ' (<a href="http://' + window.location.host + '/pcap.cgi?packets=' +
												json_element.clusteredAlerts[j].packets.length;
												
										for ( var k=0; k < json_element.clusteredAlerts[j].packets.length; k++ )
										{
											var unescaped = unescape ( json_element.clusteredAlerts[j].packets[k] );
											unescaped.match ( /(=+)/ );
											var pad = RegExp.$1;
											var len = parseInt ( json_element.clusteredAlerts[j].packets[k].length * 3 / 4 ) - pad.length;
											json_element.clusteredAlerts[j].date.match ( /[a-zA-Z]+\s+([a-zA-Z]+)\s+([0-9]+)\s+([0-9]+):([0-9]+):([0-9]+)\s+([0-9]+)/ );
											var month = RegExp.$1;
											var day   = RegExp.$2;
											var hour  = RegExp.$3;
											var min   = RegExp.$4;
											var sec   = RegExp.$5;
											var year  = RegExp.$6;

											switch ( month )
											{
												case 'Jan': month =  1; break;
												case 'Feb': month =  2; break;
												case 'Mar': month =  3; break;
												case 'Apr': month =  4; break;
												case 'May': month =  5; break;
												case 'Jun': month =  6; break;
												case 'Jul': month =  7; break;
												case 'Ago': month =  8; break;
												case 'Sep': month =  9; break;
												case 'Oct': month = 10; break;
												case 'Nov': month = 11; break;
												case 'Dec': month = 12; break;
												default   : month =  1; break;
											}

											var timestamp = new Date ( year, month, day, hour, min, sec).getTime().toString();
											timestamp = timestamp.replace ( /0{3}$/, "" );

											content += '&packet_len' + k + '=' + len +
												'&time' + k + '=' + timestamp +
												'&packet' + k + '=' + escape ( json_element.clusteredAlerts[j].packets[k] );
										}

										content += '">save as pcap file</a>)';
									}
									
									content += '</td>' +
										'<td>' + json_element.clusteredAlerts[j].from + '</td>' +
										'<td>' + json_element.clusteredAlerts[j].to + '</td>' +
										'<td>' + json_element.clusteredAlerts[j].date + '</td></tr>';
								}
							}

							content += '</table>';
							div.innerHTML = content;
						}
					};
				}
			}
		}
	};

	req.send ( null );
};

-->
    </script>
</head>
<body>
<div id="canvas" style="border: 1px solid #000"></div>
<button id="redraw" onclick="redraw();">Redraw</button>
<div id="popupAlert"></div>
<div id="alertInfo"></div>

</body>
</html>