google.load('maps' , '2');

var zoomMinimo = 13;
var precoVazio = '--';
var gMap;
var tabela;
var popUp;

var PopUp = Class.create({
	initialize: function(id) {
		this.id = id;
	},
	hide: function() {
		$(this.id).hide();
	},
	showOnMarker: function(marker) {
		$('pop-up-posto').update(marker.posto.nome);
		if (marker.posto.bandeira) {
			$('pop-up-logo').update(new Element('img',{'src':'/images/bandeiras/'+marker.posto.bandeira}));
		} else {
			$('pop-up-logo').update('');
		}
		$('pop-up-endereco').update(marker.posto.endereco);
		$('pop-up-gasolina').update(getPreco(marker.posto.Gasolina,3));
		$('pop-up-alcool').update(getPreco(marker.posto.Alcool,3));
		$('pop-up-diesel').update(getPreco(marker.posto.Diesel,3));
		$('pop-up-data-gasolina').update(marker.posto.dataGasolina);
		$('pop-up-data-alcool').update(marker.posto.dataAlcool);
		$('pop-up-data-diesel').update(marker.posto.dataDiesel);
		$('mais-info-link').setAttribute('href','/posto/'+marker.posto.id+'/'+marker.posto.nomeSlug);

		var popUp = $(this.id);
		var x = $('mapa').cumulativeOffset()[0] + gMap.fromLatLngToContainerPixel(marker.getLatLng()).x - (popUp.getDimensions().width/2);
		var y = $('mapa').cumulativeOffset()[1] + gMap.fromLatLngToContainerPixel(marker.getLatLng()).y - popUp.getDimensions().height-40;
		var distanciaDaBordaDireita = ($('mapa').cumulativeOffset()[0] + $('mapa').getWidth()) - (x + popUp.getWidth());
		if (distanciaDaBordaDireita < 0) {
			x = x + distanciaDaBordaDireita;
		} else if(x < $('mapa').cumulativeOffset()[0]) {
			x = $('mapa').cumulativeOffset()[0];
		}
		
		popUp.style.left = x+'px';
		popUp.style.top = y+'px';
		popUp.show();
	}
});

var TabelaPostos = Class.create({
	sortedCol:null,
	selectedRow:null,
	initialize: function(id) {
		this.id = id;
		var element = $(this.id);
		this.sortedCol = element.select('thead th')[1];
	},
	selectRow: function(row) {
		if (this.selectedRow != null) {
			this.selectedRow.removeClassName('selected');
			this.selectedRow.marker.setImage('/images/markers/vermelho.png');
		}
		var headerRow = $('postos').select('thead tr')[0];
		if (row == null || row == headerRow) {
			this.selectedRow = null;
			return;
		} else {
			row.addClassName('selected');
			row.removeClassName('highlight');
			this.selectedRow = row;
			row.marker.setImage('/images/markers/verde.png');
			popUp.showOnMarker(row.marker);
		}
	},
	highlightRow: function(row){
		var headerRow = $('postos').select('thead tr')[0];
		if (row != headerRow && row != this.selectedRow) {
			row.addClassName('highlight');
			row.marker.setImage('/images/markers/amarelo.png');
		}
	},
	removeHighlightRow: function(row){//
		headerRow = $('postos').select('thead tr')[0];
		if (row != headerRow) {
			row.removeClassName('highlight');
			row.marker.setImage('/images/markers/vermelho.png');
			if (this.selectedRow == row) {
				row.marker.setImage('/images/markers/verde.png');
			}
		}
	},
	sort: function(column) {
		popUp.hide();
		column = column == undefined? this.sortedCol : column;
		this.element = $(this.id);
		var rows = this.element.select('tbody tr');
		rows = rows.sortBy(function(row){
			var td = row.select('td')[column.colIndex+1];
			if (td.innerHTML == precoVazio) {
				return Number.MAX_VALUE;
			}
			return td.innerHTML;
		}.bind(this));
		var tbody = new Element('tbody');
		for(i=0;i<rows.length;i++) {
			rows[i].removeClassName('odd');
			if (i%2 == 1){
				rows[i].addClassName('odd');
			}
			tbody.insert(rows[i]);
		}
		if (this.sortedCol != null) {
			this.sortedCol.removeClassName('sortAsc');
		}
		column.addClassName('sortAsc');
		this.sortedCol = column;
		this.element.select('tbody')[0].replace(tbody);
	}
});


function onLoad() {
	tabela = new TabelaPostos('postos-table');
	popUp = new PopUp('pop-up');
	//tratadores de eventos
	$('pop-up-close').observe('click', function(event){
		removeSelection(null,null);
	});
	var cols = $$('#postos-table thead tr th');
	for(i=0;i<cols.length;i++) {
		cols[i].colIndex = i;
		cols[i].observe('click', function(event){
			tabela.sort(event.element());
		});
	}
	
	//inicializacao do mapa
	gMap = new GMap(document.getElementById("mapa"));
	gMap.addControl(new GSmallMapControl());
	gMap.addControl(new GMapTypeControl());
	gMap.setCenter(new GLatLng(-15.114553,-52.558594), 4);
	gMap.enableScrollWheelZoom();
	manager = new MarkerManager(gMap);
	geocoder = new GClientGeocoder();
 
	GEvent.addListener(gMap, "moveend", requestPostos);
	GEvent.addListener(gMap, "click", removeSelection);
	GEvent.addListener(gMap, "movestart", function(){popUp.hide();});
	
	$('postos-table').observe("click", handleRowClick);
	$('postos-table').observe("mouseover", handleRowOver);
	$('postos-table').observe("mouseout", handleRowOut);
	$('button-submit').observe("click", function(myEvent) {doSearch();} );
	$('form-busca').observe("submit", function(myEvent) {myEvent.stop();} );
	
	doSearch();
}

function handleRowOut(event) {
	var row = event.element().up();
	tabela.removeHighlightRow(row);
}

function handleRowOver(event) {
	var row = event.element().up();
	tabela.highlightRow(row);
}

function handleRowClick(event) {
	var row = event.element().up();
	tabela.selectRow(row);
}

function removeSelection(overlay, latlng) {
	if (!overlay) {
		popUp.hide();
		tabela.selectRow(null);
	}
}

function showLeftComponent(id) {
	$('inicial').hide();
	$('zoom').hide();
	$('carregando').hide();
	$('postos').hide();
	$('sem-postos').hide();
	
	$(id).show();
}

function requestPostos() {
	removeSelection(null,null);
	var zoom = gMap.getZoom();
	manager.clearMarkers();
	
	if (zoom >= zoomMinimo) {
		var southWest = gMap.getBounds().getSouthWest();
		var northEast = gMap.getBounds().getNorthEast();
		
		var url = '/mapa/atualiza?swlat=' + southWest.lat() +
			'&swlng='+southWest.lng() + '&nelat=' + northEast.lat() +
			'&nelng='+northEast.lng() + '&zoom=' + zoom;
		
		new Ajax.Request(url, {
			onSuccess: function(transport) {
				var postos = transport.responseJSON;
				refreshPostos(postos);
			},
			onFailure: function(transport) {
				alert('Falha na conexão.');
			}
		});
		
		showLeftComponent('carregando');
	} else {
		showLeftComponent('zoom');
	}
}

function refreshPostos(postos) {
	manager.clearMarkers();	
	var markers = [];
	var tbody = new Element('tbody');
	var odd = false;
	if (postos.length != 0) {
		var icon = new GIcon();
		icon.image = '/images/markers/vermelho.png';
		icon.iconAnchor = new GPoint(16,37);
		var markerOptions = { 'icon': icon };
		
		for (p in postos) {
			var posto = postos[p];
			var point = new GLatLng(posto.lat, posto.lng);
			
			var marker = new GMarker(point,markerOptions);
			markers.push(marker);
			
			var tr = new Element('tr');
			if (odd) {
				tr.addClassName('odd');
			}
			if (posto.bandeira) {
				tr.insert(new Element('td').addClassName('bandeira').insert(new Element('img',{src:'/images/bandeiras/pequenas/' + posto.bandeira})));
			} else {
				tr.insert(new Element('td').addClassName('bandeira'));
			}
			tr.insert(new Element('td').addClassName('posto').update(posto.nome));
			tr.insert(new Element('td').addClassName('gasolina preco').update(getPreco(posto.Gasolina)));
			tr.insert(new Element('td').addClassName('alcool preco').update(getPreco(posto.Alcool)));
			tr.insert(new Element('td').addClassName('diesel preco').update(getPreco(posto.Diesel)));
			tbody.insert(tr);
			
			marker.posto = posto;
			marker.row = tr;
			tr.marker = marker;
			odd = !odd;
			
			GEvent.addListener(marker, "click", function(event){
				tabela.selectRow(this.row);
			});
			GEvent.addListener(marker, "mouseover", function(event){
				tabela.highlightRow(this.row);
			});
			GEvent.addListener(marker, "mouseout", function(event){
				tabela.removeHighlightRow(this.row);
			});
		}
		manager.addMarkers(markers,0,19);
		manager.refresh();
		$('postos-table').select('tbody')[0].replace(tbody);
		tabela.selectRow(null);
		tabela.sort();
		showLeftComponent('postos');
	} else {
		showLeftComponent('sem-postos');
	}
}

function getPreco(preco,casasDecimais) {
	var casas = casasDecimais == undefined? 2 : casasDecimais ;
	var ret = parseFloat(preco);
	if (isNaN(ret)) {
		return precoVazio;
	}
	return ret.toFixed(casas);
}

function doSearch() {
	var mostra_dica = $('search-box').hasClassName('search-box-com-dica');
	if (mostra_dica == false && $('search-box').present()) {
		var address = $F("search-box") + ' - brasil';
		geocoder.getLatLng(address,onGeocodeResult);
	}
}

function onGeocodeResult(point) {
	if (!point) {
		alert("Lugar desconhecido...");
	} else {
		gMap.setCenter(point,zoomMinimo);
	}   
}

google.setOnLoadCallback(onLoad);