function highlight(id, familia) {
  if ($('top_'+id)) {
    $('top_'+id).setStyle({ backgroundColor: '#f7efd3' });
  } 
}

function normal(id, familia, bocadilloOpenForId) {
  if (bocadilloOpenForId==0 || id!=bocadilloOpenForId) {
    if ($('top_'+id)) {
      $('top_'+id).setStyle({ backgroundColor: '' });
    }
  }
}

/**
 * myclick.
 * Simula un click en una marcador del mapa desde la minilista.
 */
function myclick(id) {
  if (gmarkers[id]) {
    GEvent.trigger(gmarkers[id], 'click');
  }
}


function guardaViewport(bounds) {
  var sw = bounds.getSouthWest();
  var ne = bounds.getNorthEast();
  $('view').value = 'map';
  $('latso').value = sw.lat();
  $('lonso').value = sw.lng();
  $('latne').value = ne.lat();
  $('lonne').value = ne.lng();

  var centre = bounds.getCenter();
  $('latini').value = centre.lat();
  $('lonini').value = centre.lng();
  $('zini').value = map.getZoom();
  
  // Seleccionem tots els barris, ja que em mogut el viewport del mapa i 
  // no consultem pels barris en moure'l.
  if ($('all_zonas')) {
    if (!$('all_zonas').checked) num_filtros--;
    $('all_zonas').checked = true;
  }
  checkAll('zonas');
  guardarEstadoCheckbox();
  if ($('msFeedback_zonas')) $('msFeedback_zonas').innerHTML = 'Todos';
  if ($('infoFiltroBarrio')) $('infoFiltroBarrio').innerHTML = '';
  if (num_filtros==0 && $('currentFilters')) $('currentFilters').innerHTML = '';
}


/**
* Cargamos el mapa de google por ajax
* en details/view, promocion/details.
*/
function activateMapDetails() {
  var map;
  
  /* Si el div no contiene informacion cargamos por ajax el contenido de google
   * maps. En caso contrario quera decir que el mapa ha sido cargado anteriormente
   */
  GUnload();
  if (GBrowserIsCompatible()) {
    map = new GMap2($('googlemap'));
    map.addControl(new GSmallZoomControl3D());
    map.addControl(new GMenuMapTypeControl());
    //map.setUIToDefault();
    
    map.setCenter(new GLatLng($F('latitud'), $F('longitud')), 12);
    map.enableDoubleClickZoom();
  }
  
  
  var cod = parseInt($F('geocodificado'));
  var point = new GLatLng(parseFloat($F('latitud')),parseFloat($F('longitud')));
  var icontype = $F('icontype');

  map.addOverlay(new GMarker(point, icons[icontype]));
  if (cod == 1) {
    map.setZoom(16); //si el tenim geocodificat apropem al maxim el zoom
  }
  /* Si tenemos la longitud y latitud de la inmobiliaria
   * dibujamos el icono de esta*/
  if ($('latinmo') && $('loninmo')) {

    if (($F('latinmo') != '') && ($F('loninmo') != '')) {
      var pointInmo = new GLatLng(parseFloat($F('latinmo')),parseFloat($F('loninmo')));
      var inmoMarker = new GMarker(pointInmo, {icon: iconInmo, title: $F('nombre_inmo')});

      GEvent.addListener(inmoMarker, 'click', function() {
      var url = 'http://'+server_name+'/ajax/bocadilloInmo/id/'+$F('inmobiliaria_id');
        GDownloadUrl(url, function(data, responseCode) {
          inmoMarker.openInfoWindowHtml(data);
        });
      });
      map.addOverlay(inmoMarker);
    }
  }
}

/**
 * Capa Loading per afegir al Mapa de google.
 * 
 * @param bounds
 * @param text
 * @return
 */
function Loading(bounds, text) {
  this.bounds_ = bounds;
  this.text_ = text;
}

Loading.prototype = new GOverlay();

Loading.prototype.initialize = function(map) {
  var div = document.createElement("div");
  div.style.border = "0";
  div.style.position = "absolute";

  var mida = map.getSize();
  var h = mida.height/2 -15; //15 es la meitat de la imatge de loading

  div.innerHTML = "<img src='http://images.yaencontre.com/indicator_blue.gif' " +
                  " style='margin-top: "+h+"px;' />" +
                  "<p>" + this.text_ + "</p>";

  div.style.textAlign = 'center';
  div.style.backgroundColor = '#FFF';
  div.style.filter = 'alpha(opacity=80)'; //IE
  div.style.opacity = '.8'; //FF

  // Posem el nostre div a la "altura" dels bocadillos, que es la capa mes externa
  map.getPane(G_MAP_FLOAT_PANE).appendChild(div);

  this.map_ = map;
  this.div_ = div;
}

Loading.prototype.remove = function() {
  this.div_.parentNode.removeChild(this.div_);
}

Loading.prototype.redraw = function(force) {
  if (!force) return;
  var c1 = this.map_.fromLatLngToDivPixel(this.bounds_.getSouthWest());
  var c2 = this.map_.fromLatLngToDivPixel(this.bounds_.getNorthEast());

  this.div_.style.width  = Math.abs(c2.x - c1.x) + "px";
  this.div_.style.height = Math.abs(c2.y - c1.y) + "px";
  this.div_.style.left   = Math.min(c2.x, c1.x) + "px";
  this.div_.style.top    = Math.min(c2.y, c1.y) + "px";
}


/**
 * showLoading.
 * Es crea un capa (Overlay en el mapa per a mostrar el indicador de carga.
 * Retorna la capa per a poder usarla / borrarla en el futur.
 */
function showLoading(text) {
  map.closeInfoWindow();
  var bounds = map.getBounds(); // Obtenim dades per a poder centrar el rectangle
  var load = new Loading(bounds, text);
  map.addOverlay(load);
  return load;
}

/**
 * removeLoading.
 * Esborra la capa "cargando" que li pasem per parámetre.
 */
function removeLoading(ovl) {
  map.removeOverlay(ovl);
}

/**
 * insertInmueblesMarkers.
 * Buscar i insertar al mapa (marker manager) els immobles que tenim dins del
 * viewport.
 */
function insertInmuebleMarkers(map, bounds, o, t, load, page, rpp, llegadaxProv) {
  var sw = bounds.getSouthWest();
  var ne = bounds.getNorthEast();
  var url = 'http://' + server_name + '/ajax/markersInmueble' +
            		'?o=' + o + '&t=' + t +
            		'&page=' + page +
            		'&orden=' + $F('orden') + '&orderby=' + $F('orderby') +
		            '&p=' + $F('p') + '&h=' + $F('num_hab') +
		            '&b=' + $F('num_ban') + '&m=' + $F('m') +
		            '&tiempo=' + $F('tiempo') + '&a=' + $F('a') +
		            '&latso=' + sw.lat() + '&lonso=' + sw.lng() +
		            '&latne=' + ne.lat() + '&lonne=' + ne.lng() +
		            '&z=' + map.getZoom();
  
  var f = $('buscar');
  var lista = f.getInputs('checkbox');
  var s = lista.size();

  // Filtres de checkboxs seleccionats
  	// no es miren els barris (checkbox 'zonas_')
  for (var i=0; i<s; i++) {
    var elem = lista[i];
    if (elem.checked) {
      var id = new String(elem.id);
      if ((id.substr(0,5) == 'tipo_') ||  // tipos de inmuebles
    	  (id.substr(0,6) == 'extra_') || // ascensor/garaje/...
    	  (id.substr(0,2) == 'e_') ||     // entornos (zona playa/centro/...)
    	  (id.substr(0,2) == 's_') || 	  // servicios (cerca de bus/metro/...)
    	  (id == 'on') || (id == 'sm') || // Obra Nueva | Segunda Mano
    	  (id == 'bajado') || (id == 'uv') || (id == 'foto')) {
        url += '&' + elem.name + '=' + elem.value;
      }
    }
  }

  new Ajax.Request(url, {
    method: 'get',
    onSuccess: function(transport) {
      xmlMarkers = transport.responseText; // ho guardem en la variable global
      var xml = GXml.parse(xmlMarkers);
      var markers = xml.documentElement.getElementsByTagName('marker');
      
      addInmuebles(map, markers, page, rpp, llegadaxProv);
      updateMinilista(markers, t, page, rpp);
      totalsMapa = markers.length;
      updatePaginador(totalsMapa, t, o, page, rpp);
      
      var totals = xml.documentElement.getElementsByTagName('totals');
      updateTotals(totals, totalsMapa);
      
      removeLoading(load);
    }
  });
}

/**
 * addInmueblesInmo.
 * Inserta marcadors de immobles al mapa del site anunciant.
 */
function addInmueblesInmo(map, markers) {
  
  for (var i = 0; i < markers.length; i++) {
    addMarker(i, markers);
  }
  
}

/**
 * addInmuebles.
 * Inserta marcadors de immobles al mapa.
 */
function addInmuebles(map, markers, page, rpp, llegadaxProv) {

  // Borrar markers antics
  // lletres
  if ((typeof(gmarkers) == "object") && (gmarkers.length > 0)) {
    for (k in gmarkers) { map.removeOverlay(gmarkers[k]); }
  }
  // points
  if ((typeof(gmarkersPoints) == "object") && (gmarkersPoints.length > 0)) {
	for (k in gmarkersPoints) { map.removeOverlay(gmarkersPoints[k]); }
  }
  
  var startIndex = (page - 1) * rpp;
  var finishIndex = startIndex + rpp;
  
  // primer: pintem els punts, de tots els màx. 200 resultats
  for (var i = 0; i < markers.length; i++) {
    addMarker(i, markers);
  }
  
  // segon: pintem les lletres, de la pàg.
  var indexLetter = 0;
  for (var i = startIndex; i < finishIndex; i++) {
	addMarkerLetter(i, markers, indexLetter++, llegadaxProv);
  }
}

function addMarker(i, markers) {

  if (i in markers) {
    var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')),
                            parseFloat(markers[i].getAttribute('lon')));
    var id = markers[i].getAttribute('id');
    map.addOverlay(createMarker(point, id));
  }
}

function addMarkerLetter(i, markers, indexLetter, llegadaxProv) {

  if (i in markers) {
    var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')),
                            parseFloat(markers[i].getAttribute('lon')));
    var id = markers[i].getAttribute('id');
    var letter = String.fromCharCode("A".charCodeAt(0) + indexLetter);
    map.addOverlay(createMarkerLetter(point, id, letter));
    var poblacion = markers[i].getAttribute('poblacion');
    if(llegadaxProv == false){
      if ((i == 0) && (poblacion != null) && (poblacion != '')) {
        if ($('d')) $('d').value = poblacion;
        if ($('donderesults')) $('donderesults').innerHTML = poblacion;
        if ($('f')) $('f').value = '';
      } 
    }
  }
}


/**
 * insertInmosMarkers.
 * Busca les immobiliaries geocodificades dins del viewport i les afegeix
 * com a marcadors al mapa.
 */
function insertInmoMarkers(map, bounds) {
  var sw = bounds.getSouthWest();
  var ne = bounds.getNorthEast();
  var url = 'http://'+server_name+'/ajax/markersInmos' +
            '?latso=' + sw.lat() + '&lonso=' + sw.lng() +
            '&latne=' + ne.lat() + '&lonne=' + ne.lng();
  new Ajax.Request(url, {
    method: 'get',
    onSuccess: function(transport) {
      var xmlInmos = transport.responseText;
      addInmos(map, xmlInmos);
    }
  });
}

/**
 * addInmos.
 * Afegeix al mapa els marcadors de immobiliaries que venen en el XML.
 */
function addInmos(map, xmlInmos) {
  var xml = GXml.parse(xmlInmos);
  var markers = xml.documentElement.getElementsByTagName('marker');
  for (var i = 0; i < markers.length; i++) {
    var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')),
                            parseFloat(markers[i].getAttribute('lon')));
    var id = markers[i].getAttribute('id');
    var nom = markers[i].getAttribute('nom');
    map.addOverlay(createInmoMarker(point, id, nom));
  }
}

/**
 * removeInmos.
 * Elimina els marcadors de immobiliaries del mapa.
 */
function removeInmos(map) {
  if ((typeof(gmarkersInmo) == "object") && (gmarkersInmo.length > 0)) {
    for (i in gmarkersInmo) {
      map.removeOverlay(gmarkersInmo[i]);
    }
  }
  num_inmo = 0;
}


/**
 * updateMap.
 * Actualitza les lletres del mapa segons la pàgina.
 */
function updateMap(map, markers, page, rpp, llegadaxProv) {

  // Borrar markers lletres de la paginació antiga
  if ((typeof(gmarkers) == "object") && (gmarkers.length > 0)) {
    for (k in gmarkers) {
      map.removeOverlay(gmarkers[k]);
    }
  }
  
  var startIndex = (page - 1) * rpp;
  var finishIndex = startIndex + rpp;
  var indexLetter = 0;
  
  for (var i = startIndex; i < finishIndex; i++) {
    addMarkerLetter(i, markers, indexLetter++, llegadaxProv);
  }
}

/**
 * updateTotals.
 * Actualitza els totals de resultats.
 */
function updateTotals(totals, totalsMapa) {

  var num_inm = totals[0].getAttribute('immobles');
  var num_on = totals[0].getAttribute('obranueva');
  var num_sm = totals[0].getAttribute('segundamano');

  numInm = addCommas(num_inm);
  if ($('totalresults')) $('totalresults').innerHTML = numInm; // en títol 'X pisos en <poblacion>
  
  // Info masses resultats
  if (num_inm>200) { // num_inm no conté punts
    if ($('mInfo')) $('mInfo').style.display = "block";
  } else if (numInm<=200) {
    if ($('mInfo')) $('mInfo').style.display = "none";
  }
  if ($('totalresults3')) $('totalresults3').innerHTML = numInm;
  if ($('totalMapa')) $('totalMapa').innerHTML = totalsMapa;

}

/**
 * updatePaginador.
 * Actualitza el paginador amb les pàgines depenent dels resultats.
 */
function updatePaginador(numResults, family_id, op_id, page, rpp) {

  var url = 'http://' + server_name + '/ajax/paginadorMapa' +
            		'?o=' + op_id + '&t=' + family_id +
            		'&page=' + page + '&rpp=' + rpp +
            		'&num=' + numResults;
  
  new Ajax.Request(url, {
    method: 'get',
    onSuccess: function(transport) {
      var html = transport.responseText;
      $('paginador').innerHTML = html;
    }
  });
}

/**
 * updateMinilista.
 * Actualitza la minillista del mapa amb els nous immobles.
 */
function updateMinilista(markers, family_id, page, rpp) {
  
  var minilista = '<table><tbody>';
  var num_inmuebles = markers.length;
  var startIndex = (page - 1) * rpp;
  var finishIndex = startIndex + rpp;
  var indexLetter = 0;
  
  for (var i = 0; i < num_inmuebles; i++) {
    if (i>=startIndex && i<finishIndex) {      
	  minilista += '<tr id="top_' + markers[i].getAttribute('id') + '" ';
	  if ((i%2) != 0) { minilista += 'class="even" '; }
	  minilista += 'onclick="myclick(\'' + markers[i].getAttribute('id') + '\')">';

      var letter = String.fromCharCode("A".charCodeAt(0) + indexLetter);
      minilista += '<td class="tdIcon">';
      minilista += '  <img src="http://images.yaencontre.com/icons/icomap_'+letter+'.gif" alt="'+letter+'" />';
	  minilista += '</td>';
	    
	  minilista += '<td class="tdprecio">';
	  minilista += markers[i].getAttribute('precio') + '</td>';
	
	  minilista += '<td class="tdm2">';
	  if (markers[i].getAttribute('m2') > 0) {
	    minilista += markers[i].getAttribute('m2');
	  } else {
	    minilista += '&nbsp;';
	  }
	  minilista += '</td>';
	
	  minilista += '<td class="tdnum">';
	  if (markers[i].getAttribute('hab') > 0) {
	    minilista += markers[i].getAttribute('hab');
	  } else {
	    minilista += '&nbsp;';
	  }
	  minilista += '</td>';
	  arrPos[markers[i].getAttribute('id')] = i; // enllaç amb la minillista
	  indexLetter++;
    }
  }
  minilista += '</tbody></table>';
  
  $('minilista').innerHTML = minilista;
}


/**
 * Canvia la pàgina dels resultats del mapa, amb els markers ja obtinguts.
 * Pinta els 20 resultats de la pàgina al mapa, a la minillista i actualitza
 * el paginador amb una crida ajax.
 * 
 * @param t
 * @param o
 * @param page
 * @param rpp
 * @return
 */
function changeToPage(t, o, page, rpp, llegadaxProv) {

  var load = showLoading('Cargando...');
  var xml = GXml.parse(xmlMarkers);
  var markers = xml.documentElement.getElementsByTagName('marker');
  updateMinilista(markers, t, page, rpp);
  totalsMapa = markers.length;
  updatePaginador(totalsMapa, t, o, page, rpp);
  updateMap(map, markers, page, rpp, llegadaxProv);
  removeLoading(load);
}


//***************************************//
// Declarar els diferents tipus de icono //
//***************************************//

// Point
var iconPoint = new GIcon();
iconPoint.iconSize = new GSize(9, 9);
iconPoint.iconAnchor = new GPoint(4, 4);
iconPoint.infoWindowAnchor = new GPoint(4, 4);
iconPoint.image = "http://images.yaencontre.com/icons/ico_point.png";

// Icones amb lletres
var iconLetra = new GIcon();
iconLetra.iconSize = new GSize(25, 28);
iconLetra.iconAnchor = new GPoint(12, 28);
iconLetra.infoWindowAnchor = new GPoint(12, 2);


// VIVIENDA
var icon1 = new GIcon();
icon1.iconSize = new GSize(32, 37);
//icon1.shadow = "http://www.google.com/mapfiles/shadow50.png";
//icon1.shadowSize = new GSize(37, 34);
icon1.iconAnchor = new GPoint(16, 37);
icon1.infoWindowAnchor = new GPoint(9, 2);
icon1.infoShadowAnchor = new GPoint(18, 25);
icon1.image = "http://images.yaencontre.com/icons/ico_1_grupo.gif";

var icon1_ind = new GIcon();
icon1_ind.iconSize = new GSize(35, 35);
icon1_ind.iconAnchor = new GPoint(17, 17);
icon1_ind.infoWindowAnchor = new GPoint(17, 2);
icon1_ind.infoShadowAnchor = new GPoint(18, 25);
icon1_ind.image = "http://images.yaencontre.com/icons/ico_1.gif";


// TERRENO
var icon2 = new GIcon();
//icon2.shadow = "http://www.google.com/mapfiles/shadow50.png";
//icon2.shadowSize = new GSize(37, 34);
icon2.iconSize = new GSize(34, 36);
icon2.iconAnchor = new GPoint(17, 36);
icon2.infoWindowAnchor = new GPoint(9, 2);
icon2.infoShadowAnchor = new GPoint(18, 25);
icon2.image = "http://images.yaencontre.com/icons/ico_2_grupo.gif";

var icon2_ind = new GIcon();
icon2_ind.iconSize = new GSize(35, 35);
icon2_ind.iconAnchor = new GPoint(17, 17);
icon2_ind.infoWindowAnchor = new GPoint(17, 2);
icon2_ind.infoShadowAnchor = new GPoint(18, 25);
icon2_ind.image = "http://images.yaencontre.com/icons/ico_2.gif";


// NAVE
var icon3 = new GIcon();
//icon3.shadow = "http://www.google.com/mapfiles/shadow50.png";
//icon3.shadowSize = new GSize(37, 34);
icon3.iconSize = new GSize(36, 38);
icon3.iconAnchor = new GPoint(18, 38);
icon3.infoWindowAnchor = new GPoint(9, 2);
icon3.infoShadowAnchor = new GPoint(18, 25);
icon3.image = "http://images.yaencontre.com/icons/ico_3_grupo.gif";

var icon3_ind = new GIcon();
icon3_ind.iconSize = new GSize(35, 35);
icon3_ind.iconAnchor = new GPoint(17, 17);
icon3_ind.infoWindowAnchor = new GPoint(17, 2);
icon3_ind.infoShadowAnchor = new GPoint(18, 25);
icon3_ind.image = "http://images.yaencontre.com/icons/ico_3.gif";


// LOCAL
var icon4 = new GIcon();
//icon4.shadow = "http://www.google.com/mapfiles/shadow50.png";
//icon4.shadowSize = new GSize(37, 34);
icon4.iconSize = new GSize(33, 34);
icon4.iconAnchor = new GPoint(16, 34);
icon4.infoWindowAnchor = new GPoint(9, 2);
icon4.infoShadowAnchor = new GPoint(18, 25);
icon4.image = "http://images.yaencontre.com/icons/ico_4_grupo.gif";

var icon4_ind = new GIcon();
icon4_ind.iconSize = new GSize(35, 35);
icon4_ind.iconAnchor = new GPoint(17, 17);
icon4_ind.infoWindowAnchor = new GPoint(17, 2);
icon4_ind.infoShadowAnchor = new GPoint(18, 25);
icon4_ind.image = "http://images.yaencontre.com/icons/ico_4.gif";


// EDIFICIO
var icon5 = new GIcon();
//icon5.shadow = "http://www.google.com/mapfiles/shadow50.png";
//icon5.shadowSize = new GSize(37, 34);
icon5.iconSize = new GSize(31, 38);
icon5.iconAnchor = new GPoint(15, 38);
icon5.infoWindowAnchor = new GPoint(9, 2);
icon5.infoShadowAnchor = new GPoint(18, 25);
icon5.image = "http://images.yaencontre.com/icons/ico_5_grupo.gif";

var icon5_ind = new GIcon();
icon5_ind.iconSize = new GSize(35, 35);
icon5_ind.iconAnchor = new GPoint(17, 17);
icon5_ind.infoWindowAnchor = new GPoint(17, 2);
icon5_ind.infoShadowAnchor = new GPoint(18, 25);
icon5_ind.image = "http://images.yaencontre.com/icons/ico_5.gif";


// PARKING
var icon6 = new GIcon();
//icon6.shadow = "http://www.google.com/mapfiles/shadow50.png";
//icon6.shadowSize = new GSize(37, 34);
icon6.iconSize = new GSize(31, 34);
icon6.iconAnchor = new GPoint(15, 34);
icon6.infoWindowAnchor = new GPoint(9, 2);
icon6.infoShadowAnchor = new GPoint(18, 25);
icon6.image = "http://images.yaencontre.com/icons/ico_6_grupo.gif";

var icon6_ind = new GIcon();
icon6_ind.iconSize = new GSize(35, 35);
icon6_ind.iconAnchor = new GPoint(17, 17);
icon6_ind.infoWindowAnchor = new GPoint(17, 2);
icon6_ind.infoShadowAnchor = new GPoint(18, 25);
icon6_ind.image = "http://images.yaencontre.com/icons/ico_6.gif";

var iconPob = new GIcon();
iconPob.iconSize = new GSize(31, 44);
iconPob.iconAnchor = new GPoint(15, 44);
iconPob.infoWindowAnchor = new GPoint(14, 5);
iconPob.infoShadowAnchor = new GPoint(18, 25);
iconPob.image = "http://images.yaencontre.com/icons/ico_poblacion.gif";

var iconInmo = new GIcon();
iconInmo.iconSize = new GSize(31, 28);
iconInmo.iconAnchor = new GPoint(15, 28);
iconInmo.infoWindowAnchor = new GPoint(15, 5);
iconInmo.infoShadowAnchor = new GPoint(18, 25);
iconInmo.image = "http://images.yaencontre.com/icons/ico_inmo_mini.gif";

var iconPromo = new GIcon();
iconPromo.iconSize = new GSize(44, 35);
iconPromo.iconAnchor = new GPoint(15, 44);
iconPromo.infoWindowAnchor = new GPoint(14, 5);
iconPromo.infoShadowAnchor = new GPoint(18, 25);
iconPromo.image = "http://images.yaencontre.com/icons/ico_promo.gif";


// Array de icones segons el tipus de immoble
// usat en activateMapDetails().
var icons = new Array();
icons['icon1'] = icon1_ind;
icons['icon2'] = icon2_ind;
icons['icon3'] = icon3_ind;
icons['icon4'] = icon4_ind;
icons['icon5'] = icon5_ind;
icons['icon6'] = icon6_ind;
icons['icon_promo'] = iconPromo;
icons['icon_anunciante'] = iconInmo;

