var map = null;
var center_de = new google.maps.LatLng(51.165691, 10.451526000000058);
var states_de = $H({
  "Baden-Wuerttemberg": {"latLng": new google.maps.LatLng(48.6616037, 9.350133599999936), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/BadenWuerttemberg.png"},
  "Bayern": {"latLng": new google.maps.LatLng(48.7904472, 11.497889499999928), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/Bayern.png"},
  "Berlin": {"latLng": new google.maps.LatLng(52.5234051, 13.411399899999992), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/Berlin.png"},
  "Brandenburg": {"latLng": new google.maps.LatLng(52.408418, 12.56249200000002), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/Brandenburg.png"},
  "Bremen": {"latLng": new google.maps.LatLng(53.074981, 8.80708100000004), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/Bremen.png"},
  "Hamburg": {"latLng": new google.maps.LatLng(53.553813, 9.991585999999984), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/Hamburg.png"},
  "Hessen": {"latLng": new google.maps.LatLng(50.6520515, 9.162437599999976), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/Hessen.png"},
  "Mecklenburg-Vorpommern": {"latLng": new google.maps.LatLng(53.6126505, 12.42959529999996), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/MecklenburgVorpommern.png"},
  "Niedersachsen": {"latLng": new google.maps.LatLng(52.6367036, 9.845076500000005), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/Niedersachsen.png"},
  "Nordrhein-Westfalen": {"latLng": new google.maps.LatLng(51.43323669999999, 7.6615937999999915), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/NordrheinWestfalen.png"},
  "Rheinland-Pfalz": {"latLng": new google.maps.LatLng(50.118346, 7.308952699999963), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/RheinlandPfalz.png"},
  "Saarland": {"latLng": new google.maps.LatLng(49.3964234, 7.022960699999999), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/Saarland.png"},
  "Sachsen": {"latLng": new google.maps.LatLng(51.1045407, 13.201738400000067), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/Sachsen.png"},
  "Sachsen-Anhalt": {"latLng": new google.maps.LatLng(51.9502649, 11.692273500000056), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/SachsenAnhalt.png"},
  "Schleswig-Holstein": {"latLng": new google.maps.LatLng(54.21936720000001, 9.696116699999948), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/SchleswigHolstein.png"},
  "Thueringen": {"latLng": new google.maps.LatLng(51.0109892, 10.845346000000063), "icon": "http://data.bvcd.de/frontend/include/images/flaggen/Thueringen.png"}
});
var states_marker = [];
var markers = [];
var markerCluster = null;
var markersHidden = true;
var curInfowindow = null;
var infoTemplate = new Template("<img src='#{thumb}' alt='#{name}' style='float:right;' /><div style='width: 400px;font-size:12px;font-family:Helvetica, Arial, Sans-Serif;'><strong>#{name}</strong><div>#{de}</div><div><a href='?service=camping_details&amp;camping_id=#{camping_id}'>Campingplatz &ouml;ffnen</a></div></div>");

/**
 * Erstellt die Map und generiert die einzelnen Marker für die Bundesl&auml;nder sowie die Campingpl&auml;tze
 */
function initializeMap() {
  if (!map) { //Map nur initialisieren, wenn nicht schon geschehen
    geocoder = new google.maps.Geocoder();
    var myOptions = {
      zoom: 5,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    centerMap(center_de, 5);
    addStatesMarker();

    // Die Campingpl&auml;tze für den MarkerCluster vorbereiten
    camp_coords.each(function(camp_data) {
      var image = new google.maps.MarkerImage(
          'http://data.bvcd.de/frontend/include/images/camping.png',
          new google.maps.Size(32, 37));
      var latLng = new google.maps.LatLng(camp_data.lat, camp_data.lng);
      var marker = new google.maps.Marker({
        position: latLng,
        icon: image,
        title: camp_data.name
      });
      var infodata = camp_data;
      infodata.de = infodata.de.unescapeHTML().truncate(200);
      var infowindow = new google.maps.InfoWindow({
        content: infoTemplate.evaluate(infodata)
      });
      marker.camp_data = camp_data;
      marker.infowindow = infowindow;
      //Wenn auf einen Marker geklickt wird Detailseite aufrufen
      google.maps.event.addListener(marker, 'click', function() {
        if (curInfowindow) {
          curInfowindow.close();
        }
        marker.infowindow.open(map, marker);
        curInfowindow = marker.infowindow;
        //alert(this.camp_data.name + " ?service=camping_details&camping_id=" + this.camp_data.camping_id);
      });
      //Marker in Array speichern
      markers.push(marker);
    });
    markerCluster = new MarkerClusterer(map, [], {'maxZoom':9, 'gridSize':60, 'averageCenter':true, 'ignoreHidden':true, 'calculator':CaraworldMarkerClusterCalculator, 'imagePath':"http://data.bvcd.de/frontend/include/images/cluster/", 'imageExtension':"png",'imageSizes':[40,37]});
    google.maps.event.addListener(markerCluster, 'clusteringend', updateCampList);
    //Marker entsprechend der Zoomstufe ein oder ausblenden
    google.maps.event.addListener(map, 'zoom_changed', function() {
      if (this.getZoom() < 7) {
        showStatesMarker();
        hideMarkers();
      } else {
        hideStatesMarker();
        showMarkers();
      }
    });
  } else {
    //alert("map already here");
  }
}

function CaraworldMarkerClusterCalculator(markers, numStyles) {
  var count = markers.length;
  var zoom = map.getZoom();
  return {
    text: count,
    index: 1
  }
}
/**
 * Rendert die Daten aus dem Pagination Objekt.
 */
PaginationRenderer.prototype.render = function(dataObject) {
  var headTemplate = new Template("<div class='list_head'>Es wurden <strong>#{count}</strong> Campingpl&auml;tze gefunden.</div>");
  var messageTemplate = new Template("<div class='no_list_message'>Bitte w&auml;hlen Sie eines der Bundeslander aus oder zoomen Sie weiter in die Karte hinein, um eine Liste der gefundenen Campingpl&auml;tze zu erhalten!</div>");
  var statusTemplate = new Template("Seite #{page} von #{count}");
  var paginationTemplate = new Template("<div class='pagination'><a href='' class='first'>Anfang</a><a href='' class='prev'>Vorherige Seite</a><span class='status'></span><a href='' class='next'>N&auml;chste Seite</a><a href='' class='last'>Ende</a></div>");
  var itemTemplate = new Template("<table cellpadding='2' cellspacing='0' width='100%'><tbody><tr><td class='headlinebox' colspan='2'><a href='?service=camping_details&amp;camping_id=#{camping_id}'>#{name}</a> #{sterne}</td><td id='headlinebox2' style='text-align: right;'><a style='border:0;' href='?service=camping_details&amp;camping_id=#{camping_id}'><img src='http://www.bvcd.de/bvcd/pictures/allgemein/icon_detail.gif' style='border:0;'></a></td></tr><tr><td class='camplistetext' style='border: 0; vertical-align: top; width: 250px;'>#{street}<br>#{postalcode} <b>#{city}</b><br>#{phone}<br>#{fax}<br></td><td class='camplistetext' style='border: 0; vertical-align: top;'>#{de}</td><td class='camplistetext' style='border: 0; width: 125px; text-align: right; vertical-align: bottom;'><img src='#{thumb}' alt='#{name}' /></td></tr></tbody></table><br />");
  var list = [];
  list.push(headTemplate.evaluate({count: dataObject.count}));
  if (dataObject.data && dataObject.data.length > 0) {
    list.push(paginationTemplate.evaluate());
    dataObject.data.each(function(marker) {
      var camp_data = marker.camp_data || marker;
      camp_data.de = camp_data.de.unescapeHTML().truncate(200);
      camp_data.sterne = "";
      if (camp_data.bvcd_sterne > 0) {
        camp_data.sterne += "(";
        for (var i = 0; i < camp_data.bvcd_sterne; i++) {
          camp_data.sterne += "<img src='http://data.bvcd.de/frontend/include/images/bvcd_stern.gif' />";
        }
        camp_data.sterne += "<a href='http://www.bvcd.de/bvcd/de/klassifizierung/klassifizierung_oeffentlich.php'><small>BVCD-DTV-Sterne</small></a>)";
      }
      list.push(itemTemplate.evaluate(camp_data));
    });
    list.push(paginationTemplate.evaluate());
  } else {
    list.push(messageTemplate.evaluate());
  }
  this.element.innerHTML = list.join("\n");
  var pagination = this.pagination;
  var displayStatus = function() {
    $$(".pagination .status").each(function(el) {el.innerHTML = statusTemplate.evaluate({page:pagination.curPage, count:pagination.numPage})});
  };
  $$(".pagination .first").each(function(link) {
    link.on("click", function(event) {
      pagination.firstPage();
      Event.stop(event);
    });
  });
  $$(".pagination .last").each(function(link) {
    link.on("click", function(event) {
      pagination.lastPage();
      Event.stop(event);
    });
  });
  $$(".pagination .prev").each(function(link) {
    link.on("click", function(event) {
      pagination.previous();
      Event.stop(event);
    });
  });
  $$(".pagination .next").each(function(link) {
    link.on("click", function(event) {
      pagination.next();
      Event.stop(event);
    });
  });
  displayStatus();
}

/**
 * Rendert die Daten aus dem Pagination Objekt.
 */
SimpleSearchPaginationRenderer.prototype.render = function(dataObject) {
  var headTemplate = new Template("<div class='list_head'>Es wurden <strong>#{count}</strong> Campingpl&auml;tze gefunden.</div>");
  var messageTemplate = new Template("<div class='no_list_message'>Bitte w&auml;hlen Sie eines der Bundeslander aus oder zoomen Sie weiter in die Karte hinein, um eine Liste der gefundenen Campingpl&auml;tze zu erhalten!</div>");
  var statusTemplate = new Template("Seite #{page} von #{count}");
  var paginationTemplate = new Template("<div class='pagination'><a href='' class='first'>Anfang</a><a href='' class='prev'>Vorherige Seite</a><span class='status'></span><a href='' class='next'>N&auml;chste Seite</a><a href='' class='last'>Ende</a></div>");
  var itemTemplate = new Template("<table cellpadding='2' cellspacing='0' width='100%'><tbody><tr><td class='headlinebox' colspan='2'><a href='?service=camping_details&amp;camping_id=#{camping_id}'>#{name}</a> #{sterne}</td><td id='headlinebox2' style='text-align: right;'><a style='border:0;' href='?service=camping_details&amp;camping_id=#{camping_id}'><img src='http://www.bvcd.de/bvcd/pictures/allgemein/icon_detail.gif' style='border:0;'></a></td></tr><tr><td class='camplistetext' style='border: 0; vertical-align: top; width: 250px;'>#{street}<br>#{postalcode} <b>#{city}</b><br>#{phone}<br>#{fax}<br></td><td class='camplistetext' style='border: 0; vertical-align: top;'>#{de}</td><td class='camplistetext' style='border: 0; width: 125px; text-align: right; vertical-align: bottom;'><img src='#{thumb}' alt='#{name}' /></td></tr></tbody></table><br />");
  var list = [];
  list.push(headTemplate.evaluate({count: dataObject.count}));
  if (dataObject.data && dataObject.data.length > 0) {
    list.push(paginationTemplate.evaluate());
    dataObject.data.each(function(marker) {
      var camp_data = marker.camp_data || marker;
      camp_data.de = camp_data.de.unescapeHTML().truncate(200);
      camp_data.sterne = "";
      if (camp_data.bvcd_sterne > 0) {
        camp_data.sterne += "(";
        for (var i = 0; i < camp_data.bvcd_sterne; i++) {
          camp_data.sterne += "<img src='http://data.bvcd.de/frontend/include/images/bvcd_stern.gif' />";
        }
        camp_data.sterne += "<a href='http://www.bvcd.de/bvcd/de/klassifizierung/klassifizierung_oeffentlich.php'><small>BVCD-DTV-Sterne</small></a>)";
      }
      list.push(itemTemplate.evaluate(camp_data));
    });
    list.push(paginationTemplate.evaluate());
  } else {
    list.push(messageTemplate.evaluate());
  }
  this.element.innerHTML = list.join("\n");
  var pagination = this.pagination;
  var displayStatus = function() {
    $$(".pagination .status").each(function(el) {el.innerHTML = statusTemplate.evaluate({page:pagination.curPage, count:pagination.numPage})});
  };
  $$(".pagination .first").each(function(link) {
    link.on("click", function(event) {
      pagination.firstPage();
      Event.stop(event);
    });
  });
  $$(".pagination .last").each(function(link) {
    link.on("click", function(event) {
      pagination.lastPage();
      Event.stop(event);
    });
  });
  $$(".pagination .prev").each(function(link) {
    link.on("click", function(event) {
      pagination.previous();
      Event.stop(event);
    });
  });
  $$(".pagination .next").each(function(link) {
    link.on("click", function(event) {
      pagination.next();
      Event.stop(event);
    });
  });
  displayStatus();
}


function updateCampList () {
  var markers = markerCluster.getVisibleMarkers();
  var cont = $("serviceContent");
  var renderer = new PaginationRenderer(cont);
  var pagination = new Pagination(markers, renderer);
}

function addStatesMarker() {
  states_de.each(function(state_data) {
     addStateMarker(state_data.key, "Deutschland", state_data.value.latLng, state_data.value.icon);
  });
}

function hideStatesMarker() {
  states_marker.each(function(marker) {
    marker.setVisible(false);
  });
}

function showStatesMarker() {
  states_marker.each(function(marker) {
    marker.setVisible(true);
  });
}

function hideMarkers() {
  if (markersHidden == false) {
    markerCluster.removeMarkers(markers);
    markersHidden = true;
  }
}

function showMarkers() {
  if (markersHidden == true) {
    markerCluster.addMarkers(markers);
    markersHidden = false;
  }
}

function centerMap(position, zoom) {
  map.setCenter(position);
  map.setZoom(zoom);
}

function addStateMarker(state, country, position, icon) {
  var marker = new google.maps.Marker({
      map: map, 
      position: position,
      icon: icon,
      shadow: new google.maps.MarkerImage("http://data.bvcd.de/frontend/include/images/flaggen/Schatten.png",
            new google.maps.Size(18, 12),
            new google.maps.Point(0, 0),
            new google.maps.Point(7, 10))
  });
  var tooltip = new Tooltip(marker, state, 20);
  marker.tooltip = tooltip;
  tooltip.setMap(map);
  google.maps.event.addListener(marker, 'mouseover', function() {
    this.tooltip.show();
  });
  google.maps.event.addListener(marker, 'mouseout', function() {
    this.tooltip.hide();
  });
  google.maps.event.addListener(marker, 'click', function() {
    centerMap(this.position, 7);
    hideStatesMarker();
  });
  states_marker.push(marker);
}

/**
 * Gibt alle gerade sichbaren Marker und alle Marker aus den gerade
 * sichtbaren Clustern wieder.
 */
MarkerClusterer.prototype.getVisibleMarkers = function () {
  var i, marker;
  var visibleMarkers = [];
  var cMarkerClusterer = this;
  if (!this.ready_) {
    return;
  }

  // Get our current map view bounds.
  // Create a new bounds object so we don't affect the map.
  var mapBounds = new google.maps.LatLngBounds(
        this.getMap().getBounds().getSouthWest(),
        this.getMap().getBounds().getNorthEast()
      );
  var bounds = mapBounds;

  for (i = 0; i < this.markers_.length; i++) {
    marker = this.markers_[i];
    if (marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {
      visibleMarkers.push(marker);
    }
  }
  return visibleMarkers;
};


