// JavaScript Document

function GMap() {
  var beginIcon = new GIcon();
  beginIcon.image = dir + "dot_begin.png";
  beginIcon.iconSize = new GSize(12, 12);
  beginIcon.iconAnchor = new GPoint(6, 6);
  beginIcon.infoWindowAnchor = new GPoint(5, 5);

  var endIcon = new GIcon();
  endIcon.image = dir + "dot_end.png";
  endIcon.iconSize = new GSize(12, 12);
  endIcon.iconAnchor = new GPoint(6, 6);
  endIcon.infoWindowAnchor = new GPoint(5, 5);

  var kmIcon = new GIcon();
  kmIcon.image = dir + "dot_km.png";
  kmIcon.iconSize = new GSize(18, 35);
  kmIcon.iconAnchor = new GPoint(13, 35);
  kmIcon.infoWindowAnchor = new GPoint(5, 5);



  var map;
  
  var pos = [];
  var pos_km = [];
  var polyline;
  var polylineBack;
  
  
  
  /**
   * Erstellt eine neue Karte
   *
   */                    
  this.createMap = function(map_id, lat, lng, zoom, map_type) {
      if (lat == undefined) {lat = 53.5800; }
      if (lng == undefined) { lng =  8.5838; }
      if ((zoom == undefined) || (zoom < 0)) { zoom = 15; }
      
      if (map_type == "satellite") {
        map_type = G_SATELITTE_MAP;
      } else if (map_type == "hybrid") {
        map_type = G_HYBRID_MAP;
      } else {
        map_type = G_NORMAL_MAP;
      }
      
      
      // Map erstellen
      map = new GMap2(document.getElementById(map_id));
      map.setCenter(new GLatLng(lat, lng), zoom, map_type);
      
      // Skala
      map.addControl(new GScaleControl(), 
        new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(8, 40)));
      
      // Zoom
	    map.addControl(new GLargeMapControl());
	    
	    // Map Typen
      map.addControl(new GMapTypeControl());

      return map;          
  }


  this.addPolyline = function(positions) {
    pos = [];
  
    for (var i = 0; i < positions.length; i++) {
      var lat = positions[i][0];
      var lng = positions[i][1];
      
      var point = new GLatLng(lat, lng);
      
      // Punkt zum Polygon hinzufügen
      pos.push(point);
    }

    // Polynom zeigen
    polyline = new GPolyline(pos, "#FF0000", 6);
    polylineBack = new GPolyline(pos, "#FFFFFF", 10); 
    map.addOverlay(polylineBack);        
    map.addOverlay(polyline);
  }
  
  
  this.autoZoom = function() {
    var bounds = new GLatLngBounds();
    
    for (var i = 0; i < pos.length; i++) {
      bounds.extend(pos[i]);
    }
    
    map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
  }
  
  
  this.addBeginEndVertex = function() {
    var marker;

    marker = new GMarker(pos[0], {icon: beginIcon, title: "Start"});
    map.addOverlay(marker);

    marker = new GMarker(pos[pos.length-1], {icon: endIcon, title: "Ziel"});
    map.addOverlay(marker);
  }
  
  
  this.setZoom = function(zoom) {
    if (zoom < 0 && zoom > 15) {
      zoom = 8;
    }
    map.setCenter(map.getCenter(), zoom);
  }
  
  
  this.getKMinfo = function(kminfo_id, prefix) {
    // km Information
    var kminfo = document.getElementById(kminfo_id);
    var marker;

    // km berechnen
    var dist = 0.0; // abstand zweier punkte
    var distance = 0.0;
    var km = 1000;
    var pnt1;
    var pnt2;
    var test = "";
    var x = 0;
    var y = 0;
    var point;

    for (var i = 1; i < pos.length; i++) {
      pnt1 = pos[i-1];
      pnt2 = pos[i];
      dist = pnt1.distanceFrom(pnt2);
      distance += dist;

      
      // km angeben in abstand von 1000m
      while (distance > km) {
        fac = (distance - km) / dist;
        x = pnt2.lat() + ((pnt1.lat() - pnt2.lat()) * fac);
        y = pnt2.lng() + ((pnt1.lng() - pnt2.lng()) * fac);

        point = new GLatLng(x, y);
        marker = new GMarker(point, {icon: kmIcon, title: "km " + (km / 1000)});
        map.addOverlay(marker);

        km += 1000;
      }
    }    
    
    kminfo.innerHTML = prefix + (distance / 1000).toFixed(3) + "km";
    
    return distance / 1000;
  } 
}
