$(document).ready(function($) {
	var mapDivs = $('#search-result-map');
	var loadGMapsAPI = function() {
		  var script = document.createElement("script");
		  script.type = "text/javascript";
		  script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=searchMapInit";
		  document.body.appendChild(script);
		};

	var updateBounds = function (latlng, gMap) {
		if (window.mapBounds == undefined) {
			window.mapBounds = new google.maps.LatLngBounds(latlng, latlng);
		} else {
			window.mapBounds.extend(latlng);
		}
		
		gMap.fitBounds(window.mapBounds);
	};
	
	var makeMarkers = function(google, gMap) {
		
		//geocode and place markers
		var geocoder = new google.maps.Geocoder();
        var j = 0.000001;
		$(".vcard").each(function() {
			
			var vcard = this;
            var markTitle = $(vcard).children('span.org').html();
			var orgName = $(vcard).first('span.fn').html();
			var addressString = '';
            addressString = $(vcard).find('.adr .street-address').html();
            addressString += ", " +  $(vcard).find('.adr .postal-code').html();
            addressString += ", Australia";
            /*
			var addressEls = (vcard).find('.adr span');
			for (var j=0; j<addressEls.length; j++) {
				addressString += (' ' + $(addressEls[j]).html());
			}
			*/
			var geoReq = {address: addressString};
            addressString = '';
			geocoder.geocode(geoReq, function(results, status) {
				//console.log(status);
				if (status == 'OK' && results.length) {
					// in the event of ambiguity, only the first result is considered
					var result = results[0];
					var lat = result.geometry.location.lat();
					var lng = result.geometry.location.lng();
					
					var latlng = new google.maps.LatLng(lat, lng);
					
					var zoomToFunc = 'zoomTo(' + lat + ',' + lng + ', 15);';
					var mapLink = $('div.hreview').has(vcard).find('span.map-link a');
					mapLink.attr('onClick', zoomToFunc);
					mapLink.attr('href', '#main-content-search-result');

					var infoHtml = '<strong>' + orgName + '</strong><br />' +
					'<a href="javascript:' + zoomToFunc + '">zoom to</a>' +
					'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' +
					'<a href="javascript:zoomOut()">zoom out</a>';
					// TODO: custom marker icons - see: http://code.google.com/apis/maps/documentation/javascript/reference.html#MarkerOptions
					var mkrOpts = {position: latlng, title: markTitle };
					var mkr = new google.maps.Marker(mkrOpts);
					var infoWin = new google.maps.InfoWindow({content: infoHtml });
					mkr.setMap(gMap);
					j += j;
					updateBounds(latlng, gMap);
					
					google.maps.event.addListener(mkr, 'click', function() {
					  infoWin.open(gMap, mkr);
					});
				}
			});
		});
		
	};
	
	var zoomTo = function(lat, lng, zoom) {
		var latlng = new google.maps.LatLng(lat, lng);
		window.gMap.setCenter(latlng);
		window.gMap.setZoom(zoom);
	};
	
	var zoomOut = function() {
		window.gMap.fitBounds(window.mapBounds);
	};
	
	var scrollToMap = function() {
	}
	
	var searchMapInit = function() {
		var mapDiv = document.getElementById('search-result-map');
		var latlng = new google.maps.LatLng(-24.994167,134.866944);
		var opts = {
		  zoom: 4,
		  center: latlng,
		  mapTypeId: google.maps.MapTypeId.ROADMAP
		};
		var gMap = new google.maps.Map(mapDiv, opts);
		window.gMap = gMap;
		window.zoomTo = zoomTo;
		window.zoomOut = zoomOut;
		makeMarkers(google, gMap);
		$(mapDiv).show();
	};
		
	if (mapDivs.length) {
		window.searchMapInit = searchMapInit;
		loadGMapsAPI();
	}
});
