
/* ***************************************************************************
   * farmacias.js
   * versao 1.0 - 17/09/2010
   * versao 1.1 - 22/03/2011 - fix navigation with #
   * versao 1.2 - 01/12/2011 - Alteracoes na API dos mapas lixaram isto tudo. Deixei de usar o clearscreenclutter e faço reset ao mapa
   *
   * O culpado e' o eep@co.sapo.pt
   *
   */

var json; // json com resposta do getJSON.php
var markersCollection; // Array com a lista de marcadores para mais tarde remover
var map; // objecto SAPO Mapas
var marker; // marker do ponto central de pesquisa
var sel_marker; // farmácia seleccionada
var itinerarioFarmacia; // objecto com itinerário da farmácia seleccionada
var max_loop_iterations = 6; // maximo de zoomouts automaticos quando nao encontra
var auto_loop_iterations = 0; // contador de iteracoes de zoomout automatico
var default_zoom = 13;
var default_lon_skip = 0.0255;
var default_lat_skip = 0.02;

var zoom_level = default_zoom;
var lon_skip = default_lon_skip;
var lat_skip = default_lat_skip;

/* *****************************************
   * initMap(void)
   * 
   * Usado apenas ao carregar a pagina
   * Cria a instancia do mapa na div
   ***************************************** */

function initMap() {
    map = new SAPO.Maps.Map('mapDiv', {isWheelEnabled:false});
    map.addControl(new SAPO.Maps.Control.MapType());
    map.addControl(new SAPO.Maps.Control.Navigation());
}

/* *****************************************
   * resetPolygon(void)
   * 
   * Há uma situação é que é necessário repôr
   * o polígono nos defaults. Quando se muda de
   * tipo de farmacia.
   * Isto porque o autozoom pode ter funcionado
   * antes.
   ***************************************** */

function resetPolygon() {
	// Repor os defaults do polígono
	lon_skip = default_lon_skip;
	lat_skip = default_lat_skip;
	zoom_level = default_zoom;
	resetMap();
}

/* *****************************************
   * expandArea(increment_lat, increment_lon)
   * 
   * Expande a area do poligono de pesquisa
   * o numero de vezes indicado
   * Util para o Alentejo :)
   * No final faz reset ao mapa e reload
   * as farmacias atraves do reloadFarms
   ***************************************** */

function expandArea(increment_lat, increment_lon) {

    lat_skip = lat_skip + increment_lat;
    lon_skip = lon_skip + increment_lon;
    zoom_level--;
    reloadFarms();

}

/* *****************************************
   * resetMap(void)
   * 
   * Usado pelo reloadFarms para repor todos
   * os dados do mapa como se fosse a primeira
   * chamada.
   * Sao limpos os poligonos e marcadores que
   * existam.
   ***************************************** */

function resetMap() {

    // Limpar lixo (markers, popups, itinerários, etc)
    // clearScreenClutter();
	map.destroy();
	sel_marker = "";
	initMap();

    // Reposicionar ao centro da morada do user
    map.setMapCenter(new OpenLayers.LonLat(lon, lat), zoom_level);

    // Criar um marcador para a casa ou ponto de partida
    marker = new SAPO.Maps.Marker(new OpenLayers.LonLat(lon,lat), {draggable:true},
                    {
                        markerImage:'http://imgs.sapo.pt/farmacias2010/img/pushpin2.png',
                        markerAnchor: new OpenLayers.Pixel(-16, -32),size: new OpenLayers.Size(32, 32)
                    }
                );
    map.addOverlay(marker);

    // Desenhar o poligono que contem a area de pesquisa
    // Atencao: isto tem de estar alinhado com os valores do getJSON.php que faz o mesmo
    // antes de pedir o GetPharmaciesByBoundingBox

    // Isto (era) uma string.
    // Typecasting sucks.
    lon = Number(lon);
    lat = Number(lat);

    // O poligono e' mais ou menos um quadrado em torno do centro lon,lat
    polygon = new SAPO.Maps.Polygon([new OpenLayers.LonLat(lon + lon_skip, lat - lat_skip),
                                     new OpenLayers.LonLat(lon + lon_skip, lat + lat_skip),
                                     new OpenLayers.LonLat(lon - lon_skip, lat + lat_skip),
                                     new OpenLayers.LonLat(lon - lon_skip, lat - lat_skip)
                                    ],
                                    {
                                     strokeColor: '#0000FF',
                                     strokeOpacity: 0.3,
                                     strokeWidth: 1,
                                     strokeDashstyle: 'longdash',
                                     fillColor: '#000000',
                                     fillOpacity: 0.07
                                    });
    // Show me the money!
    // map.addOverlay(polygon);

    // marker.registerEvent('click', this, openPopup);
}

/* *****************************************
   * clearScreenClutter(void)
   * 
   * Limpa polígonos, markers, popups
   * e itinerários se existirem
   ***************************************** */

function clearScreenClutter() {

    // Limpar o poligono se existir
/*
    if(typeof polygon == 'object') {
        map.removeOverlay(polygon);
    }
*/

    // Limpar markers se existirem
    if(typeof sel_marker == 'object') {
    	if(sel_marker.hasOpenedPopup()) {
	    	sel_marker.closePopup();	
    	}
/*
		if(sel_marker.layer == 'object') {
    		map.removeOverlay(sel_marker);
		}
*/		
    }

/*    
    for(i in markersCollection) {
    	if(markersCollection[i].layer == 'object') {
	    	map.removeOverlay(markersCollection[i]);
	    }
    }
*/    
    // Limpar o itinerário anterior
    if(typeof itinerarioFarmacia != "undefined") {
        itinerarioFarmacia.clear();
    }

    // Esconder o itinerario
    document.getElementById('itinerario').style.display='none';

}

/* *****************************************
   * farmSelect(id)
   * 
   * Evento invocado quando e' escolhida uma
   * farmacia da lista
   * input: id = ord to array json.lista escolhido
   ***************************************** */

function farmSelect(id) {
    // Quando e' seleccionada uma farmacia mostramos o botao de itinerario
    // E modificamos-lhe o evento onclick para mostrar o itinerario da farmacia
    // que estiver seleccionada
    // document.getElementById('itinerariobutton').onclick='getItinerary('+id+')';
	// document.getElementById('itinerariobutton').style.display='block';

    // removemos o lixo todo (polígonos, markers, etc)
    // e re-centramos o mapa
    //clearScreenClutter();
	resetMap();
    map.setMapCenter(new OpenLayers.LonLat(json.lista[id].lon, json.lista[id].lat), 17);

    // Criamos um marcador para a farmacia escolhida
    // com um icone proprio.
    // O array json.lista tem o que precisamos
    sel_marker = new SAPO.Maps.Marker(new OpenLayers.LonLat(json.lista[id].lon, json.lista[id].lat), {draggable:true}, 
                    {
                        markerImage:'http://imgs.sapo.pt/farmacias2010/img/' + json.lista[id].marker,
//                        markerImage:'img/pharmacy.png',
                        markerAnchor: new OpenLayers.Pixel(-16, -32),size: new OpenLayers.Size(32, 32)
                    }
                );

    // O marcador vai ter uma janela de popup com os dados
    // da farmacia escolhida e o botao de itinerario
	sel_marker.openPopup(json.lista[id].name+'<p>'+json.lista[id].street+'<br />'+json.lista[id].zipcode+' '+json.lista[id].parish+
						  '<br />Tel: '+json.lista[id].phone+'</p>'+
				          '<p><span class="botaoPeq"><input onclick="getItinerary('+id+
				          ')" name="input" type="button" value="Itinerário" class="fundoBranco" /></span></p>');

    // Show me the money!
    map.addOverlay(sel_marker);
//	document.getElementById('fsel'+id).setAttribute("class", json.lista[id].classe + " farmSelected" );
    document.getElementById('nfarmacias').innerHTML = 'seleccionada: ' + json.lista[id].name;
}


/* *****************************************
   * reloadFarms(void)
   * 
   * Refresca ou obtem nova lista de farmacias
   * fazendo uma chamada Ajax ao getJSON que
   * retorna a lista para o objecto de json
   * json.lista
   ***************************************** */

function reloadFarms() {
    // Antes de cada refresh fazemos um refresh ao mapa para
    // voltar ao zoom level default e mostrar o overlay da boundingbox
    resetMap();

    // Ainda nao esta nenhuma farmacia escolhida por isso desligamos o botao
    // E repomos o indicador do numero de farmacias
	// document.getElementById('itinerariobutton').style.display='none';
	document.getElementById('nfarmacias').innerHTML = 'A pesquisar...';

    // Friendly message para limpar a lista de resultados
	document.getElementById('resultados').innerHTML='<ul><li>A pesquisar... Aguarde.</li></ul>';

    // O tipo e' indicado pela select box no topo da lista.
    var tipo = document.getElementById('select').value;

    // Variavel s vai conter a lista em HTML das farmacias devolvidas
	s='';
	new Ajax.Request("getJSON.php?type="+tipo+"&lat="+lat+"&lon="+lon+"&latskip="+lat_skip+"&lonskip="+lon_skip, {
		method:'get',
		requestHeaders: {Accept: 'application/json'},

		onFailure: function(transport) {
			document.getElementById('resultados').innerHTML='<ul><li>Sem resultados</li></ul>';
	        document.getElementById('nfarmacias').innerHTML = 'nenhuma';
		},

		onSuccess: function(transport) { 
			if(transport.responseText.length == 2) {
				s = '<li>Sem resultados. A procurar num raio maior...</li>';
	            document.getElementById('nfarmacias').innerHTML = 'nenhuma';
                // Caso nao haja resultados, expandimos a area de pesquisa
                // automaticamente ate' um maximo de 3 vezes para nao
                // entrar em loop
                if(auto_loop_iterations < max_loop_iterations) {
                    auto_loop_iterations++;
                    expandArea(default_lat_skip * 3, default_lon_skip * 3);
                } else {
				    s = '<li>Não foram encontradas farmácias próximas da zona pesquisada.</li><li><span class="botaoPeq"><input onclick="clearLastUsed();top.location=' + "'" + 'index.php' + "'" + '" name="input" type="button" value="Alterar Localização" class="fundoCinza" /></span></li>';
				    auto_loop_iterations = 0;
				    zoom_level = default_zoom;
                }
			} else {
				markersCollection = Array();
				json = transport.responseText.evalJSON(true);
				document.getElementById('nfarmacias').innerHTML = json.lista.length;
				for (var i=0; i<json.lista.length; i++)  {
					f = json.lista[i];
					s += "<li><a id='fsel" + i + "' href='javascript:void(0);' onclick='farmSelect(" + i + ")' class='" + f.classe + "'>" + 
                         f.name + 
                         // " <span>[" + f.distance + " Km]</span>" +
                         "<p>" +
                         f.street + ", " + 
                         f.zipcode + " " + 
                         f.parish + 
                         "</p></a></li>";
                         
                    // Adicionamos um marker ao mapa com a localização da farmácia
                    var fmarker = new SAPO.Maps.Marker(new OpenLayers.LonLat(f.lon,f.lat), {draggable:true},
            				        {
		                                markerImage:'http://imgs.sapo.pt/farmacias2010/img/' + json.lista[i].marker,
//        				                markerImage:'img/pharmacy.png',
				                        markerAnchor: new OpenLayers.Pixel(-16, -32),size: new OpenLayers.Size(32, 32)
                				    }
    		            		);

					fmarker.jsonid = i;
				    map.addOverlay(fmarker);
				    fmarker.registerEvent('click', this, farmPointPopup );
				    
				    // Guardamos todos os markers num array para mais tarde podermos remover tudo
				    markersCollection.push(fmarker);
				}
			}
            // Sucesso. Mostrar a lista de resultados
			document.getElementById('resultados').innerHTML='<ul>'+s+'</ul>';
			// resetMap();

		}
	});

}

function farmPointPopup(m) {

	id = m.jsonid;
//	m.openPopup(json.lista[id].name+'<p>'+json.lista[id].street+'<br />'+json.lista[id].zipcode+' '+json.lista[id].parish+'</p>'+
//         '<p><span class="botaoPeq"><input onclick="getItinerary('+id+')" name="input" type="button" value="Itinerário" class="fundoBranco" /></span></p>');

	farmSelect(id);
}
 
/* *****************************************
   * getItinerary(id)
   * 
   * Pede o itinerario ao SAPO Mapas
   * Quando estiver calculado, e' chamada
   * a funcao showItinerary
   * input: o objecto de itinerario do mapa
   ***************************************** */

function getItinerary(id) {
    itinerarioFarmacia = new SAPO.Maps.Directions(map);
    itinerarioFarmacia.registerEvent('completed', this, showItinerary);
    itinerarioFarmacia.getDirections(new OpenLayers.LonLat(lon, lat), 
                                     new OpenLayers.LonLat(json.lista[id].lon, json.lista[id].lat),
                                     {mode:'fastest'});
}

/* *****************************************
   * showItinerary(it)
   * 
   * Mostra o itinerario no mapa e na zona
   * inferior com a navegacao passo-a-passo
   * input: o objecto de itinerario do mapa
   ***************************************** */

function showItinerary(it) {
    var itinerarioRota = it.getRoute();
    // s = 'Distância: ' + itinerarioRota.getDistance() + "<br />";
    // s += "Tempo: " + itinerarioRota.getDuration() + "<br /><br />";
    s = it.getSummaryHTML();
    document.getElementById('itinerario').innerHTML = s.innerHTML;
    document.getElementById('itinerario').style.display='block';
}


/* *****************************************
   * showHideLegenda(void)
   * 
   * Mostra ou esconde a legenda com o 
   * tipo de farmacias. A accao e' automatica
   * consoante o estado do style.display
   ***************************************** */

function showHideLegenda() {
	if(document.getElementById('legenda').style.display == "block") {
		document.getElementById('legenda').style.display = "none";
//		document.getElementById('resultados').setAttribute("class", "resultadosPeq resultadosPeqBIG");
		document.getElementById('verlegendabutton').value = "Ver legenda";		
    } else {
//		document.getElementById('resultados').setAttribute("class", "resultadosPeq resultadosPeqSMALL");
		document.getElementById('legenda').style.display = "block";
		document.getElementById('verlegendabutton').value = "Esconder legenda";		
		
	}
}

/* *****************************************
   * removeBad(strTemp)
   * 
   * Filtro de XSS
   * input: strTemp contem a string a limpar
   ***************************************** */

function removeBad(strTemp) { 
    strTemp = strTemp.replace(/\<|\>|\"|\'|\%|\;|\(|\)|\&|\+|\-/g,""); 
    return strTemp;
} 


/* *****************************************
   * getLastUsed(void)
   * 
   * Procura obter o cookie com os dados da
   * ultima utilizacao para preenchimento automatico
   ***************************************** */

function getLastUsed() {
	var lastLat = getCookie("MapPositionLat");
	var lastLon = getCookie("MapPositionLon");
	
	if( (typeof lastLat == "string") && (typeof lastLon == "string") ) {
		top.location = "mapa.php?lat="+lastLat+"&lon="+lastLon+"&type=farm24h";
	}
} 


/* *****************************************
   * clearLastUsed(void)
   * 
   * Limpa o cookie da última localização
   ***************************************** */

function clearLastUsed() {
		document.cookie = "MapPositionLat= ;expires=Thu, 01-Jan-1970 00:00:01 GMT";
		document.cookie = "MapPositionLon= ;expires=Thu, 01-Jan-1970 00:00:01 GMT";
} 

/* *****************************************
   * skipCP(void)
   * 
   * Faz saltar o focus para a segunda parte
   * do código postal automaticamente
   ***************************************** */

function skipCP() {
	var cod4 = document.getElementById('cod4').value;
	
	if( (cod4 >= 1000) && (cod4 <= 9999) )  {
		document.getElementById('cod3').focus();
	} else {
		return false;
	}
}

/* *****************************************
   * getCookie(name)
   * 
   * Função genérica de getcookie
   * input: name = cookie a obter
   ***************************************** */

function getCookie(c_name) {
	if (document.cookie.length>0) {
		c_start=document.cookie.indexOf(c_name + "=");
		if (c_start!=-1) {
		    c_start=c_start + c_name.length+1;
			c_end=document.cookie.indexOf(";",c_start);
			if (c_end==-1) {
					c_end=document.cookie.length;
			}
	 	   return unescape(document.cookie.substring(c_start,c_end));
		}
	}
	return 0;
}

/* *****************************************
   * checkEnter(evento)
   * 
   * Função genérica para detectar o keypress
   * do enter num campo
   * input: event = evento a escutar
   ***************************************** */

function checkEnter(e) {
	if(e.keyCode == 13) {
		getResults();
	}

}

