/// <reference path="jquery-1.2.6-vsdoc.js"/>
/// <reference path="google.maps-vsdoc.js" />
var venues = {};

function getPosition(point) {
  return new google.maps.LatLng(point.x, point.y);
}

function getBounds(points) {
  var max = [0, 0];
  var min = [180, 180];

  for (var i = 0; i < points.length; i++) {
    var point = points[i];
    if (point.x == 0 || point.y == 0) continue;
    max[0] = point.x > max[0] ? point.x : max[0];
    max[1] = point.y > max[1] ? point.y : max[1];
    min[0] = point.x < min[0] ? point.x : min[0];
    min[1] = point.y < min[1] ? point.y : min[1];
  }
  
  var sw = getPosition({ 'x': max[0], 'y': min[1] });
  var ne = getPosition({ 'x': min[0], 'y': max[1] });
  var bounds = new google.maps.LatLngBounds(sw, ne);

  return bounds;
}

function getBubbles() {
  var points = new Array();

  $('.vcard').each(function() {
    var hcard = $(this);
    var nr = hcard.find('.num').text();
    var html = '<div class="vcard">' + hcard.html() + '</div>';
    var id = this.id;
    var latitude = hcard.find('.geo .latitude');
    var longitude = hcard.find('.geo .longitude');

    if (latitude.length > 0 && longitude.length > 0) {
      points.push({
        'x': latitude[0].title * 1,
        'y': longitude[0].title * 1,
        'html': html,
        'id': id,
        'nr': nr
      });
    }
  });
  
  return points;
}

var lastActive;
function createMarkerClickHandler(map, marker, text, itemId) {
  return function(e) {
    if ($(e.target).is('a')) return true;
    var point = map.fromLatLngToDivPixel(marker.getPoint());
    point.x += 120; point.y -= 64;
    map.panTo(map.fromDivPixelToLatLng(point));
    map.addOverlay(new twareg.trop.Bubble(marker, text));
    if (lastActive) lastActive.removeClass('selected');
    lastActive = $('#' + itemId).addClass('selected');
    $('.results').scrollTo(lastActive, 300, {});
    window.location.hash = itemId;
    return false;
  };
}

$(function() {
  var map = new google.maps.Map2(document.getElementById('map'));
  var bubbles = getBubbles();
  var bounds = getBounds(bubbles);
  map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
  map.addControl(new google.maps.LargeMapControl3D);
  map.addControl(new google.maps.ScaleControl);
  map.enableScrollWheelZoom();

  for (var i = 0; i < bubbles.length; i++) {
    var point = bubbles[i];
    var marker = new twareg.trop.Marker(getPosition(point), { label: point.nr })
    var handler = createMarkerClickHandler(map, marker, point.html, point.id);
    var number = $('#' + point.id).addClass('clickable');

    google.maps.Event.addListener(marker, 'click', handler);
    number.click(handler);

    map.addOverlay(marker);
  }
});
