//Create a closure to avoid exposing properties and functions to the outside world
(function($){
	var defaultZoom = 11;
	var gmapsObj = null;
	
	$.fn.map = function(mapId){
		var props = $.fn.map.getProperties($(this));
		if(props.lat != null && props.lng != null){
			var geoPt = new GLatLng(props.lat, props.lng);
			initMap(mapId, geoPt);
			
			var bounds = new GLatLngBounds();
			var pts = new Array();
			
			$(this).each(function(){
				props = $.fn.map.getProperties(this);
				geoPt = new GLatLng(props.lat, props.lng);
				bounds.extend(geoPt);
				pts.push(geoPt);
				$.fn.map.addMarker(geoPt, props.desc, new GIcon(G_DEFAULT_ICON));
			});
			
			if($(this).size() > 1){
				gmapsObj.setZoom(gmapsObj.getBoundsZoomLevel(bounds));
			}
			gmapsObj.setCenter($.fn.map.getApprCenterLatLng(pts));
		}
	}
	
	$.fn.map.getProperties = function(coordEmt){
		var lat = $(coordEmt).find(".lat:first").html();
		var lng = $(coordEmt).find(".lng:first").html();
		var desc = $(coordEmt).find(".desc:first").html();
		return {lat: lat, lng: lng, desc: desc};
	}
	
	$.fn.map.addMarker = function(geoPt, desc, icon){
		var marker = new GMarker(geoPt, icon);
		marker.bindInfoWindowHtml(desc);
		gmapsObj.addOverlay(marker);
	}
	
	$.fn.map.getApprCenterLatLng = function(ptArr){
		var sumLat = 0;
		var sumLng = 0;
		
		for(var i = 0; i < ptArr.length; i++){
			sumLat += ptArr[i].lat();
			sumLng += ptArr[i].lng();
		}
		
		return new GLatLng((sumLat / ptArr.length), (sumLng / ptArr.length));
	}
	
	function initMap(emtId, geoPt){
		gmapsObj = new GMap2(document.getElementById(emtId));
		gmapsObj.setUIToDefault();
		gmapsObj.setCenter(geoPt, defaultZoom);
		gmapsObj.checkResize();
		gmapsObj.setCenter(geoPt, defaultZoom);
	}
})(jQuery);
