function MapControl($elt) {
	var self = this;
	self.$elt = $elt;

	self.Init = function () {
	    self.CreateMap();
	    self.InfoWindows = [];
	    self.Bounds = new google.maps.LatLngBounds();
	    $('.js-address').each(function (i, ele) {
	        var $addrelt = $(ele);
	        var address = $addrelt.data('addr');
	        $addrelt.parent().css('background', "url('http://www.google.com/mapfiles/marker" + String.fromCharCode(i + 65) + ".png') no-repeat .3em .3em");
	        self.AddGeocodeAddress(address, $addrelt, i);
	    });
	    //Bind Click

	};
	
	self.CreateMap = function() {
		var mapOptions = {
				zoom: 16,
				mapTypeId: google.maps.MapTypeId.ROADMAP
			}
		self.Map = new google.maps.Map(self.$elt.find('.js-mapcontainer')[0], mapOptions);
	};

	self.CreateMarker = function (results, status, data, index) {
	    var marker = new google.maps.Marker({
	        map: self.Map,
	        position: results[0].geometry.location,
	        icon: new google.maps.MarkerImage("http://www.google.com/mapfiles/marker" + String.fromCharCode(index + 65) + ".png")
	    });
	    if (self.$elt.data('zoom')) {
	        self.Map.setCenter(marker.getPosition());
	        self.Map.setZoom(self.$elt.data('zoom'));
	    }
	    else {
	        self.Bounds.extend(marker.position);
	        self.Map.fitBounds(self.Bounds);
	    }
	    data.parent().click(function () {
	        self.Map.setCenter(marker.getPosition()); self.Map.setZoom(14);
	        for (i in self.InfoWindows)
	            self.InfoWindows[i].close();
	    });
	    var infowindow = new google.maps.InfoWindow({
	        content: '<div class="ui-infowindow">' + data.html() + '</div>'
	    });

	    self.InfoWindows.push(infowindow);

	    google.maps.event.addListener(marker, 'click', function () {
	        for (i in self.InfoWindows)
	            self.InfoWindows[i].close();
	        infowindow.open(self.Map, marker);
	    });
	};
	
	self.AddGeocodeAddress = function(addr, elt, index) {
		var geocoder = new google.maps.Geocoder();
		
		var geoCodeObj = {
            address: addr,
            region: 'us'
        };
		
		geocoder.geocode(geoCodeObj, function(r,s) { self.CreateMarker(r,s,elt, index); });
	};
}

$.fn.MapControl = function(elt) {
	$(this).each(function(i, ele) {
		var $elt = $(ele);
		if($elt.data('object')) return;
		$elt.data('object', new MapControl($elt));
		$elt.data('object').Init();
	});
	
	return this;
};
