/*
 
 */

function Mapa(google, div, localização, info, infoText, zoom) {
   this.google = google; // <!-- ! cada instância desta class tem de ter uma referência a livraria (API) da Google para poder instanciar as suas classes -->
   Mapa.google = google; // <!-- para que nos métodos estáticos haja google -->
   this.div = div;
   this.localização = localização; // um [lat,lng] Array para fazer um google.maps.LatLng em mostrar()
   this.info = info; // String
   this.infoText = infoText;
   this.zoom = zoom; // int
   this.mapa; // o mapa efectivo
}

Mapa.prototype.mostrar = function() {
   var mapa = null;
   if (this.mapa == null) {
      // preparar o elemento no qual vamos incluir o mapa
      var dimensão = window.ecrã.dimensão.diminuir(0.66); // window.ecrã foi definido em esboço.jsp
      with (this.div.style) {
         top = (window.ecrã.dimensão.altura - dimensão.altura) / 2;
         left = (window.ecrã.dimensão.largura - dimensão.largura) / 2;
         width = dimensão.largura; // iguais às da mapa google (GMap2)
         height = dimensão.altura;
      }
      // o mapa
      mapa = new this.google.maps.Map2(this.div.firstChild, {size: new this.google.maps.Size(dimensão.largura, dimensão.altura)});
      // o centro da Carrapateira no mapa // desde 20110126
      var carrapateira = new this.google.maps.LatLng(37.183627, -8.895381);
      var ícone = new this.google.maps.Icon(this.google.maps.DEFAULT_ICON, "/img/google-maps.png"); // <!-- copia e adapta -->
      var logótipo = new this.google.maps.Marker(carrapateira, {icon: ícone, title: "Carrapateira"});
      logótipo.bindInfoWindowHtml("Carrapateira");
      mapa.addOverlay(logótipo);
      // o estabelecimento
      var estabelecimento = new this.google.maps.LatLng(this.localização[0], this.localização[1]);
      // calcular a distância
      var distância = estabelecimento.distanceFrom(carrapateira); // em metros
      var tempo = (Math.floor(distância / 100)) / 10; // velocidade média do carro 60km/h ==> 1km/min
      tempo = tempo > 1 ? Math.floor(tempo) : tempo;
      var info = this.info + " · " + tempo + " " + this.infoText;
      var marcador = new this.google.maps.Marker(estabelecimento, {title: info});
      marcador.bindInfoWindowHtml(info); // para que possa abrir várias vezes
      marcador.openInfoWindowHtml(info); // bind --> open em 20110127
      mapa.addOverlay(marcador);
      // calcular o centro entre (o centro da) Carrapateira e o estabelecimento; também adaptar o zoom a isso se necessário
      var rectângulo = Mapa.calcularRectângulo(estabelecimento, carrapateira);
      mapa.setCenter(rectângulo.getCenter(), this.zoom); // tem de ser feito antes de outras interações com o mapa
      Mapa.optimalizarZoom(rectângulo, mapa);
      mapa.setUIToDefault();
      // os anúncios
      var opções = {style: this.google.maps.ADSMANAGER_STYLE_ADUNIT, channel: "7561940933"}; // critério do mapa do Google; era: channel: "5509907591" (channel==critério) style é obrigatório - se não, não aparecem os anúncios
      var anúncios = new this.google.maps.AdsManager(mapa, "pub-7756324894945044", opções);
      anúncios.enable();
      this.mapa = mapa; // guardar
   }
   window.ecrã.mostrar(this.div);
}

// <!-- STATIC -->
Mapa.optimalizarZoom = function(rectângulo, mapa) {
   var zoom = mapa.getBoundsZoomLevel(rectângulo);
   if (zoom < mapa.getZoom())
      mapa.setZoom(zoom - 1); // <!-- desde 20110203; diminuimos com 1 para acertar a visibilidade dos dois marcadores (o mapa automaticamente mexe quando abrir o infowindow) -->
}

// <!-- STATIC -->
Mapa.calcularRectângulo = function(coordenada_1, coordenada_2) {
   var maisOeste = coordenada_1.lng() < coordenada_2.lng();
   var sudoeste = maisOeste ? coordenada_1 : coordenada_2;
   var nordeste = maisOeste ? coordenada_2 : coordenada_1;
   var rectângulo = new Mapa.google.maps.LatLngBounds(sudoeste, nordeste);
   return rectângulo;
}

Mapa.prototype.fechar = function() {
   window.ecrã.esconder(this.div);
}

Mapa.prototype.toString = function() {
   return this.localização.toString();
}
