var EPSG4326 = new OpenLayers.Projection("EPSG:4326");
var EPSG900913 = new OpenLayers.Projection("EPSG:900913");
var b = 20037508.34;

var map;
var features = new Array();
var currentSelectedPoint;
var currentSelectedRowStyle;
var pointSelectControl;
var scrollTable = true;
var single = false;

var pointStyleMap = new OpenLayers.StyleMap({
    "default": new OpenLayers.Style({
		'fill': true, 
		'fillColor': "${fillColor}", 
		'fillOpacity': 0.7, 
	        'label': "${label}", 
	        'labelAlign': "cm",
	        'fontColor': "#333333",
	        'fontOpacity': 0.7,
	        'fontSize': 12,
		'pointRadius': "${pointRadius}", 
		'strokeWidth': 0.1, 
		'strokeColor':  "#ffffff"}),
     "select": new OpenLayers.Style({
     	'strokeColor': "#000000",
        'strokeWidth': 2})}
);

var homeStyleMap = new OpenLayers.StyleMap({
    "default": new OpenLayers.Style({
		'fill': false, 
		'strokeWidth': 5, 
		'strokeOpacity': 0.1,
		'strokeColor':  "#000000"})}
);


pointStyleMap.addUniqueValueRules("default");
pointStyleMap.addUniqueValueRules("select");

var layerMapnik = new OpenLayers.Layer.OSM(null, null, { numZoomLevels: 15 });
var layerHome = new OpenLayers.Layer.Vector("Home", { 'styleMap': homeStyleMap });
var layerPoints = new OpenLayers.Layer.Vector("Points", { 'styleMap': pointStyleMap });

function init()
{
	OpenLayers.ImgPath = "http://js.mapbox.com/theme/dark/";

	map = new OpenLayers.Map("map",
	{
		controls:[
			new OpenLayers.Control.Navigation(),
			new OpenLayers.Control.PanZoomBar(),
		new OpenLayers.Control.MouseDefaults(),
		new OpenLayers.Control.KeyboardDefaults()],
		maxExtent: new OpenLayers.Bounds(-1*b, -1*b, b, b),
		maxResolution: 156543.0399,
		units: 'm',
		projection: EPSG900913,
		displayProjection: EPSG4326
	});

	map.addLayer(layerMapnik);
	map.addLayer(layerHome);
	map.addLayer(layerPoints);

	if (!single)
	{	
	
		layerPoints.events.on({
			"featureselected": function(e) 
			{
				if (currentSelectedPoint != null)
				{
					pointSelectControl.unselect(currentSelectedPoint);
				}
				currentSelectedPoint = e.feature;
				var tr = document.getElementById('event' + currentSelectedPoint.attributes.id);
				currentSelectedRowStyle = tr.className;
				tr.className = "selectedRow";
				var tds = tr.getElementsByTagName('td');
				var selColor = points[3];
				for (var i = 0; i < tds.length; i++)
				{
					tds[i].style.borderColor = currentSelectedPoint.attributes.fillColor;
				}
				if (scrollTable)
				{
					var vRow = document.getElementById('event' + currentSelectedPoint.attributes.id);
					var vTop = vRow.offsetTop;
					document.getElementById('tableDiv').scrollTop = vTop - 50;
				}
			},
			"featureunselected": function(e) 
			{			
				document.getElementById('event' + currentSelectedPoint.attributes.id).className = currentSelectedRowStyle;
				currentSelectedPoint = null;
			}
		});
		
		pointSelectControl = new OpenLayers.Control.SelectFeature([layerPoints], { });
		map.addControl(pointSelectControl);
		pointSelectControl.activate();
	
		var circle1 = new OpenLayers.Feature.Vector(OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(home_lon, home_lat).transform(EPSG4326, EPSG900913), 10000.0/Math.cos(home_lat*(Math.PI/180)), 100, 0));
		var circle2 = new OpenLayers.Feature.Vector(OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(home_lon, home_lat).transform(EPSG4326, EPSG900913), 50000.0/Math.cos(home_lat*(Math.PI/180)), 100, 0));
		var circle3 = new OpenLayers.Feature.Vector(OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(home_lon, home_lat).transform(EPSG4326, EPSG900913), 100000.0/Math.cos(home_lat*(Math.PI/180)), 100, 0));
		layerHome.addFeatures([circle1, circle2, circle3]);
		
		var start = new OpenLayers.LonLat(home_lon, home_lat);
		map.setCenter(start.transform(EPSG4326, EPSG900913), 8);			
	}
	else
	{
		var start = new OpenLayers.LonLat(features[0].geometry.x, features[0].geometry.y);
		map.setCenter(start, 12);	
	}
	layerMapnik.setOpacity(0.7);
	
}

function addPoints()
{
	for(var i = points.length-1; i >= 0; i--)
	{
		var point = new OpenLayers.Geometry.Point(points[i][2], points[i][1]).transform(EPSG4326, EPSG900913);
		var feature = new OpenLayers.Feature.Vector(point);
		feature.attributes.fillColor = getColour(points[i][3]);
		if (12-points[i][3] > 6)
		{
			feature.attributes.pointRadius = 12-points[i][3];		
		}
		else
		{
			feature.attributes.pointRadius = 6;				
		}
		if (points[i][3] < 6)
		{
			feature.attributes.label = points[i][3] + 1;
		}
		else
		{
			feature.attributes.label = "";
		}
		feature.attributes.id = points[i][0];
		feature.zOrder = 1000-points[i][3];
		features.push(feature);
	}
	layerPoints.addFeatures(features);
}

function getColour(weeks_ahead)
{
	if (weeks_ahead < 1) { return "#ff0000"; }
	if (weeks_ahead < 2) { return "#ff8800"; }
	if (weeks_ahead < 3) { return "#ffff00"; }
	if (weeks_ahead < 4) { return "#00ff00"; }
	if (weeks_ahead < 5) { return "#0088ff"; }
	if (weeks_ahead < 6) { return "#8800ff"; }
	return "#666666";
}

function selectPoint(id)
{
	for (var i = 0; i < features.length; i++)
	{
		if (features[i].attributes.id == id)
		{
			scrollTable = false;
			pointSelectControl.select(features[i]);
			scrollTable = true;
			var lonlat = new OpenLayers.LonLat(features[i].geometry.x, features[i].geometry.y);
			map.moveTo(lonlat);
			break;
		}
	}
}

function submitReturn()
{
	document.forms.pcForm.p.value = document.getElementById('p_user').value.replace(' ', '').toUpperCase();
	document.forms.pcForm.d.value = document.getElementById('d_user').value;
	document.forms.pcForm.c.value = document.getElementById('c_user').value;
	document.forms.pcForm.action = '';
}

function submitGo()
{
	document.forms.pcForm.p.value = document.getElementById('pc_disp').innerHTML;
	document.forms.pcForm.d.value = document.getElementById('d_user').checked ? "on" :"off";
	document.forms.pcForm.c.value = document.getElementById('c_user').value;
	document.forms.pcForm.submit();
}
