var dealers = null;
(function($) {
	var $g = google.maps;
	var $form = null;
	var $radiusInput = null;
	var $radiusSelect = null;
	var icon = null;
	var iconActive = null;
	var activeMarker = null;
	var state = '';
	var icons = {};

	function mouseListener() {
		if (state === 'search') return;
		var center = this.getCenter();
		var topMiddle = new GLatLng(this.getBounds().getNorthEast().lat(), center.lng());

		var radiusInMeters = this.getCenter().distanceFrom(topMiddle); // returns distance in meters.
		var radiusInMiles = Math.min(100, radiusInMeters / 1609.344); // there are 1609.344 meters in 1 mile.
		var radiusInKilometers = Math.min(100, radiusInMeters / 1000);

		var radius = (_r.conf.units === 'miles' ? radiusInMiles : radiusInKilometers);

		$radiusInput.removeAttr("disabled").attr("value", radius);
		$radiusSelect.attr("disabled", "disabled");
	
		$("#loading").show();

		state = 'mouse';

		getDealers(this.getCenter());
	
	}

	$(window).load(function() {
		_r.map = new $g.Map2($("#map")[0]);
		_r.map.setCenter(
			new $g.LatLng(_r.conf.lat, _r.conf.lng),
			_r.conf.zoom);
		var ui = _r.map.getDefaultUI();
		if (!_r.conf.toggleType) {
			for (t in ui.maptypes) {
				ui.maptypes[t] = false;
			}
		}
		_r.map.setUI(ui);

		GEvent.addListener(_r.map, "dragend", mouseListener);
		GEvent.addListener(_r.map, "zoomend", mouseListener);
	});

	$(window).unload(function() {
		$g.Unload();
	});

	$(document).ready(function() {
		$form = $("#dealer_locator").submit(function() {
			var geocoder = new $g.ClientGeocoder();

			state = 'search';
			geocoder.getLatLng(this.address.value, getDealers);
			$("#loading").show();

			return false;
		});

		$radiusInput = $("<input/>", {type: "hidden", name: "radius", disabled: "disabled"}).appendTo($form);
		$radiusSelect = $("select[name=radius]");
		
		for (i in _r.icons) {
			var i = new Image();
			i.src = _r.icons[i];
		}

		$("#results").css({height: $(".locatebar").height() - $(".locatebar .search").outerHeight(true) + "px"});
		$("#dealer_locator input[name=address]").focus(function() {
			if (this.value == _r.msgs.invalidAddress) {
				this.value = '';
			}
			$(this).removeClass("error");
		});
	});

	function getDealers(point) {
		$("#standard_results").empty();

		if (point) {
			$form[0].latitude.value = point.lat();
			$form[0].longitude.value = point.lng();

			$.getJSON($form[0].action.replace(/\.html/, ".radius_dl_results.html"), 
				$form.serialize(), displayDealers);

			$radiusInput.attr("disabled", "disabled");
			$radiusSelect.removeAttr("disabled");
			
		} else {
			var $add = $($form[0].address)
			.css({opacity: 0})
			.addClass("error");

			$add.val(_r.msgs.invalidAddress);
			$add.animate({opacity: 1}, 800);
			$("#loading").hide();
		}
	}

	function displayDealers(dlrs) {
		dealers = dlrs;
		$("#loading").hide();
		
		if (dealers.length == 0) {
			$("#standard_results").append(
				$("<span/>")
				.addClass("error")
				.text(_r.msgs.noResults));
		} else {
		
			if (_r.msgs.print.length > 0) {
				$("#standard_results").append(
					$("<a/>", {
						href: window.location.href.replace(/\.html/, ".radius_dl_print.html"),
						target: "_blank"
					})
					.text(_r.msgs.print).addClass("print"));
			}
			_r.map.clearOverlays();
		
			var bounds = new $g.LatLngBounds();

			if (_r.icons.normal.length > 0) {
				icons.normal = new $g.Icon(G_DEFAULT_ICON , _r.icons.normal);
				var i = new Image();
				i.src = _r.icons.normal;
				$(i).one("load", function() {
					icons.normal.iconSize = new $g.Size(i.width, i.height);
				});
				if (i.complete) $(i).trigger("load");
			}

			if (_r.icons.active.length > 0) {
				icons.active = new $g.Icon(G_DEFAULT_ICON, _r.icons.active);
				var i = new Image();
				i.src = _r.icons.active;
				$(i).one("load", function() {
					icons.active.iconSize = new $g.Size(i.width, i.height);
				});
				if (i.complete) $(i).trigger("load");
			}


			for (i = 0; i < dealers.length; i++) {
				var d = dealers[i];
				var $d = createDealerResult(dealers[i]);
				$("#standard_results").append($d);
				var loc = new $g.LatLng(dealers[i].latitude, dealers[i].longitude);
				var mark = assignMarkerToDealer($d, loc, "normal");
				$d.data("marker", mark);

				bounds.extend(loc);
			}

			if (state === '' || state === 'search') {
				_r.map.setCenter(bounds.getCenter(), _r.map.getBoundsZoomLevel(bounds));
			}
		}

		state = '';
	}

	function openDealerInfo() {
		removeActiveMarker();
		var $tp = $(this).parent();
		var marker = $tp.data("marker");
		
		marker.hide();
		activeMarker = assignMarkerToDealer($tp, marker.getLatLng(), "active");
		_r.map.setCenter(marker.getLatLng());

		return false;
	}

	function removeActiveMarker() {
		if (activeMarker) {
			var marker = activeMarker.data.data("marker");
			marker.show();
			marker.closeInfoWindow();
			_r.map.removeOverlay(activeMarker);
		}
	}

	function assignMarkerToDealer($info, loc, icon) {
		var mark = new $g.Marker(loc, {icon: icons[icon]});
		mark.data = $info;
	
		var $popup = $info.clone(false).css({
			margin: 0,
			height: $info.height() * 1.25 + "px"
		});
		$("a", $popup).click(function() {return false});	

		mark.bindInfoWindow($popup[0]);
		if (icon == "normal") {
			$g.Event.addListener(mark, "click", function() {
				this.hide();
				removeActiveMarker();
				activeMarker = assignMarkerToDealer($info, this.getLatLng(), "active");
				$("#results").scrollTop(this.data.position().top);
			});
		}
			
		_r.map.addOverlay(mark);

		return mark;
	}

	function createDealerResult(dealer) {
		var d = $('#dealer-tmpl').tmpl(dealer, $.extend({
			toUrl: function(url) {
				if (url.indexOf("http") != 0) {
					url = "http://" + url
				}
				return url;
			},

			showIcons: function() {
				return this.conf.showIcons && this.data.dealerTypes.length > 0 && this.conf.iconDir.length > 0;
			}
		}, _r));

		$('.location', d).click(openDealerInfo);

		return d;
	}
})(jQuery);
