function mapas() {
	var instance = this;

	var script;
	var scriptPronto;
	var intervaloChecar;

	var idPlugin;
	var latLongBanco;
	var address;
	var width;
	var height;

	var map;
	var directionsPanel;
	var directions;
	var coors;

	this.carregarScript = function (googleKey) {
		this.script = document.createElement("script");
		this.script.type = "text/javascript";
		this.script.src = "http://maps.google.com/maps?file=api&v=2.x&key=" + googleKey + "&async=2&callback=Mapas.scriptCarregado";
		$("head").append(this.script);
	}

	this.inicializar = function (idPlugin, latLongBanco, address, width, height) {
		this.idPlugin = idPlugin;
		this.latLongBanco = latLongBanco;
		this.address = address;
		this.width = width;
		this.height = height;

		this.intervaloChecar = setInterval("mapa" + idPlugin + ".checaScript()", 100);
	}

	this.checaScript = function () {
		
		if (Mapas != undefined && Mapas.scriptPronto) {
			clearInterval(this.intervaloChecar);
			this.carregarMapa();
		}
	}

	this.scriptCarregado = function () {
		this.scriptPronto = true;
	}

	this.getLat = function (callback, map) {
		if (this.latLongBanco == undefined) {
			geocoder = new GClientGeocoder();
			if (geocoder) {
				geocoder.getLatLng(
				instance.address, function (point) {
					if (!point) {} else {
						var pointGet = point.toString();
						instance.coors = pointGet.replace("(", "").replace(")", "");
						$.ajax({
							url: '/mapa',
							data: encodeURI('coors=' + instance.coors + '&end=' + instance.address),
							type: 'POST',
							processData: true,
							async: false,
							success: function (data) {}
						});
						callback(instance.coors);
					}
				});
			}
		} else {
			instance.coors = this.latLongBanco;
			callback(instance.coors);
		}
	}

	this.createMarker = function (point, index, baseIcon) {
		var letteredIcon = new GIcon(baseIcon);
		letteredIcon.image = "/lib/assets/img/mapas/localizacao.png";

		var endereco = instance.address.split(", ");
		markerOptions = {
			icon: letteredIcon
		};
		var marker = new GMarker(point, markerOptions);

		GEvent.addListener(marker, "click", function () {
			marker.openInfoWindowHtml('<div class="localizacao"><b>Endereço:</b> ' + endereco[0] + ', ' + endereco[1] + '<br /><b>Cidade:</b> ' + endereco[2] + '<br /><b>CEP:</b> ' + endereco[3])+'</div>';
		});
		return marker;
	}

	this.carregarMapa = function () {
		map = new GMap2(document.getElementById("mapa-" + instance.idPlugin), {
			size: new GSize(this.width, this.height)
		})
		instance.getLat(function (coors) {
			if (GBrowserIsCompatible()) {
				map.addControl(new GLargeMapControl());

				var mapControl = new GMapTypeControl();
				map.addControl(mapControl);
				map.removeMapType(G_HYBRID_MAP);
				map.removeMapType(G_SATELLITE_MAP);

				var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10));
				map.setCenter(new GLatLng(coors.split(",")[0], coors.split(",")[1]), 16);

				var baseIcon = new GIcon(G_DEFAULT_ICON);
				baseIcon.shadow = "/lib/assets/img/mapas/sombra.png";
				baseIcon.iconSize = new GSize(71, 70);
				baseIcon.shadowSize = new GSize(71, 70);
				baseIcon.iconAnchor = new GPoint(40, 66);
				baseIcon.infoWindowAnchor = new GPoint(80, 20);

				map.setCenter(new GLatLng(coors.split(",")[0], coors.split(",")[1]), 16);
				map.addOverlay(instance.createMarker(new GLatLng(coors.split(",")[0], coors.split(",")[1]), 16, baseIcon));
			}

			directionsPanel = document.getElementById("route-" + instance.idPlugin);
			directions = new GDirections(map, directionsPanel);
			
			var traceRoute = document.getElementById("trace-route-" + instance.idPlugin);
			
			if (traceRoute != null) {
				traceRoute.onclick = function () {
					var fromAddress = document.getElementById("from-" + instance.idPlugin).value;
					
					var toAddress = instance.address;
					if (fromAddress=='') {
						$(directionsPanel).html('');
						$("#from-" + instance.idPlugin).next().find('label').text('Informe o endereço que deseja traçar a rota!');
						return;
					}
					else{
						$("#from-" + instance.idPlugin).next().find('label').text('');
					}
					
					map.removeOverlay(new GLatLng(coors.split(",")[0], coors.split(",")[1]), 16);
					map.setCenter(new GLatLng(coors.split(",")[0], coors.split(",")[1]), 15);
					map.clearOverlays();
					directions.load(fromAddress + " to " + toAddress, {
						"locale": "pt_BR"
					});
					setTimeout(function(){
						if ($(directionsPanel).html() == ""){
							$("#from-" + instance.idPlugin).next().find('label').text('Endereço incompleto ou não encontrado!');
						}
					},1000);
				}
			}
		}, map);
	}
}
var Mapas;
