/*global jQuery, google*/
(function($) {
	google.load("maps", "2.x");
	$.fn.gmap = function(options) {
		var params = $.extend($.fn.gmap.defaults, options);
		return this.each(function() {
			var container = $(this).css({
				width: params.width + "px",
				height: params.height + "px"
			});
			if(typeof container.data("gmap") === "undefined") {
				container.children().remove();
				container.addClass(params.className);
				var mapType;
				if(params.mapType === "satellite") {
					mapType = google.maps.SATELLITE_MAP;
				} else if(params.mapType === "hybrid") {
					mapType = google.maps.HYBRID_MAP;
				} else {
					mapType = google.maps.NORMAL_MAP;
				}
				var gmap = new google.maps.Map2(container.get(0));
				gmap.setCenter(new google.maps.LatLng(params.lat, params.long), 16);
				if(params.mapTypeControl) { gmap.addControl(new google.maps.MapTypeControl()); }
				if(params.mapControl) { gmap.addControl(new google.maps.LargeMapControl()); }
				if(params.overviewControl) { gmap.addControl(new google.maps.OverviewMapControl()); }
				gmap.setMapType(mapType);
				container.data("gmap", gmap);
			}
		});
	};
	
	$.fn.gmapMoveTo = function(address) {
		return this.each(function() {
			var container = $(this);
			var gmap = container.data("gmap");
			if(typeof gmap === "undefined") { return; }
			var geocoder = new google.maps.ClientGeocoder();
			geocoder.getLatLng(
				address,
				function(point) {
					if(point) {
						gmap.panTo(point, 13);
					}
				}
			);
		});
	};
	
	$.fn.gmapMoveToCoords = function(lat, lng) {
		return this.each(function() {
			var container = $(this);
			var gmap = container.data("gmap");
			if(typeof gmap === "undefined") { return; }
			var point = new google.maps.LatLng(lat, lng);
			gmap.panTo(point, 13);
		});
	};
	
	$.fn.gmapAddMarker = function(address, display) {
		return this.each(function() {
			var gmap = $(this).data("gmap");
			if(typeof gmap === "undefined") { return; }
			var geocoder = new google.maps.ClientGeocoder();
			geocoder.getLatLng(
				address,
				function(point) {
					if(point) {
						var marker = new google.maps.Marker(point);
						gmap.addOverlay(marker);
						google.maps.Event.addListener(marker, "click", function() {
							marker.openInfoWindowHtml(display);
						}); 
					}
				}
			);
		});
	};
	
	$.fn.gmapAddMarkerCoords = function(lat, lng, display) {
		return this.each(function() {
			var gmap = $(this).data("gmap");
			if(typeof gmap === "undefined") { return; }
			var marker = new google.maps.Marker(new google.maps.LatLng(lat, lng))
			gmap.addOverlay(marker);
			google.maps.Event.addListener(marker, "click", function() {
				marker.openInfoWindowHtml(display);
			});
		});
	};
	
	$.fn.gmap.defaults = {
		className: "httpool-gmap",
		lat:   "45.802478",
		long:  "15.964551",
		width: 400,
		height: 300,
		mapControl: true,
		overviewControl: true,
		mapTypeControl: true,
		mapType: "hybrid"
	};

	// memory leak fix
	$("body").bind("unload", function() { google.maps.Unload(); });
})(jQuery);
