var map, centreLat, centreLng, zoom;
var cities = new Array();
var brokers = new Array();
var showingBrokers = false;

function initialize() {
	google.load("maps", "2", {callback: loadMap });
}

function loadMap() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("agentMap"));

		map.setCenter(new GLatLng(centreLat, centreLng), zoom);
		map.addControl(new GSmallMapControl());
		map.disableDoubleClickZoom();
		GEvent.addListener(map, "zoomend", zoomEnd);
		GEvent.addListener(map, "dragend", dragEnd);

		initBrokerMarker();
		initHZInfoWindow();
		loadCityMarkers();
	}
}

function loadCityMarkers() {
	citiesAjax = new HZAjax("/phpHelpers/util/provinceBrokersAjax.php?province=" + province + "&bycity=", citiesResponse);
	citiesAjax.send();
}

function zoomTo(cityId) {
	var lat = parseFloat(cities[cityId].lat);
	var lng = parseFloat(cities[cityId].lng);

	var point = new GLatLng(lat, lng);
	map.setCenter(point, 12);

	for (var city in cities) {
		map.removeOverlay(cities[city].marker);
	}
	loadBrokers();
}

function zoomEnd(oldLevel, newLevel) {
	HZInfoWindow.removeCurrentHZInfoWindow(false);
	if (newLevel == 12 && oldLevel == 11) {
		for (var city in cities) {
			map.removeOverlay(cities[city].marker);
		}
		loadBrokers();
		return;
	}
	if (newLevel == 11 && oldLevel == 12) {
		for (var broker in brokers) {
			map.removeOverlay(brokers[broker].marker);
		}
		loadCityMarkers();
		return;
	}
}

function dragEnd() {
	HZInfoWindow.removeCurrentHZInfoWindow(false);
	if (showingBrokers) {
		for (var broker in brokers) {
			map.removeOverlay(brokers[broker].marker);
		}
		loadBrokers();
	}
}

function citiesResponse() {
	if (citiesAjax.checkReadyState()) {
		var jsonResults = eval('(' + citiesAjax.xmlhttp.responseText + ')');
		var numResults = jsonResults.length;

		for (var i=0;i<numResults;i++) {
			var jsonResult = jsonResults[i];
			var point = new GLatLng(parseFloat(jsonResult.lat), parseFloat(jsonResult.lng));
			point.city = jsonResult;
			point.byCity = true;
			var marker = new BrokerMarker(point);
			jsonResult.marker = marker;
			map.addOverlay(marker);
			cities[jsonResult.id] = jsonResult;
		}
		citiesAjax = null;
		showingBrokers = false;
	}
}

function loadBrokers() {
	var bounds = map.getBounds();
	var sw = bounds.getSouthWest();
	var ne = bounds.getNorthEast();
	var params = "?province=" + province
		+ "&minlat=" + sw.lat()
		+ "&minlng=" + sw.lng()
		+ "&maxlat=" + ne.lat()
		+ "&maxlng=" + ne.lng();

	brokersAjax = new HZAjax("/phpHelpers/util/provinceBrokersAjax.php" + params,brokersResponse);
	brokersAjax.send();
}

function brokersResponse() {
	if (brokersAjax.checkReadyState()) {
		var jsonResults = eval('(' + brokersAjax.xmlhttp.responseText + ')');
		var numResults = jsonResults.length;

		for (var i=0;i<numResults;i++) {
			var jsonResult = jsonResults[i];
			var point = new GLatLng(parseFloat(jsonResult.lat), parseFloat(jsonResult.lng));
			point.broker = jsonResult;
			var marker = new BrokerMarker(point);
			jsonResult.marker = marker;
			map.addOverlay(marker);
			brokers[jsonResult.id] = jsonResult;
		}

		showingBrokers = true;
		brokersAjax = null;
	}
}

function loadBroker(id, isCity) {
	var params;
	if (isCity) {
		params = "?cityid=" + id;
	} else {
		params = "?id=" + id;
	}
	brokerInfoAjax = new HZAjax("/phpHelpers/util/brokerInfoAjax.php" + params, brokerInfoResponse);
	brokerInfoAjax.send();
}

function brokerInfoResponse() {
	if (brokerInfoAjax.checkReadyState()) {
		var brokerInfo = eval('(' + brokerInfoAjax.xmlhttp.responseText + ')');

		if (showingBrokers) {
			brokers[brokerInfo.id].detailedBrokerInfo = brokerInfo;
			brokers[brokerInfo.id].marker.infoWindow();
		} else {
			cities[brokerInfo.city_id].detailedBrokerInfo = brokerInfo;
			cities[brokerInfo.city_id].marker.infoWindow();
		}
	}
}

function brokerHTML(brokerInfo) {
	var s = "<a href='/RealEstateOffice/" + provinceLongName + "/" 
			+ brokerInfo.city.replace(" ", "_") 
			+ "/" + brokerInfo.id + "'>" + brokerInfo.name + "</a><br>";

	if (brokerInfo.address != '') {
		s += brokerInfo.address + "<br>";
	}
	if (brokerInfo.phone!= '') {
		s += brokerInfo.phone + "<br>";
	}
	if (brokerInfo.email != '') {
		s += brokerInfo.email+ "<br>";
	}

	return s;
}

function BrokerMarker(point) {
	this.point_ = point;
}

function initBrokerMarker() {
	BrokerMarker.prototype = new GOverlay();

	BrokerMarker.iconSize = new GSize(23, 35);

	BrokerMarker.prototype.initialize = function(map) {
		var div = document.createElement("div");

		map.getPane(G_MAP_MAP_PANE).appendChild(div);
		if (this.point_.byCity) {
			var cityInfo = this.point_.city;

			if (cityInfo.count == '1') {
				$(div).addClass("agentMarker");
			} else {
				$(div).addClass("brokerMarker");
			}
		} else {
			$(div).addClass("agentMarker");
		}

		this.map_ = map;
		this.div_ = div;

		GEvent.bindDom(div, "click", this, function() {
				this.infoWindow();
			});
		GEvent.bindDom(div, "mouseover", this, function() {
			});
		GEvent.bindDom(div, "mouseout", this, function() {
			});
	}

	BrokerMarker.prototype.setDivId = function(id) {
		$(this.div_).attr("id",id);
	}

	BrokerMarker.prototype.infoWindow = function() {
		var innerHTML;

		if (this.point_.byCity) {
			var cityInfo = this.point_.city;
		
			if (cityInfo.count == '1') {
				if (typeof(cityInfo.detailedBrokerInfo) == 'undefined') {
					loadBroker(cityInfo.id, true);
					return;
				} else {
					innerHTML = "Only 1 broker in this city.<br>" 
						+ brokerHTML(cityInfo.detailedBrokerInfo);
				}
			} else {
				innerHTML = "There are " + cityInfo.count + " brokerages in " 
					+ cityInfo.city + ". <a href='javascript:zoomTo(\"" 
					+ cityInfo.id + "\");>Zoom in to see them</a>.";
			}
		} else {
			var brokerInfo = this.point_.broker;

			if (typeof(brokerInfo.detailedBrokerInfo) == 'undefined') {
				loadBroker(brokerInfo.id, false);
				return;
			}
			innerHTML = brokerHTML(brokerInfo.detailedBrokerInfo);

		}

		this.hzInfoWindow = new HZInfoWindow(innerHTML, 
			this.point_, 
			250, 
			BrokerMarker.iconSize, 
			"hzInfoWindow");

		this.hzInfoWindow.doBubble = true;
		this.map_.addOverlay(this.hzInfoWindow);
		this.hzInfoWindow.addCloseButton();
	}

	BrokerMarker.prototype.remove = function() {
		$(this.div_).hide();
	}

	BrokerMarker.prototype.copy = function() {
		return new BrokerMarker(this.point_);
	}

	BrokerMarker.prototype.redraw = function(force) {
		if (!force) return;

		var c = this.map_.fromLatLngToDivPixel(this.point_);
	
		this.div_.style.left = (c.x - 11) + "px";
		this.div_.style.top = (c.y - 35) + "px";
	}
}

