var map = false;

// Create our "tiny" marker specialIcon
var specialIcon = new GIcon();
specialIcon.image = "/assets/shared/marker-green.png";
specialIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
specialIcon.iconSize = new GSize(20, 34);
specialIcon.shadowSize = new GSize(37, 34);
specialIcon.iconAnchor = new GPoint(5, 5);
specialIcon.infoWindowAnchor = new GPoint(10, 8);

function averages(a) {
  var r = {mean: 0, variance: 0, deviation: 0}, t = a.length;
  for(var m, s = 0, l = t; l--; s += a[l]);
  for(m = r.mean = s / t, l = t, s = 0; l--; s += Math.pow(a[l] - m, 2));
  return r.deviation = Math.sqrt(r.variance = s / t), r;
}

function buildHtml(data) {
	var html = "";
	html = html + "<div class=\"h-info-window\"><img src=\"" + data.thumb_url + "\" class=\"h-thumb\"/>";
	html = html + "<span class=\"h-rate\">(From " + data.low_rate + ")</span>";
	html = html + "<span class=\"h-name\"><a href=\"" + data.info_url + "\">" + data.name + "</a></span> ";
	html = html + "<span class=\"h-desc\">" + data.desc + "</span> ";
	html = html + "<span class=\"h-url\"><a href=\"" + data.info_url + "\">More Info</a></span></div>";
	return html;
}

function addHotel(data) {
	var pt = new GLatLng(data.latitude, data.longitude);
	
	var marker = new GMarker(pt);
  
	GEvent.addListener(marker, "click", function() {
		// map.setCenter(pt);
		if (typeof(make_map_bigger) != "undefined")
			make_map_bigger();
		marker.openInfoWindowHtml(buildHtml(data));
		map.setCenter(marker.point);
	});
	map.addOverlay(marker);
}

function load() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		if (map_mode != "satellite"){
			map.addControl(new GMapTypeControl());
		}
		map.addControl(new GScaleControl());

		var pt = new GLatLng(hotelsGroup[0].latitude, hotelsGroup[0].longitude);
		map.setCenter(pt, zoom_factor ? zoom_factor : 14);

		if (map_mode == "satellite") {
			var map_types = map.getMapTypes();
			for (var i in map_types) {
				if (map_types[i].getName() == "Satellite") {
					map.setMapType(map_types[i]);
				}
			}
		}

		if (this_is_special) {		
      var pt = new GLatLng(this_lat, this_long);
      var marker = new GMarker(pt, specialIcon);
      GEvent.addListener(marker, "click", function() {
        map.setCenter(pt);
        marker.openInfoWindowHtml("<b>" + this_name + "</b>");
      });
      map.addOverlay(marker);
  		map.setCenter(pt, zoom_factor ? zoom_factor : 14);
		}

		var min_lat = 9999;
		var max_lat = 0;
		var min_long = 9999;
		var max_long = 0;
		var upper_left_skip = -1;
		var lower_right_skip = -1;
		var lats = [];
		var longs = [];
		
		for (var i in hotelsGroup) {
			if (hotelsGroup[i]) {
				addHotel(hotelsGroup[i]);
				
				if (hotelsGroup[i].latitude == 0 && hotelsGroup[i].longitude == 0)
				  continue;
        
        // get rid of data that is extremely different 
        // than the current min/max
        
        if (min_lat != 9999 &&
            Math.abs(min_lat - hotelsGroup[i].latitude) > 1) {
          // alert('Skipping ' + i); 
          continue;
        }
        
        lats.push(hotelsGroup[i].latitude);
        longs.push(hotelsGroup[i].longitude);
        var min_lat = Math.min(min_lat, hotelsGroup[i].latitude);
        var max_lat = Math.max(max_lat, hotelsGroup[i].latitude);
        var min_long = Math.min(min_long, hotelsGroup[i].longitude);
        var max_long = Math.max(max_long, hotelsGroup[i].longitude);
        // alert(hotelsGroup[i].latitude);
			}
		}

		if (!this_is_special) {
				// Center map according to the mean value of lat/long
				var lat_avgs = averages(lats);
				var long_avgs = averages(longs);
				map.setCenter(new GLatLng(lat_avgs.mean, long_avgs.mean), zoom_factor ? zoom_factor : 13);
				// alert(lat_avgs.deviation);
		}
	}
}

window.onload = load;
// setTimeout(load, 500);
window.onunload = GUnload;

