var keys;

function createOSAccidentSummaryMap(dblLatitude, dblLongitude, enumType, zoomLevel) {
// creates a map with a single event marker, map type controls and full zoom controls

	var northingEasting = LatLongToNorthEast(dblLatitude, dblLongitude);
	
	osMap = new OpenSpace.Map('OSmap');
	osMap.setCenter(new OpenSpace.MapPoint(northingEasting.E, northingEasting.N), zoomLevel);
	
	var size = new OpenLayers.Size(26, 37);
	var offset = new OpenLayers.Pixel(-11, -37);
	if (enumType == 'accident') {
	// if accident, specify accident icon
		var icon = new OpenSpace.Icon('./siteimages/OSMapMarkerAccident.png', size, offset);
	} else if (enumType == 'robbery') {
		var icon = new OpenSpace.Icon('./siteimages/OSMapMarkerRobbery.png', size, offset);
	}
	var pos = new OpenSpace.MapPoint(northingEasting.E, northingEasting.N);
	marker = osMap.createMarker(pos, icon);
	pos = new OpenSpace.MapPoint(northingEasting.E, northingEasting.N);
	marker = osMap.createMarker(pos, icon.clone());
	
	// prevent arrow keys from panning map unless cursor is within map div
	for( var c in osMap.controls )
	if( osMap.controls[c].CLASS_NAME == "OpenLayers.Control.KeyboardDefaults" )
	keys = osMap.controls[c];
	osMap.events.register( 'mouseover', this, function(){ keys.activate(); } );
	osMap.events.register( 'mouseout', this, function(){ keys.deactivate(); } );
        
}

function setMap() {
// set map div visibility based on cookie value

	var	googlemap = document.getElementById("googlemap");
	var	OSmap = document.getElementById("OSmap");
	
	switch(getCookie("myMaps")) {
		case "GMap":
		case "GSat":
		case "GHyb":
			OSmap.style.display="none";
			googlemap.style.display="block";
			document.getElementById("maplink").innerHTML= "Switch to OS Map";
			break;
		default:
			OSmap.style.display="block";
			googlemap.style.display="none";
			document.getElementById("maplink").innerHTML= "Switch to Google Map";	
	}

}

function toggleMap() {
// toggle map div visibility

	var	googlemap = document.getElementById("googlemap");
	var	OSmap = document.getElementById("OSmap");
	
	if (OSmap.style.display!="block") {
	//	currently hidden, show
		OSmap.style.display="block";
		googlemap.style.display="none";
		document.getElementById("maplink").innerHTML= "Switch to Google Map";
	} else {
		OSmap.style.display="none";
		googlemap.style.display="block";
		document.getElementById("maplink").innerHTML= "Switch to OS Map";
		resize();
	}

}

function resize() {
// resize google map to prevent blank maps when div goes from none to block
	map.checkResize();
}

function LatLongToNorthEast(lat, lon) {
// convert latitude, longitude to northing, easting
  var lat = lat.toRad(), lon = lon.toRad();
  
  var a = 6377563.396, b = 6356256.910;          // Airy 1830 major & minor semi-axes
  var F0 = 0.9996012717;                         // NatGrid scale factor on central meridian
  var lat0 = (49).toRad(), lon0 = (-2).toRad();  // NatGrid true origin
  var N0 = -100000, E0 = 400000;                 // northing & easting of true origin, metres
  var e2 = 1 - (b*b)/(a*a);                      // eccentricity squared
  var n = (a-b)/(a+b), n2 = n*n, n3 = n*n*n;

  var cosLat = Math.cos(lat), sinLat = Math.sin(lat);
  var nu = a*F0/Math.sqrt(1-e2*sinLat*sinLat);              // transverse radius of curvature
  var rho = a*F0*(1-e2)/Math.pow(1-e2*sinLat*sinLat, 1.5);  // meridional radius of curvature
  var eta2 = nu/rho-1;

  var Ma = (1 + n + (5/4)*n2 + (5/4)*n3) * (lat-lat0);
  var Mb = (3*n + 3*n*n + (21/8)*n3) * Math.sin(lat-lat0) * Math.cos(lat+lat0);
  var Mc = ((15/8)*n2 + (15/8)*n3) * Math.sin(2*(lat-lat0)) * Math.cos(2*(lat+lat0));
  var Md = (35/24)*n3 * Math.sin(3*(lat-lat0)) * Math.cos(3*(lat+lat0));
  var M = b * F0 * (Ma - Mb + Mc - Md);              // meridional arc

  var cos3lat = cosLat*cosLat*cosLat;
  var cos5lat = cos3lat*cosLat*cosLat;
  var tan2lat = Math.tan(lat)*Math.tan(lat);
  var tan4lat = tan2lat*tan2lat;

  var I = M + N0;
  var II = (nu/2)*sinLat*cosLat;
  var III = (nu/24)*sinLat*cos3lat*(5-tan2lat+9*eta2);
  var IIIA = (nu/720)*sinLat*cos5lat*(61-58*tan2lat+tan4lat);
  var IV = nu*cosLat;
  var V = (nu/6)*cos3lat*(nu/rho-tan2lat);
  var VI = (nu/120) * cos5lat * (5 - 18*tan2lat + tan4lat + 14*eta2 - 58*tan2lat*eta2);

  var dLon = lon-lon0;
  var dLon2 = dLon*dLon, dLon3 = dLon2*dLon, dLon4 = dLon3*dLon, dLon5 = dLon4*dLon, dLon6 = dLon5*dLon;

  var N = I + II*dLon2 + III*dLon4 + IIIA*dLon6;
  var E = E0 + IV*dLon + V*dLon3 + VI*dLon5;

  return {N: N, E: E};
}

/*
 * extend Number object with methods for converting degrees/radians
 */
Number.prototype.toRad = function() {  // convert degrees to radians
  return this * Math.PI / 180;
}
Number.prototype.toDeg = function() {  // convert radians to degrees (signed)
  return this * 180 / Math.PI;
}

/*
 * pad a number with sufficient leading zeros to make it w chars wide
 */
Number.prototype.padLZ = function(w) {
  var n = this.toString();
  for (var i=0; i<w-n.length; i++) n = '0' + n;
  return n;
}


