jQuery(window).unload( function () { GUnload(); } );

jQuery(document).ready(function()
{
	initialize();
	
	// click event to show hide icons
	jQuery('ul#gmapIcons li a').click(function()
	{
		var s = jQuery(this).attr("rel");
		show(s);
		jQuery('ul#gmapIcons li').each(function(){
			if (jQuery(this).hasClass("here")){
				jQuery(this).removeClass("here");
			}
		})
		jQuery(this).parent().addClass("here");
		
		return false;
	});
});

var map;
var MarkersArray = [];
var MarkersArraySmall = [];
var hoverObjs = [];
// declare marker lcoations
var mapPinIncidentSmall = "imgMapIncidentSmall.png";
var mapPinInvestmentSmall = "imgMapInvestmentSmall.png";
var mapPinInteruptionSmall = "imgMapInteruptionSmall.png";
var mapPinPlannedWorkSmall = "imgMapPlannedWorkSmall.png";
var mapPinLeisureActivitySmall = "imgMapLeisureActivitySmall.png";
var mapPinEventSmall = "imgMapEventSmall.png";
var mapPinTownSmall = "imgMapTown.png";

var mapPinIncident = "imgMapIncident.png";
var mapPinInvestment = "imgMapInvestment.png";
var mapPinInteruption = "imgMapInteruption.png";
var mapPinPlannedWork = "imgMapPlannedWork.png";
var mapPinLeisureActivity = "imgMapLeisureActivity.png";
var mapPinEvent = "imgMapEvent.png";
var mapPinTown = "imgMapTown.png";


//array of marker types
var pinTypes = {
	incidents : {
		markers:[],
		icon:getIcon(mapPinIncident)
	},
	investments : {
		markers:[],
		icon:getIcon(mapPinInvestment)
	},
	interuptions : {
		markers:[],
		icon:getIcon(mapPinInteruption)
	},
	planned_works : {
		markers:[],
		icon:getIcon(mapPinPlannedWork)
	},
	leisure_activities : {
		markers:[],
		icon:getIcon(mapPinLeisureActivity)
	},
	events : {
		markers:[],
		icon:getIcon(mapPinEvent)
	},
	town : {
		markers:[],
		icon:getIcon(mapPinTown,'10','10')
	}
};
var pinTypesSmall = {
	incidents : {
		markers:[],
		icon:getIconSmall(mapPinIncidentSmall)
	},
	investments : {
		markers:[],
		icon:getIconSmall(mapPinInvestmentSmall)
	},
	interuptions : {
		markers:[],
		icon:getIconSmall(mapPinInteruptionSmall)
	},
	planned_works : {
		markers:[],
		icon:getIconSmall(mapPinPlannedWorkSmall)
	},
	leisure_activities : {
		markers:[],
		icon:getIconSmall(mapPinLeisureActivitySmall)
	},
	events : {
		markers:[],
		icon:getIconSmall(mapPinEventSmall)
	},
	town : {
		markers:[],
		icon:getIconSmall(mapPinTownSmall,'10','10')
	}
};

function getIconSmall(url,w,h)
{
	
	var icon = new GIcon(G_DEFAULT_ICON);
	var baseURL = assetsBasePath;
	//console.log(mapXML);
	
	icon.image = baseURL + url;
	//if town
	if (w && h){
		icon.iconSize = new GSize(w, h);
		icon.shadow = ""
	}
	else{
		icon.iconSize = new GSize(10, 12);
		icon.shadow = baseURL+"imgIconShadow.png"
	}
	icon.shadowSize = new GSize(18, 16);
	icon.iconAnchor = new GPoint(0, 0);
	return icon;
};

function getIcon(url,w,h)
{
	
	var icon = new GIcon(G_DEFAULT_ICON);
	var baseURL = assetsBasePath;
	//console.log(mapXML);
	
	icon.image = baseURL + url;
	//if town
	if (w && h){
		icon.iconSize = new GSize(w, h);
		icon.shadow = ""
	}
	else{
		icon.iconSize = new GSize(20, 24);
		icon.shadow = baseURL+"imgIconShadow.png"
	}
	icon.shadowSize = new GSize(25, 32);
	icon.iconAnchor = new GPoint(0, 0);
	return icon;
};

// helper function to keep data in memory from xml
function storeData(name){
	return name;
}

function getNodeValue(parent, nodeName)
{
	var node = parent.getElementsByTagName(nodeName);
				
	if(node && node[0] && node[0].firstChild)
	{
		node = node[0].firstChild.nodeValue;
	}
	else
	{
		node = null;
	}
	
	return node;
};

function initialize()
{
	if (GBrowserIsCompatible())
	{
		//initialise map and add controls
		map = new GMap2(document.getElementById("iMap"));
				
		var mapOnClick = GEvent.bind(map, "click", this, function(o,p) {
			if(map.getZoom() == 8) return;
			map.setCenter( p, map.getZoom() + 1 );
			hideShowMarkers();
		});
		//retrieve and display markers
		GDownloadUrl(mapXml, function(data, responseCode)
		{	
			var xml = GXml.parse(data);

			var region = xml.documentElement;
			var lat = parseFloat(region.getAttribute("latitude"));
			var lng = parseFloat(region.getAttribute("longitude"));
			var zoom = parseInt(region.getAttribute("zoomlevel"));

			var markers = xml.documentElement.getElementsByTagName("county");
			
			map.setCenter(new GLatLng(lat, lng), zoom);
			
			function hideShowMarkers()
			{
				if(MarkersArray.length > 0)
				{
					if(map.getZoom() <= 7)
					{
						for (var i = 0; i < MarkersArray.length + 4; i++)
						{
							MarkersArray[i].hide();
							MarkersArraySmall[i].show();
						}
					}
					else
					{
						for (var i = 0; i < MarkersArray.length + 4; i++)
						{
							MarkersArray[i].show();
							MarkersArraySmall[i].hide();
						}
					}
				}
				else
				{
					for (var i = 0; i < MarkersArraySmall.length; i++)
					{
						MarkersArraySmall[i].hide();
					}
					addMarkers(false);
				}
			};
					
			GEvent.addListener(map,'zoomend',function(){
				hideShowMarkers();			
			}); 

			//county ids
			var i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13;
			//alert(getNodeValue(markers[0], "name"))
			for (var i = 0; i < markers.length; i++)
			{
				switch (getNodeValue(markers[i], "name"))
				{
					case "Oxfordshire County":
					i1 = getNodeValue(markers[i], "id");
					break;
					case "Buckinghamshire County":
					i2 = getNodeValue(markers[i], "id");
					break;
					case "Hertfordshire County":
					i3 = getNodeValue(markers[i], "id");
					break;
					case "Northamptonshire County":
					i4 = getNodeValue(markers[i], "id");
					break;
					case "Bedfordshire County":
					i5 = getNodeValue(markers[i], "id");
					break;
					case "Cambridgeshire County":
					i6 = getNodeValue(markers[i], "id");
					break;
					case "Leicestershire County":
					i7 = getNodeValue(markers[i], "id");
					break;
					case "Nottinghamshire County":
					i8 = getNodeValue(markers[i], "id");
					break;
					case "Rutland County":
					i9 = getNodeValue(markers[i], "id");
					break;
					case "Lincolnshire County":
					i10 = getNodeValue(markers[i], "id");
					break;
					case "Essex County":
					i11 = getNodeValue(markers[i], "id");
					break;
					case "Suffolk County":
					i12 = getNodeValue(markers[i], "id");;
					break;
					case "Norfolk County":
					i13 = getNodeValue(markers[i], "id");
					break;
				}
			}
			var countyIds = new Array(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13);
			
			//code to create clickable polygons	
			for (countyCode in countyBorders) {
				var polygon = createPoly(countyCode);
				map.addOverlay(polygon);
				}
			
			function createPoly(countyCode) {
				//find color for polygon
				for (k in countyColors){
					if (k == countyCode){
						//create polygon - (data, bordercolor, borderwidth, borderopacity, bgcolor, bgopacity)
						var polygon = new GPolygon(countyBorders[countyCode], 0, 0, 0, countyColors[countyCode], 0);
					}
				}
				// add listener for polygon to make it do something when clicked
				GEvent.addListener(polygon, "click", function(o) {
					
					if(map.getZoom() == 7)
					{
						map.setCenter( o, map.getZoom() + 1 );
						addMarkers(false);
					}
					else
					{
						var url = countyUrl+(countyIds[countyCode-1]);
						window.location = url;
					}
					
				});
				GEvent.addListener(polygon, "mouseover", function(o) {
					hoverObjs[parseInt(countyCode) - 1].show();
				});
				GEvent.addListener(polygon, "mouseout", function(o) {
					for (var i = 0; i < hoverObjs.length; i++)
					{
						hoverObjs[i].hide();
					};
				});
				return polygon;
			}
			
			var pointSW = new GLatLng(51.446186,-1.726227);
			var pointNE = new GLatLng(53.733215,1.770172);

			var groundOverlay = new GGroundOverlay(assetsBasePath + "map.png", new GLatLngBounds(pointSW, pointNE));
			  
			map.addOverlay(groundOverlay);
			
			var groundOverlay_1 = new GGroundOverlay(assetsBasePath + "map_1.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_2 = new GGroundOverlay(assetsBasePath + "map_2.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_3 = new GGroundOverlay(assetsBasePath + "map_3.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_4 = new GGroundOverlay(assetsBasePath + "map_4.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_5 = new GGroundOverlay(assetsBasePath + "map_5.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_6 = new GGroundOverlay(assetsBasePath + "map_6.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_7 = new GGroundOverlay(assetsBasePath + "map_7.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_8 = new GGroundOverlay(assetsBasePath + "map_8.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_9 = new GGroundOverlay(assetsBasePath + "map_9.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_10 = new GGroundOverlay(assetsBasePath + "map_10.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_11 = new GGroundOverlay(assetsBasePath + "map_11.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_12 = new GGroundOverlay(assetsBasePath + "map_12.png", new GLatLngBounds(pointSW, pointNE));
			var groundOverlay_13 = new GGroundOverlay(assetsBasePath + "map_13.png", new GLatLngBounds(pointSW, pointNE));
			hoverObjs = new Array(groundOverlay_1,groundOverlay_2,groundOverlay_3,groundOverlay_4,groundOverlay_5,groundOverlay_6,groundOverlay_7,groundOverlay_8,groundOverlay_9,groundOverlay_10,groundOverlay_11,groundOverlay_12,groundOverlay_13);
			
			var overlays = hoverObjs.length;
			while(overlays--)
			{
				map.addOverlay(hoverObjs[overlays]);
				hoverObjs[overlays].hide();
			}
		
			map.addControl(new GLargeMapControl3D());
			map.addControl(new GOverviewMapControl());
						
			function addMarkers(small)
			{
				for (var i = 0; i < markers.length; i++)
				{
					var marker = markers[i];
					var name = getNodeValue(marker, "name");
					var id = getNodeValue(marker, "id");
					var lat = parseFloat(marker.getAttribute("latitude"));
					var lng = parseFloat(marker.getAttribute("longitude"));
					var countyMarkers = marker.getElementsByTagName("cm");
					
					//loop through xml to find which markers need to be displayed
					jQuery(marker).find("cm").each(function(i){
						var type = jQuery(this).attr("type");
						var count = jQuery(this).text();
						//if marker needed
						if (count>=1){
							//move slightly right and down
							lng +=0.060;
							lat -=0.0060;
							if(small)
							{
								var collection = pinTypesSmall[type];
							}
							else
							{
								var collection = pinTypes[type];
							}
							
							var url = "";
							switch (type)
							{
								case "incidents":
								url = incidentsUrl;
								break;
								
								case "investments":
								url = investmentsCompletedUrl;
								break;
								
								case "interuptions":
								url = interruptionsUrl;
								break;
								
								case "planned_works":
								url = plannedInvestmentsUrl;
								break;
								
								case "leisure_activities":
								url = leisureUrl;
								break;
								
								case "events":
								url = eventsUrl;
								break;
							}
							
							url = url + id;
							
							var point = new GLatLng(lat,lng);
							
							var placemark = new GMarker(point, collection.icon);
							map.addOverlay(placemark);
							if(small)
							{
								MarkersArraySmall.push(placemark);
							}
							else
							{
								MarkersArray.push(placemark);
								placemark.hide();
							}
							//store data for click event
							placemark.__htmlcontent = storeData(url);
						
							// attach click event pop up window
							GEvent.addListener(placemark, "click", function(latLng)
							{
								GEvent.removeListener(mapOnClick);
								window.location = this.__htmlcontent;
							});
							
							//store type for use with filters
							collection.markers.push(placemark);
							
						}
					})
				
			    }
			}
			//onload add small markers and preload large markers
			addMarkers(true);
			addMarkers(false);
		});	
		
		
			
		//retrieve and display towns
		GDownloadUrl(townsXml, function(data, responseCode)
		{
			var townxml = GXml.parse(data);
			var towns = townxml.documentElement.getElementsByTagName("town");
			for (var i = 0; i < towns.length; i++)
			{
				var town = towns[i];
				var type = "town";
				var collection = pinTypes[type];
				var lat = parseFloat(town.getAttribute("latitude"));
				var lng = parseFloat(town.getAttribute("longitude"));
				if (lat && lng)
				{
					var id = getNodeValue(town, "id");
					var name = getNodeValue(town, "name");
					var point = new GLatLng(lat, lng);
					var townmark = new GMarker(point, collection.icon);
					
					//generate label based on town name from xml
					var label = new ELabel(new GLatLng(lat,lng), name, "googleLabelStyle");
					label.pixelOffset=new GSize(-50,30);
					var url = townUrl + id;
					townmark.__htmlcontent = storeData(url);
					
					// attach click event pop up window
					GEvent.addListener(townmark, "click", function()
					{
						GEvent.removeListener(mapOnClick);
						window.location = this.__htmlcontent;
					});

					//add marker to map
					map.addOverlay(townmark);
					//add label to map
					map.addOverlay(label)
				}
			}
		})
	}
};	

//filter icons
function show(type)
{
	for(k in pinTypes)
	{
		if(k != type && type != 'all')
		{
			for(var i = 0, l = pinTypes[k].markers.length; i < l; i++)
			{
				pinTypes[k].markers[i].hide();
			}
		}
		else
		{
			for(var i = 0, l = pinTypes[k].markers.length; i < l; i++)
			{
				pinTypes[k].markers[i].show();
			}
		}
	}
}