var map = null;
var stockistDistances = new Array();
var detailItemCount = 0;
var baseIcon = null;
var maxDist = 0;
var minx = 0;
var maxx = 0
var miny = 0; 
var maxy = 0;
var markers = new Array();
var markerCount = 0;
var currentItem = null;
var m;
var distanceInMiles;
var userPostcode = util.QueryString('postcode').replace("+", " ").toUpperCase();

function loadmap() {
	// Create the map
	if (GBrowserIsCompatible() && storedata.length > 0) {
		map = new GMap2(document.getElementById("map"));
 
		// Set map icons
		baseIcon = new GIcon(G_DEFAULT_ICON);
        baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
        baseIcon.iconSize = new GSize(20, 34);
        baseIcon.shadowSize = new GSize(37, 34);
        baseIcon.iconAnchor = new GPoint(9, 34);
        baseIcon.infoWindowAnchor = new GPoint(9, 2);
        
		// Set maps controls
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
        map.enableScrollWheelZoom();
		
		// Set default map if no postcode
		if(userPostcode.length == 0) {
			setDefaultMap();
		}
		else
			getPointFromPostcode(userPostcode);
	}
}

function setDefaultMap() {
	for(var i=0; i<storedata.length; i++)
	{
		var point = new GLatLng(storedata[i].y, storedata[i].x);
		m = createMarker(point, storedata[i], i, false);
		map.addOverlay(m);
	}
	map.setCenter(new GLatLng(54.622978,-2.592773), 5);
}

function getPointFromPostcode(postcode) {
	var localSearch = new GlocalSearch();
	localSearch.setSearchCompleteCallback(null, 
		function() {
			if (localSearch.results.length > 0)
			{		
				var resultLat = localSearch.results[0].lat;
				var resultLng = localSearch.results[0].lng;
				minx = maxx = resultLng;
				miny = maxy = resultLat;
				
				for(var i=0; i<storedata.length; i++)
				{	
					stockistDistances[i] = toMiles(calcDistance(resultLat, storedata[i].y, resultLng, storedata[i].x), 2) + "~" + storedata[i].storeId;
				}
				
				stockistDistances.sort(function(a,b){c = a.split("~"); d = b.split("~"); return c[0] - d[0]});
				
				var dist; 
				var storey;
				var storex;
				var storeGeneral;
				var storeMarine;
				var storeName;
				var storeAddress;
				var storePostcode;
				var storePhone;
				var storeWebsite;
				var storecopy;
				for(var i=0; i < stockistDistances.length; i++)
				{
					dist = stockistDistances[i].split("~");
					
					for(var i2=0; i2<storedata.length; i2++)
					{
						if(dist[1] == storedata[i2].storeId) {
							storey = storedata[i2].y;
							storex = storedata[i2].x;
							storeGeneral = storedata[i2].general;
							storeMarine = storedata[i2].marine;
							storeName = storedata[i2].name;
							storeAddress = storedata[i2].address;
							storePostcode = storedata[i2].postcode;
							storePhone = storedata[i2].phone;
							storeWebsite = storedata[i2].website;
							storecopy = storedata[i2];
							break;
						}
					}
					
					if(i < 5) {
						miny = storey < miny ? storey : miny;
						maxy = storey > maxy ? storey : maxy;
						minx = storex < minx ? storex : minx;
						maxx = storex > maxx ? storex : maxx;
						
						var point = new GLatLng(storey, storex);
						m = createMarker(point, storecopy, i, i < 5);
						map.addOverlay(m);
						
						switch(i) {
							case 0:
								document.getElementById("mapResultsAHeader").innerHTML = "<p class=\"storeName\" onclick=\"findOnMap(" + dist[1] + "); setVisibleAddress('A');\">" + storeName + "</p><span class=\"tiny\">(about " + dist[0] + " miles)</span>";
								document.getElementById("mapResultsABody").innerHTML = storeAddress.replace(", ", "<br />") + (storePostcode.length > 0 ? "<br />" + storePostcode : "") + "<br />Tel: " + (storePhone.length > 0 ? storePhone : "-") + (storeWebsite.length > 0 ? "<br /><a class=\"tiny\" href=\"" + storeWebsite + "\" target=\"_blank\">" + storeWebsite.replace("http://", "").replace("/", "/<br />") + "</a><br />" : "-<br />");
								if(storeGeneral == "Y") {
									var imgAGeneral = new Image();
									imgAGeneral.src = "images/flag_paint_stockist_icon.jpg";
									imgAGeneral.alt = "General Stockist";
									imgAGeneral.className = "icon";
									document.getElementById("mapResultsABody").appendChild(imgAGeneral);
								}
								if(storeMarine == "Y") {
									var imgAMarine = new Image();
									imgAMarine.src = "images/flag_marine_stockist_icon.jpg";
									imgAMarine.alt = "Marine Stockist";
									imgAMarine.className = "icon";
									document.getElementById("mapResultsABody").appendChild(imgAMarine);
								}
								break;
							case 1:
								document.getElementById("mapResultsBHeader").innerHTML = "<p class=\"storeName\" onclick=\"findOnMap(" + dist[1] + "); setVisibleAddress('B');\">" + storeName + "</p><span class=\"tiny\">(about " + dist[0] + " miles)</span>";
								document.getElementById("mapResultsBBody").innerHTML = storeAddress.replace(", ", "<br />") + (storePostcode.length > 0 ? "<br />" + storePostcode : "") + "<br />Tel: " + (storePhone.length > 0 ? storePhone : "-") + (storeWebsite.length > 0 ? "<br /><a class=\"tiny\" href=\"" + storeWebsite + "\" target=\"_blank\">" + storeWebsite.replace("http://", "").replace("/", "/<br />") + "</a><br />" : "-<br />");
								if(storeGeneral == "Y") {
									var imgBGeneral = new Image();
									imgBGeneral.src = "images/flag_paint_stockist_icon.jpg";
									imgBGeneral.alt = "General Stockist";
									imgBGeneral.className = "icon";
									document.getElementById("mapResultsBBody").appendChild(imgBGeneral);
								}
								if(storeMarine == "Y") {
									var imgBMarine = new Image();
									imgBMarine.src = "images/flag_marine_stockist_icon.jpg";
									imgBMarine.alt = "Marine Stockist";
									imgBMarine.className = "icon";
									document.getElementById("mapResultsBBody").appendChild(imgBMarine);
								}
								break;
							case 2:
								document.getElementById("mapResultsCHeader").innerHTML = "<p class=\"storeName\" onclick=\"findOnMap(" + dist[1] + "); setVisibleAddress('C');\">" + storeName + "</p><span class=\"tiny\">(about " + dist[0] + " miles)</span>";
								document.getElementById("mapResultsCBody").innerHTML = storeAddress.replace(", ", "<br />") + (storePostcode.length > 0 ? "<br />" + storePostcode : "") + "<br />Tel: " + (storePhone.length > 0 ? storePhone : "-") + (storeWebsite.length > 0 ? "<br /><a class=\"tiny\" href=\"" + storeWebsite + "\" target=\"_blank\">" + storeWebsite.replace("http://", "").replace("/", "/<br />") + "</a><br />" : "-<br />");
								if(storeGeneral == "Y") {
									var imgCGeneral = new Image();
									imgCGeneral.src = "images/flag_paint_stockist_icon.jpg";
									imgCGeneral.alt = "General Stockist";
									imgCGeneral.className = "icon";
									document.getElementById("mapResultsCBody").appendChild(imgCGeneral);
								}
								if(storeMarine == "Y") {
									var imgCMarine = new Image();
									imgCMarine.src = "images/flag_marine_stockist_icon.jpg";
									imgCMarine.alt = "Marine Stockist";
									imgCMarine.className = "icon";
									document.getElementById("mapResultsCBody").appendChild(imgCMarine);
								}
								break;
							case 3:
								document.getElementById("mapResultsDHeader").innerHTML = "<p class=\"storeName\" onclick=\"findOnMap(" + dist[1] + "); setVisibleAddress('D');\">" + storeName + "</p><span class=\"tiny\">(about " + dist[0] + " miles)</span>";
								document.getElementById("mapResultsDBody").innerHTML = storeAddress.replace(", ", "<br />") + (storePostcode.length > 0 ? "<br />" + storePostcode : "") + "<br />Tel: " + (storePhone.length > 0 ? storePhone : "-") + (storeWebsite.length > 0 ? "<br /><a class=\"tiny\" href=\"" + storeWebsite + "\" target=\"_blank\">" + storeWebsite.replace("http://", "").replace("/", "/<br />") + "</a><br />" : "-<br />");
								if(storeGeneral == "Y") {
									var imgDGeneral = new Image();
									imgDGeneral.src = "images/flag_paint_stockist_icon.jpg";
									imgDGeneral.alt = "General Stockist";
									imgDGeneral.className = "icon";
									document.getElementById("mapResultsDBody").appendChild(imgDGeneral);
								}
								if(storeMarine == "Y") {
									var imgDMarine = new Image();
									imgDMarine.src = "images/flag_marine_stockist_icon.jpg";
									imgDMarine.alt = "Marine Stockist";
									imgDMarine.className = "icon";
									document.getElementById("mapResultsDBody").appendChild(imgDMarine);
								}
								break;
							case 4:
								document.getElementById("mapResultsEHeader").innerHTML = "<p class=\"storeName\" onclick=\"findOnMap(" + dist[1] + "); setVisibleAddress('E');\">" + storeName + "</p><span class=\"tiny\">(about " + dist[0] + " miles)</span>";
								document.getElementById("mapResultsEBody").innerHTML = storeAddress.replace(", ", "<br />") + (storePostcode.length > 0 ? "<br />" + storePostcode : "") + "<br />Tel: " + (storePhone.length > 0 ? storePhone : "-") + (storeWebsite.length > 0 ? "<br /><a class=\"tiny\" href=\"" + storeWebsite + "\" target=\"_blank\">" + storeWebsite.replace("http://", "").replace("/", "/<br />") + "</a><br />" : "-<br />");
								if(storeGeneral == "Y") {
									var imgEGeneral = new Image();
									imgEGeneral.src = "images/flag_paint_stockist_icon.jpg";
									imgEGeneral.alt = "General Stockist";
									imgEGeneral.className = "icon";
									document.getElementById("mapResultsEBody").appendChild(imgEGeneral);
								}
								if(storeMarine == "Y") {
									var imgEMarine = new Image();
									imgEMarine.src = "images/flag_marine_stockist_icon.jpg";
									imgEMarine.alt = "Marine Stockist";
									imgEMarine.className = "icon";
									document.getElementById("mapResultsEBody").appendChild(imgEMarine);
								}
								break;
						}
					}
				}
				
				var fifth = stockistDistances[4].split("~");
				maxDist = fifth[0];
				var scale = 5;
				if(maxDist > 0) {
					if(maxDist <= 10) scale = 11;
					else if(maxDist <= 28) scale = 9;
					else if(maxDist <= 90) scale = 7;
					else if(maxDist <= 260) scale = 6;
					else if(maxDist <= 400) scale = 5;
				}
				
				var finaly = miny + ((maxy - miny)/2);
				var finalx = minx + ((maxx - minx)/2);
				
				if(finaly.toString().indexOf(".") != finaly.toString().lastIndexOf("."))
					finaly = finaly.toString().substring(0, finaly.toString().lastIndexOf("."));
					
				if(finalx.toString().indexOf(".") != finalx.toString().lastIndexOf("."))
					finalx = finalx.toString().substring(0, finalx.toString().lastIndexOf("."));
			
				document.getElementById("mapResultsContainer").className = "";
			
				map.setCenter(new GLatLng(parseFloat(finaly), parseFloat(finalx)), scale);
			}else{
				setDefaultMap();
				alert("Sorry, the postcode '" + postcode + "' could not be found");
			}
		});	
		
	localSearch.execute(postcode + ", UK");
}
 
function createMarker(latlng, detail, index, customIcon) {
	var markerOptions = null;
	if(customIcon) {
		var letter = String.fromCharCode("A".charCodeAt(0) + index);
		var letteredIcon = new GIcon(baseIcon);
		letteredIcon.image = "http://www.google.com/mapfiles/marker" + letter + ".png";
		markerOptions = { icon:letteredIcon };
	}
 
	var marker = new GMarker(latlng, markerOptions);
          
	marker.detail = detail;
	marker.pos = latlng;
	GEvent.addListener(marker,"click", markerClick);
	markers[markerCount++] = marker;
	return marker;
}
 
function markerClick(pos, element) {
	if(!element) element = this;
	var image = ''; if(element.detail.logo != '' && element.detail.logo != 'blank.gif') image = '<img src="images/stores/' + element.detail.logo + '" style="float:right;" />';
	if(util.getMSIEVersion() > 0 && util.getMSIEVersion() < 7) image = '';
	var address = element.detail.address.replace(/\n/gi,'<br/>').replace(/,/gi,'<br/>');
	address = address.replace(/<br\/>[ ]*<br\/>/gi, '<br/>');
	var html = '<div style="text-align: left; font-family: Verdana; font-size: 0.7em;"><b>' + element.detail.name + '</b><br/>' + image + address + '<br/>' + element.detail.postcode + '</div>';
    map.openInfoWindowHtml(element.pos, html);
}
 
function findOnMap(id) {
	for(var i=0; i<markers.length; i++) if(markers[i].detail.storeId == id) markerClick(markers[i].pos, markers[i]);
}

function calcDistance(lat1, lat2, lon1, lon2) {
	var R = 6371; // km
	var dLat = toRad(lat2-lat1);
	var dLon = toRad(lon2-lon1); 
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
	        Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * 
	        Math.sin(dLon/2) * Math.sin(dLon/2); 
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
	var d = R * c;
	
	return d;
}

function toRad(value) {
	return value * Math.PI / 180;
}

function toMiles(km, dp) {
	return (km * 0.621371192).toFixed(dp);
}

function setVisibleAddress(flag) {
	document.getElementById("mapResultsABody").className = "hide";
	document.getElementById("mapResultsBBody").className = "hide";
	document.getElementById("mapResultsCBody").className = "hide";
	document.getElementById("mapResultsDBody").className = "hide";
	document.getElementById("mapResultsEBody").className = "hide";
	document.getElementById("mapResults" + flag + "Body").className = "";
}

util.addEvent(window, 'load', function() { loadmap(); if(userPostcode.length > 0)
	document.getElementById("postcode").value = userPostcode; });
util.addEvent(window, 'unload', function() { GUnload(); });
