/*
 * Handles google map implementation
 * See http://code.google.com/apis/maps/documentation/reference.html for complete documentation
 */
var data = function(o){ this.o=o;}

ha.map = {
	init: function(mapData, mapKey){
		data = new data(mapData);
		var script = document.createElement("script");
			script.src = 'http://www.google.com/jsapi?key='+ mapKey + '&callback=ha.map.load';
			script.type = "text/javascript";
		document.getElementsByTagName("head")[0].appendChild(script);
	},
	
	load: function(){
		google.load('maps' , '2', {"callback" : ha.map.loaded});
	},
	
	loaded: function(){
		if (GBrowserIsCompatible()) {
      		ha.map.map();
      	}
	},
	
	map: function() {
		var map = new google.maps.Map2(document.getElementById("g-map"));
		map.setCenter(new google.maps.LatLng(0, 0), 0);
		map.setMapType(G_NORMAL_MAP);
		
		var maxZoom = 20; //front door
		var bounds = new google.maps.LatLngBounds();
		var marker, latLng;
		var aTypeIndex = -1;
	  	for (var i = 0; i < data.o.location.length; i++){
	  		if(data.o.location[i].type == "a") aTypeIndex++;
	  		if(data.o.location[i].zoom < maxZoom){
				maxZoom = data.o.location[i].zoom;
			}
	  		
	  		if (data.o.location[i].a != "null" && data.o.location[i].b != "null"){
	  			latLng = new google.maps.LatLng(parseFloat(unescape(data.o.location[i].a)),parseFloat(unescape(data.o.location[i].b)));
	  			bounds.extend(latLng);
	  			if (data.o.location[i].exact) { map.addOverlay(ha.map.marker(i, aTypeIndex)); }
	  		}
	  	}
	  	
	  	if (data.o.location.length == 0) map.setZoom(0);
	  	else if (data.o.mType == "attraction-review") map.setZoom(13);
	  	else if (data.o.location.length == 1) map.setZoom(data.o.location[0].zoom);
	  	else map.setZoom(map.getBoundsZoomLevel(bounds));
	  		
	  	var mapTypes = map.getMapTypes();
		for (var i=0; i<mapTypes.length; i++) {
			mapTypes[i].getMaximumResolution = function() {return maxZoom;}
		}
		
	  	map.setCenter(bounds.getCenter());
		
  		ha.map.controls(map);
	},

	marker: function(index, aTypeIndex) {
		var type = data.o.location[index].type;
		var unitId = data.o.location[index].id;
		var mType = data.o.mType;
		var icon = new google.maps.Icon(G_DEFAULT_ICON);
		var title = "";
		
		if(type == "a" && mType == "attraction") {
			title = $("#attraction-name-" + aTypeIndex).html();
			icon.image = "http://www.google.com/mapfiles/marker" + String.fromCharCode("A".charCodeAt(0) + aTypeIndex) + ".png";
		} else if (mType == "attraction-review") {
			title = $("#attraction-name").html();
		} else if (type == "u"){
			title = unitId;
			icon.image = "../images/marker/unit-marker.png";
		}
		
	    var options = {title: title, draggable: false, clickable:true, icon: icon};
		var marker = new google.maps.Marker(new google.maps.LatLng(parseFloat(unescape(data.o.location[index].a)), parseFloat(unescape(data.o.location[index].b))), options);
		GEvent.addListener(marker, "click", function() {
			var caption = "";
			if (mType == "compare"){
				caption += "<strong>" + $("#id-" + unitId).html() + "</strong><br />";
				caption += $("#summary-" + unitId).html();
			} else if (mType == "property"){
				caption += $("#summary-" + unitId).html();
			} else if (mType == "attraction"){
				location.href = $("#attraction-link-" + aTypeIndex).attr("href");
			}
			if (caption != "") marker.openInfoWindowHtml(caption);
		});
        
        return marker;
	},
	
	controls: function(map){
		if (data.o.mType == 'property'){
			map.addControl(new GSmallZoomControl());
		} else {
			map.addControl(new GSmallMapControl());
		}
	}
};





