// JavaScript Document

// dynamically create map
function createMap() {
	
	// create dot icon
	dotIcon = new GIcon(G_DEFAULT_ICON);
	dotIcon.image = "http://maps.google.com.au/intl/en_au/mapfiles/circle.png";
	dotIcon.iconAnchor = new GPoint(10, 10);
	dotIcon.shadow = "http://maps.google.com.au/intl/en_au/mapfiles/circle-shadow45.png";
	dotIcon.shadowSize = new GSize(37, 34);
	dotIcon.infoWindowAnchor = new GPoint(1, 13);
	
	//Icon.iconSize = new GSize(20, 34);
	//Icon.transparent = "mytran.png";
	//Icon.imageMap=[4,1,6,1,10,2,9,1,5,2,11];
	//Icon.printImage = "mymarkerie.gif";
	//Icon.mozPrintImage = "mymarkerff.gif";
	//Icon.printShadow = "myshadow.gif";
	
	dotMarkerOptions = { icon:dotIcon };

	function createMarker(point, message, accuracy) {
		if (accuracy < 8) {
			var marker = new GMarker(point, dotMarkerOptions);
		}
		else {
			var marker = new GMarker(point);
		}
		var opts = new Object();
		opts.maxWidth = 200;
		if (message) {
			GEvent.addListener(marker, "click", function() {
				var myHtml = message;
				map.openInfoWindowHtml(point, myHtml, opts);
			});
		}
		return marker;
	}
	
	// return information for display in map infoWindow
	function getInfoWindowContent(z) {
		var listItem = z.parents(".item");
		var infoContent = "";
		if (listItem.find("input[name='accuracy']").attr("value") < 8) {
			infoContent += "<div class='note'>Placement on map is approximate</div>"; // alert message
		}
		if (listItem.find(".name").length > 0) {
			infoContent += "<div><strong>" + listItem.find(".name").html() + "</strong></div>"; // get name
		}
		if (listItem.find(".address").length > 0) {
			infoContent += "<div>" + listItem.find(".address").html() + "</div>"; // get address
		}
		infoContent += "<div>";
		infoContent += listItem.find(".suburb").html() + listItem.find(".suburb").val(); // get suburb
		infoContent += ", " + listItem.find(".state").html() + listItem.find(".state").val(); // get state
		infoContent += "</div>";
		listItem.find(".service").each(function(){ 
			infoContent += "<div>" + $(this).html() + "</div>"; // get each service
		});
		return infoContent;
	}
	
	// add 'padding' between markers and map edge
	function addPadding(tempBounds) {
		var northEast = tempBounds.getNorthEast();
		var southWest = tempBounds.getSouthWest();
		
		var latMin = northEast.lat();
		var lngMin = northEast.lng();
		var latMax = southWest.lat();
		var lngMax = southWest.lng();
		
		var latPad = (latMax - latMin)*0.08; // 8%
		var lngPad = (lngMax - lngMin)*0.04; // 4%
		
		latMin -= latPad;
		latMax += latPad;
		lngMin -= lngPad;
		lngMax += lngPad;
		
		var newNorthEast = new GLatLng(latMin, lngMin);
		var newSouthWest = new GLatLng(latMax, lngMax);
		
		tempBounds.extend(newNorthEast);
		tempBounds.extend(newSouthWest);
		return tempBounds;
	}
	
	// initialize the map
	map = new GMap2(document.getElementById("map_canvas"));
	init_centre = new GLatLng($("form input[name='latitude']").attr("value"), $("form input[name='longitude']").attr("value"));
	map.setCenter(init_centre, 13);
	map.addControl(new GSmallZoomControl());
	bounds = new GLatLngBounds;

	// add pushpins to map
	$(".geo_data").each(function(){
		
		var accuracy = $(this).find("input[name='accuracy']").attr("value");
		var lat = $(this).find("input[name='latitude']").attr("value");
		var lon = $(this).find("input[name='longitude']").attr("value");
		var point = new GLatLng(lat, lon);
		bounds.extend(point);
		map.addOverlay(createMarker(point, getInfoWindowContent($(this)), accuracy));

	});
	
	// reset map attributes
	bounds = addPadding(bounds);
	map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
	if (map.getZoom() > 13) map.setZoom(13);
	
	// action for page pushpin clicks
	$(".geo_data span.xpushpin a").click(function(){
		
		var point = new GLatLng($(this).parents(".geo_data").find("input[name='latitude']").attr("value"), $(this).parents(".geo_data").find("input[name='longitude']").attr("value"));
		var opts = new Object();
		opts.maxWidth = 200;
		map.openInfoWindowHtml(point, getInfoWindowContent($(this)), opts);

	});
	
}
