/**
 * Google Maps API
 *
 * @author Felipe Rezende <felipe@zeroum.com.br>
 * @version 1.0
 */

// Variáveis
var map;
var geocoder;
var param;
var bounds = new GLatLngBounds();

var default_lat = -14.2350040;
var default_long = -51.9252800;	

geocoder = new GClientGeocoder();		
	
/**
 * Cria uma marca no mapa
 */
function createMarker(point, name, address, image, tel, mais_prox) {
	var baseIcon = new GIcon(G_DEFAULT_ICON);	
	
	if (image) {
		baseIcon.iconSize = new GSize(94, 70);
		baseIcon.shadow = "http://brastage.01digital.com.br/static/img/vcaqui_sombra.png";
		baseIcon.shadowSize = new GSize(157, 67);
		baseIcon.image = image;
	} else {
		baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";	
		baseIcon.shadowSize = new GSize(37, 34);	
		baseIcon.infoWindowAnchor = new GPoint(9, 2);
	}
	
	markerOptions = { icon:baseIcon };
	var marker = new GMarker(point, markerOptions);

	if (!image) {
		var html = '<b>' + name + '</b> <br/>' + address + '<br> <b>Fone</b>: ' + tel;
	} else {
		var html = '<b>' + name + '</b> <br/>' + address;
	}

	GEvent.addListener(marker, 'click', function() {
  		marker.openInfoWindowHtml(html);
		map.setCenter(point, 15);
	});
	
	var retorno = new Array();
	retorno[0] = marker;
	retorno[1] = html;
	
	//return marker;
	return retorno;
}

/**
 * Cria entradas na barra lateral
 */
function createSidebarEntry(marker, name, address, distance) {
	var div = document.createElement('div');			
	
	if (distance) {
		var html = '<b>' + name + '</b> (' + distance.toFixed(1) + ' km)<br/>' + address;
	} else {
		var html = '<b>' + name + '</b> <br/>' + address;
	}	
	
	div.innerHTML = html;
	div.style.cursor = 'pointer';
	div.style.marginBottom = '15px';
	div.style.lineHeight = '11px';
	
	GEvent.addDomListener(div, 'click', function() {
  		GEvent.trigger(marker, 'click');
	});
	
	GEvent.addDomListener(div, 'mouseover', function() {
  		div.style.backgroundColor = '#fe9';
	});
	
	GEvent.addDomListener(div, 'mouseout', function() {
  		div.style.backgroundColor = '#fff';
	});
	
	return div;
}

/**
 * Procura por agências próximas
 */
function searchLocations() {
  var address = document.getElementById('endereco').value;
  geocoder.getLatLng(address, function(latlng) {
    if (!latlng) {
      alert('Endereço não encontrado');
    } else {
      load(latlng);
    }
  });
}

/**
 * Carrega o mapa com as marcas
 */
function load(latlng) {
	if (GBrowserIsCompatible()) {
  		map = new GMap2(document.getElementById('map'));
		//map.enableScrollWheelZoom();
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
			
		if (!latlng) {  						
  			agencias('xml/todas/', false);			
  			map.setCenter(new GLatLng(default_lat, default_long), 4);		
  		} else {
  			agencias('xml/proximas/?lat='+latlng.lat()+'2&lng='+latlng.lng(), latlng);
			//map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
			map.setCenter(new GLatLng(latlng.lat(), latlng.lng()), 13);		
  		}		  		
	}
}

function agencias(url_consulta, latlng) {
	GDownloadUrl(url_consulta, function(data) {
   	var xml = GXml.parse(data);
   	var markers = xml.documentElement.getElementsByTagName('marker');
   	map.clearOverlays();

   	var sidebar = document.getElementById('sidebar');
		sidebar.innerHTML = '';
			
		if (markers.length == 0) {
			sidebar.innerHTML = 'Nenhuma agência encontrada.';
			map.setCenter(new GLatLng(default_lat, default_long), 4);
			return;
		}

		for (var i = 0; i < markers.length; i++) {						
			var name = markers[i].getAttribute('name');
    		var address = markers[i].getAttribute('address');
			var tel = markers[i].getAttribute('tel');
    		var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')),
    										parseFloat(markers[i].getAttribute('lng')));
			var distance = parseFloat(markers[i].getAttribute('distance'));
			
			//var marker = createMarker(point, name, address, false, tel);
			var retorno = createMarker(point, name, address, false, tel);
			
			var marker = retorno[0];						   		
   		map.addOverlay(marker);
   		
			if (latlng && i == 0) {
		 		marker.openInfoWindowHtml(retorno[1]);
			}
			
   		var sidebarEntry = createSidebarEntry(marker, name, address, distance);
   		sidebar.appendChild(sidebarEntry);
    		
    		bounds.extend(point);
		}
		
		if (latlng) {
			var point = new GLatLng(latlng.lat(), latlng.lng());
			var retorno = createMarker(point, 'Você está aqui!', '', 'http://brastage.01digital.com.br/static/img/vcaqui.png');
   		map.addOverlay(retorno[0]);
   		bounds.extend(point);
		}
	});
}
