var directionDisplay;
var directionsService = new google.maps.DirectionsService();
var map = null;
var mc = null;
var bounds = null;
var markers = null;
var infoWindow = null;
var showMarketClusterer = false;
var geocoder = null;
var address = null;
var addressLocation = null;
var closestLocation = null;
var sector = 38;
var depotStatus = 0;
var defaultZoom = 5;

function showUpdateMarker(latid,lngid,zoomid) {
	var lat = document.getElementById(latid).value;
	var lng = document.getElementById(lngid).value;
	var selected = document.getElementById(zoomid).selectedIndex;
	var level = document.getElementById(zoomid)[selected].value;
	var updatePoint = new google.maps.LatLng(lat,lng);

	map.panTo(updatePoint);

	var marker = new google.maps.Marker({
		map: map,
		position: updatePoint,
		clickable: false,
		draggable: true,
	    animation: google.maps.Animation.DROP
	});
	google.maps.event.addListener(marker, "dragend", function () {
		var newPoint = marker.getPosition();
		document.getElementById("lat").value = newPoint.lat();
		document.getElementById("lng").value = newPoint.lng();
	});
}

function zoomMap(zoomid) {
	var selected = document.getElementById(zoomid).selectedIndex;
	var level = eval(document.getElementById(zoomid)[selected].value);
	map.setZoom(level);
}

function getAddress(address) {
	address = address + ", BC, Canada";
	geocoder.geocode( {'address': address}, function(results, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			addressLocation = results[0].geometry.location;
			document.getElementById("lat").value = addressLocation.lat();
			document.getElementById("lng").value = addressLocation.lng();
		} else {
			alert("Geocode was not successful for the following reason: " + status);
		}
	});
}

function makePOSTRequest(url,parameters) {
	http_request = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			// set type accordingly to anticipated content type
			//http_request.overrideMimeType('text/xml');
			http_request.overrideMimeType('text/html');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!http_request) {
		alert('Cannot create XMLHTTP instance');
		return false;
	}
	http_request.onreadystatechange = alertContents;
	http_request.open('POST', url, true);
	http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	http_request.setRequestHeader("Content-length", parameters.length);
	http_request.setRequestHeader("Connection", "close");
	http_request.send(parameters);
}

function alertContents() {
	// used mainly for debugging
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
			alert(http_request.responseText);
			result = http_request.responseText;
			document.getElementById('myspan').innerHTML = result;				
		} else {
			alert('There was a problem with the request.');
		}
	}
}

function saveGeopoint(depotid,lat,lng) {
	var poststr = "Latitude=" + lat + "&Longitude=" + lng;
	var requrl = "index.cfm?It=902&Id=" + depotid;
	makePOSTRequest(requrl, poststr);
	document.getElementById("lat").value = lat;
	document.getElementById("lng").value = lng;
}

function toggleMarkerClusterer() {
	showMarketClusterer = !showMarketClusterer;
	if (showMarketClusterer) {
		if (mc) {
			mc.addMarkers(markers);
		} else {
			mc = new MarkerClusterer(map, markers, {
				maxZoom: 19,
				styles: [{
					url: '../images/encp_map_cluster-ri5.png',
					width: 42,
					height: 50,
					textColor: '#ffffff'
				}, {
					url: '../images/encp_map_cluster-ri5.png',
					width: 42,
					height: 50,
					textColor: '#ffffff'
				}, {
					url: '../images/encp_map_cluster-ri5.png',
					width: 42,
					height: 50,
					textColor: '#ffffff'
				}, {
					url: '../images/encp_map_cluster-ri5.png',
					width: 42,
					height: 50,
					textColor: '#ffffff'
				}, {
					url: '../images/encp_map_cluster-ri5.png',
					width: 42,
					height: 50,
					textColor: '#ffffff'
				}]
			});
		}
	} else {
		mc.clearMarkers();
	}
}

function codeAddress() {
	geocoder.geocode( {'address': address}, function(results, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			addressLocation = results[0].geometry.location;
			displayMarkers();
			var marker = new google.maps.Marker({
				map: map,
				title: address,
				position: addressLocation
			});
			// google.maps.event.addListener(marker, 'click', function(event){findClosestMarker(marker)});
			bounds = new google.maps.LatLngBounds(findClosestMarker(marker));
			bounds.extend(addressLocation);
			map.fitBounds(bounds);
		} else {
			alert("Geocode was not successful for the following reason: " + status);
		}
	});
}

function displayMarkers() {
	var bevIcon = new google.maps.MarkerImage('../images/encp_map_ri-bev.png',
	      new google.maps.Size(40, 40),
	      new google.maps.Point(0,0),
	      new google.maps.Point(21, 40));
	var milkIcon = new google.maps.MarkerImage('../images/encp_map_ri-milk.png',
	      new google.maps.Size(40, 40),
	      new google.maps.Point(0,0),
	      new google.maps.Point(21, 40));
	var elecIcon = new google.maps.MarkerImage('../images/encp_map_ri-elec.png',
	      new google.maps.Size(40, 40),
	      new google.maps.Point(0,0),
	      new google.maps.Point(21, 40));
	var shadow = new google.maps.MarkerImage('../images/encp_map_ri-shadow.png',
	      new google.maps.Size(62, 40),
	      new google.maps.Point(0,0),
	      new google.maps.Point(21, 40));
	infoWindow = new google.maps.InfoWindow({
		maxWidth: 200,
		content: "loading..."
	});
	for (var i = 0; i < markers.length; i++) {
		var details = markers[i];
		if (details.sect == 40) {
			var image = elecIcon;
			var locurl = '/electronics/locations/';
		} else if (details.sect == 39) {
			var image = milkIcon;
			var locurl = '/milk/locations/';
		} else {
			var image = bevIcon;
			var locurl = '/locations/';
		}
		var coords = new google.maps.LatLng(details.location[0], details.location[1]);
		var info = '';
			if (details.status == 3) {
				info = '<img src="../images/encp_icon_3-star.gif" alt="3-Star" title="3-Star Depot"><br/>';
			} else if (details.status == 5) {
				info = '<img src="../images/encp_icon_5-star.gif" alt="5-Star" title="5-Star Depot"><br/>';
			}
			info = info + '<b>' + details.name + '</b><br/>';
			info = info + details.address + '<br/>';
			if (addressLocation) {
				info = info + '<a href="javascript:getDirections(\'' + addressLocation + '\',\'' + coords + '\')">Get Directions</a> | ';
				// info = info + '<a href="index.cfm?It=902&Id=' + details.itemid + '&Se=' + details.sect + '&St=' + address + '">Show Details</a> &raquo;';
				info = info + '<a href="' + locurl + details.page + '/?St=' + address + '">Show Details</a> &raquo;';
			} else {
				// info = info + '<a href="index.cfm?It=902&Id=' + details.itemid + '&Se=' + details.sect + '">Show Details</a> &raquo;';
				info = info + '<a href="' + locurl + details.page + '/">Show Details</a> &raquo;';
			}
		bounds.extend(coords);
		markers[i] = new google.maps.Marker({
			icon: image,
			shadow: shadow,
			title: details.name,
			position: coords,
			clickable: true,
			draggable: false,
			flat: false,
			html: info,
			sect: details.sect
		});
		google.maps.event.addListener(markers[i], "click", function () {
			infoWindow.setContent(this.html);
			infoWindow.open(map, this);
		});
	}
	if (defaultZoom > 5){
		map.setCenter(bounds.getCenter());
	} else {
		map.fitBounds(bounds);
	}
	toggleMarkerClusterer();
}

function getDirections(start, end) {
	var request = {
		origin: start, 
		destination: end,
		travelMode: google.maps.TravelMode.DRIVING
	};
	directionsService.route(request, function(response, status) {
		if (status == google.maps.DirectionsStatus.OK) {
			directionsDisplay.setDirections(response);
		}
	});
}

function rad(x) { return x * Math.PI/180; }

function findClosestMarker( marker ) {
	var lat = marker.position.lat();
	var lng = marker.position.lng();
	var R = 6371;
	var distances = [];
	var closest = -1;
	for(var i = 0; i < markers.length; i++ ) {
		var mlat = markers[i].position.lat();
		var mlng = markers[i].position.lng();
		var msect = markers[i].sect;
		var dLat  = rad(mlat - lat);
		var dLong = rad(mlng - lng);
		var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
			Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);
		var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
		var d = R * c;
		distances[i] = d;
		if (closest == -1 || (d < distances[closest] && msect == sector)) {
			closest = i;
		}
	}
	closestLocation = markers[closest].position;
	return markers[closest].position;
}

function initialize() {
	var streetView = false;
	directionsDisplay = new google.maps.DirectionsRenderer();
	if (depotStatus > 0) streetView = true;
	geocoder = new google.maps.Geocoder();
	map = new google.maps.Map(document.getElementById('map_canvas'), {
		center: new google.maps.LatLng(54.8,-124.9),
		zoom: defaultZoom,
		streetViewControl: streetView,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	});
	directionsDisplay.setMap(map);
	directionsDisplay.setPanel(document.getElementById("directionsPanel"));
 	// google.maps.event.addDomListener(document.getElementById('mc-cb'), 'click', toggleMarkerClusterer);
	// Prepares the marker object, creating a google.maps.Marker object for each location
	if (markers) {
		bounds = new google.maps.LatLngBounds;
		if (address) {
			codeAddress();
		} else {
			displayMarkers();
		}
	}
}

google.maps.event.addDomListener(window, 'load', initialize);


