if (GBrowserIsCompatible()) {
	var map = null;
	var coords = null;
	var center = null;
	var markers = [];
	var currentListingMarker = null;
	var reversegeocoder = null;
	var relatedTitle = '<h2>Nearby Listings</h2>';
	var geocoder = new GClientGeocoder();
	
	initializeMap();
	//initializeReverseGeocoder();
}

jQuery(document).ready(function(){
	jQuery("#add-favorite").click(function(){
		var url = siteRoot + '/ajax/addFavorite.php?listingid=' + listingId;
		jQuery.getJSON(url, function(response){
			jQuery("#message-bar").html(response.message).show();			
		});
		return false;
	});
});

function initializeMap(){
	map = new GMap2(document.getElementById("map_canvas"));
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.enableScrollWheelZoom();
	
	var starIcon = new GIcon(G_DEFAULT_ICON);
	starIcon.image = siteRoot + "/images/starMarker.png";
	starIcon.iconSize = new GSize(30, 28);
	starIcon.shadow = siteRoot + "/images/starMarkerShadow.png";
	starIcon.shadowSize = new GSize(45, 28);
	starIcon.transparent = siteRoot + "/images/starMarkerTransparent.png";
	starIcon.imageMap = [5,27, 6,17, 0,11, 9,8, 14,0, 20,8, 29,10, 22,18, 23,27, 14,23]; 
	starIcon.iconAnchor = new GPoint(6,26);
	starIcon.infoWindowAnchor = new GPoint(17, 10);
	var markerOpts = { icon:starIcon };
		
	
	if(listingLat != '0' && listingLng != 0){
		var point1 = new GLatLng(listingLat, listingLng);
		currentListingMarker = new GMarker(point1, markerOpts);
		map.setCenter(point1, 13);
    } else {
		var geocoder = new GClientGeocoder();	
		geocoder.getLatLng(fullAddress, 
			function(point) {
				if (!point) {
					//alert(fullAddress + " not found");
					map.setCenter(new GLatLng(38.13455657705411, -95.80078125), 4);
				} else {
					map.setCenter(point, 13);
					currentListingMarker = new GMarker(point, markerOpts);
				}
			}	
		);
	}
	
	if(currentListingMarker){
		map.addOverlay(currentListingMarker);
		currentListingMarker.bindInfoWindowHtml(openInfoWindowHtml);
		currentListingMarker.openInfoWindowHtml(openInfoWindowHtml);
		markers.push({"id":listingId, "marker":currentListingMarker, "infoWindow": openInfoWindowHtml}); 
	}
	
		
	GEvent.addListener(map, "zoomend", function(){ onMapChange(); });
	GEvent.addListener(map, "dragend", function(){ onMapChange(); });
}

function initializeReverseGeocoder(){
	if(map != null){
		reversegeocoder = new GReverseGeocoder(map);
		GEvent.addListener(reversegeocoder, "load", function(placemark){
			var city = placemark.AddressDetails.Country.AdministrativeArea.Locality.LocalityName;
			var state = placemark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
			
			relatedTitle = "<h2>More Listings Near " + city + ", " + state + "</h2>";
		});
		
		GEvent.addListener(reversegeocoder, "error", function(){
			relatedTitle = '<h2>Nearby Listings</h2>';
		});
	}
}

function createQueryString(page, forceNewCoords){
	if(!page){ page = 1; }
	
	if(forceNewCoords || coords == null){
		coords = map.getBounds();
		center = map.getCenter();
		//reversegeocoder.reverseGeocode(center);
		geocoder.getLocations(center, showAddress);
	}
	var ne = coords.getNorthEast();
	var sw = coords.getSouthWest();
	var nelat = ne.lat();
	var nelng = ne.lng();
	var swlat = sw.lat();
	var swlng = sw.lng();
	var cntlat = center.lat();
	var cntlng = center.lng();
	
	var url = siteRoot + '/ajax/getListingsByLatLng_json.php?nelat=' + nelat + '&nelng=' + nelng + '&swlat=' + swlat + '&swlng=' + swlng + '&cntlat=' + cntlat + '&cntlng=' + cntlng + '&pg=' + page;
	return url;
}

function onMapChange(){
	var url = createQueryString(1, true);
	jQuery.getJSON(url, handleResponse);
}

function handleResponse(data){
	jQuery('#console').empty();
	jQuery('#relatedListings').empty();
	jQuery('#relatedListings').attr('class','widget');
	
	if(data.numListings > 0){
		jQuery('<h3>' + relatedTitle + '</h3>').appendTo('#relatedListings');
		jQuery('<ul/>').appendTo('#relatedListings');
		
		var oldMarkers = markers;
		jQuery.each(markers, function(i, item){
			item = null;
		});
		markers = null;
		markers = [];
		
		var removedMarkers = [];
		var newListings = [];
		
		jQuery.each(oldMarkers, function(i,item){
			var found = false;
			if(item.id == listingId){
				found= true;
			} else {
				jQuery.each(data.listings, function(newI, newItem){
					if(newItem.listingid == item.id ){
						found = true;
					}
				});
			}
			
			if(!found){
				map.removeOverlay(item.marker);
			} else {
				markers.push(item);
			}
		});
		
		jQuery.each(data.listings, function(i, item){
			addRelatedListing(item);
			var found = false;
			jQuery.each(oldMarkers, function(oldI, oldItem){
				if(item.listingid == oldItem.id){
					found = true;
				}
			});
			if(!found){
				newListings.push(item);
			}
		});
		
		jQuery.each(newListings, function(i, item){					
			var address = item.address + " " + item.city + " " + item.state + " " + item.zip;
			var point = new GLatLng(item.latitude, item.longitude);
			var marker = new GMarker(point);
			var infoWindow = "<div><b>" + item.title + "</b><br />"+ item.address +"<br />" + item.city + ", " + item.state + " - " + item.zip + "<br />" + item.phone + "<br><a href='" + siteRoot + "/listing/details/" + item.listingid + "/" + item.slug + "'>Details</a></div>";
			marker.bindInfoWindowHtml(infoWindow);
			
	        map.addOverlay(marker);
	        markers.push({"id":item.listingid, "marker": marker, "infoWindow": infoWindow}); 
		});
		
		if(data.more){
			jQuery("<div style='float: right'><a href='javascript:void(0);' onclick='gotoPage(" + (parseInt(data.page)+1) +");'>Next</a></div>").appendTo('#relatedListings');
		}
		if(data.page > 1){
			jQuery("<div style='float: left'><a href='javascript:void(0);' onclick='gotoPage(" + (parseInt(data.page)-1) +");'>Prev</a></div>").appendTo('#relatedListings');
		}
	}
}

function gotoPage(pageNum){
	var url = createQueryString(pageNum, false);
	jQuery.getJSON(url, handleResponse);
}

function showAddress(response){
	relatedTitle = "<h2>Nearby Listings</h2>";
	if(!response || response.Status.code != 200){
		return;
	} else {
		var place = response.Placemark[0];
		var city = false;
		var state = false;
		if(place.AddressDetails.Country.AdministrativeArea){
			if(place.AddressDetails.Country.AdministrativeArea.Locality){
				city = place.AddressDetails.Country.AdministrativeArea.Locality.LocalityName;
			}
			var state = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
		}
		
		if(city && state){
			relatedTitle = "<h2>Listings Near " + city + ", " + state + "</h2>";
		}
	}		
}

function addRelatedListing(item){
	var elemStr = "<li>"
	elemStr += "<h4><a href='javascript:void(0)' onclick='selectMarker("+item.listingid+")'>" + item.title + "</a></h4>";
	elemStr += "<p>";
	elemStr += "<span>" + item.address + "</span>";
	elemStr += "</p><p>";
	elemStr += "<span>" + item.city + ", </span>";
	elemStr += "<span>" + item.state + " </span>";
	elemStr += "<span>" + item.zip + " </span>";
	elemStr += "</p>";
	elemStr += "</li>";
	jQuery(elemStr).appendTo("#relatedListings ul");
}

function selectMarker(markerId){
	jQuery.each(markers, function(i, item){
		if(item.id == markerId){
			var marker = item.marker;
			marker.openInfoWindowHtml(item.infoWindow);
			return;
		}
	});
}
