$.extend(Site, {
	Map: {
		
		maps: {},

		geocoder: undefined,
		
		defaultOptions: {
			zoom: 13,
			disableDefaultUI: true,
			navigationControl: true,
			mapTypeId: undefined
		},
		
		addAddress: function(mapContainer, address, info, center, draggable) {
			var map = this.maps[mapContainer]['map'];
			this.geocoder.geocode(
				{'address': address}, 
				function(results, status) {
					if (status == google.maps.GeocoderStatus.OK) {
						return Site.Map.addMarker(mapContainer, results[0].geometry.location, info, center, draggable);
					} else {
						Shin.alert(	
							'error', 
							Shin.i18n('GLOBAL.ERROR_GMAP_TITLE'), 
							Shin.i18n('GLOBAL.ERROR_GMAP_MESSAGE')
						);
						return false;
					}
				}
			);
		},
		
		addMarker: function(mapContainer, position, info, center, draggable) {
			if (typeof draggable == 'undefined') draggable = false;
			if (typeof center == 'undefined') center = true;
			var map = this.maps[mapContainer]['map'];
			var marker = new google.maps.Marker({
				position: position,
				map: map,
				draggable: draggable
			});
			if (center) {
				map.setOptions({center: position});
			}
			if (typeof info == 'string') {
				marker.infowindow = Site.Map.setInfoWindow(mapContainer, marker, info);
			}
			this.maps[mapContainer]['markers'].push(marker);
			return marker;
		}, 
		
		addPoint: function(mapContainer, latitude, longitude, info, center, draggable) {
			var map = this.maps[mapContainer]['map']
			return Site.Map.addMarker(mapContainer, new google.maps.LatLng(latitude, longitude), info, center, draggable);
		},
		
		centerOnAddress: function(mapContainer, address) {
			var map = this.maps[mapContainer]['map'];
			this.geocoder.geocode(
				{'address': address}, 
				function(results, status) {
					if (status == google.maps.GeocoderStatus.OK) {
						Site.Map.setOptions(mapContainer, {'center': results[0].geometry.location});
						return true;
					} else {
						return false;
					}
				}
			);
		},
		
		centerOnPoint: function(mapContainer, latitude, longitude) {
			var map = this.maps[mapContainer]['map'];
			this.geocoder.geocode(
				{'latLng': new google.maps.LatLng(latitude, longitude)}, 
				function(results, status) {
					if (status == google.maps.GeocoderStatus.OK) {
						Site.Map.setOptions(mapContainer, {'center': results[0].geometry.location});
						return true;
					} else {
						return false;
					}
				}
			);
		},
		
		create: function(mapContainer, center) {
			this.geocoder = new google.maps.Geocoder();
			this.defaultOptions.mapTypeId = google.maps.MapTypeId.ROADMAP;
			this.maps[mapContainer] = {};
			this.maps[mapContainer]['map'] = new google.maps.Map(document.getElementById(mapContainer), this.defaultOptions);
			this.maps[mapContainer]['markers'] = [];
		},
		
		fitBounds: function(mapContainer) {
			var bounds = new google.maps.LatLngBounds();
			for (var i=0; i<Site.Map.maps[mapContainer]['markers'].length; ++i) {
				bounds.extend(Site.Map.maps[mapContainer]['markers'][i].position);
			}
			Site.Map.maps[mapContainer]['map'].fitBounds(bounds);
		},
		
		ready: function(onReady) {
			Site.Map.readyCallback = onReady;
			document.write('<script src="http://maps.google.com/maps/api/js?sensor=false&callback=Site.Map.readyCallback&language='+Shin._config.lang+'"><\/script>')
		},
		
		readyCallback: function() {},
		
		setInfoWindow: function(mapContainer, marker, info){
			var map = this.maps[mapContainer]['map'];
			var infowindow = new google.maps.InfoWindow({
				content: info
			});
			google.maps.event.addListener(marker, 'click', function() {
				/* This loop is used to close all infowindows before opening new ones */
				for (var i=0; i<Site.Map.maps[mapContainer]['markers'].length; ++i) {
					if (typeof Site.Map.maps[mapContainer]['markers'][i]['infowindow'] == 'object') {
						Site.Map.maps[mapContainer]['markers'][i]['infowindow'].close(map);
					}
				}
				infowindow.open(map, marker);
			});
			return infowindow;
		},
		
		setOptions: function(mapContainer, options) {
        	this.maps[mapContainer]['map'].setOptions(options);
		},
		
		setZoom: function(mapContainer, value) {
			this.maps[mapContainer]['map'].setOptions({zoom: value});
		}
	}
});
