var map;
var pline;
var geocoder = null;
var marker_obj = Object();
var pline_points = Array();

var GMAP_MAX = '530px';
var GMAP_MIN = '230px';
var GMAP_MAX_TITLE = 'Karte größer darstellen';
var GMAP_MIN_TITLE = 'Karte kleiner darstellen';

var GMAP_LAT =53.13926;
var GMAP_LON =8.21382;
var GMAP_ZLEVEL = 11;

var GMAP_ICON = new GIcon();
    GMAP_ICON.image = "/webservice/parks.gif";
    GMAP_ICON.iconSize = new GSize(20,20);
    GMAP_ICON.iconAnchor = new GPoint(10, 10);
    GMAP_ICON.infoWindowAnchor = new GPoint(10, 10);

$(document).ready(function(){

  $("body").attr("onunload","GUnload();");

  if(GBrowserIsCompatible()) {

    map = new GMap2(document.getElementById("garten_gmaps_main"));
    geocoder = new GClientGeocoder();

    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.addMapType(G_PHYSICAL_MAP);
    map.removeMapType(G_SATELLITE_MAP);

    var point = new GLatLng(GMAP_LAT,GMAP_LON);
    map.setCenter(point,GMAP_ZLEVEL);

  }

});

function updateGmapCats(e) {

  var parks = '';
  var service = '';
  var bounds = new GLatLngBounds();

  if($("a#href_cat_"+e).hasClass("active")) {
    $("a#href_cat_"+e).removeClass("active");
    $("input#href_box_"+e).removeAttr("checked");
  } else {
    $("a#href_cat_"+e).addClass("active");
    $("input#href_box_"+e).attr("checked","checked");
  }

  var akt_height = $("#garten_gmaps_toggle").css("height");
  if(akt_height!=GMAP_MAX) { toggleGmaps('',GMAP_MIN_TITLE); }

  $("div.cat_parks a.active").each(function(){
    parks += $(this).attr("id").split('href_cat_').join('')+',';
  });
  $("div.cat_service a.active").each(function(){
    service += $(this).attr("id").split('href_cat_').join('')+',';
  });

  map.clearOverlays();
  document.getElementById("gmaps_route_select").selectedIndex = 0;

  if(parks!='' || service!='') {
    var request = GXmlHttp.create();
    var res = "/webservice/gmaps_getpoints.php?parks="+parks+"&service="+service;
    request.open("GET", res, true);
    request.onreadystatechange = function(){
      if(request.readyState == 4) {
        var xmlDoc = request.responseXML;
        var markers = xmlDoc.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++){
          var html = markers[i].getAttribute("id");
          var label = markers[i].getAttribute("lab");
          var typ = markers[i].getAttribute("typ");
          if(typ=='geo') {
            var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));    
            if(point){
              bounds = createMarker(point,label,html,bounds);
            }
          } else {
            var address = markers[i].getAttribute("adr");
            bounds = geocodeAddress(address,label,html,bounds);
          }
        }
        centerGmaps(bounds);
      }
    }
    request.send(null);
  }

  return false;
}

function updateGmapRoute(r){

  var bounds = new GLatLngBounds();

  $("div.cat_parks a.active,div.cat_service a.active").each(function(){
    $(this).removeClass("active");
  });
  map.clearOverlays();

  var akt_height = $("#garten_gmaps_toggle").css("height");
  if(akt_height!=GMAP_MAX) {
    toggleGmaps('',GMAP_MIN_TITLE);
  }

  var request = GXmlHttp.create();
  var res = "/webservice/gmaps_getpoints.php?routes="+r;
  request.open("GET", res, true);
  request.onreadystatechange = function(){
    if(request.readyState == 4){
      var xmlDoc = request.responseXML;
      var markers = xmlDoc.documentElement.getElementsByTagName("marker");

      for (var i = 0; i < markers.length; i++){
        var html = markers[i].getAttribute("id");
        var label = markers[i].getAttribute("lab");
        var typ = markers[i].getAttribute("typ");
        if (typ=='geo'){
        var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));    
          if (point){
            bounds = createMarker(point,label,html,bounds);
          }
        }else{
          var address = markers[i].getAttribute("adr");
          bounds = geocodeAddress(address,label,html,bounds);
        }
      }

      var lines = xmlDoc.documentElement.getElementsByTagName("line");
      if(lines.length>0) {
        for (var a=0; a < lines.length; a++) {
          var colour = lines[a].getAttribute("col");
          var width  = parseFloat(lines[a].getAttribute("width"));
          var points = lines[a].getElementsByTagName("point");
          var pts = [];
          var z=0;
          for(var i=0; i<points.length; i++) {
            pts[i] = new GLatLng(parseFloat(points[i].getAttribute("lat")),parseFloat(points[i].getAttribute("lng")));
            bounds.extend(pts[i]);
          }
          var pline = new GPolyline(pts,colour,width);
          map.addOverlay(pline);
        }
      }

      centerGmaps(bounds);
    }
  }
  request.send(null);

}

function createMarker(point,name,id,bounds) {
  var marker = new GMarker(point, GMAP_ICON);
  map.addOverlay(marker);
  bounds.extend(point);
  GEvent.addListener(marker, "click", function(){
    var request = GXmlHttp.create();
    var res = "/webservice/gmaps_getdetails.php?id="+id;
    request.open("GET", res, true);
    request.onreadystatechange = function(){
      var txt=request.responseText;
      if (request.readyState == 4 && txt!=''){
        marker.openInfoWindowHtml(txt);
      }
    }
    request.send(null);
  });
  return bounds;
}

function geocodeAddress(address,label,html,bounds) {
  geocoder.getLatLng( address, function(point) {
    if(!point) {
      return false;
    } else {
      bounds = createMarker(point,label,html,bounds);
      centerGmaps(bounds);
    }
  });
  return bounds;
}

function centerGmaps(bounds){

  var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2;
  var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2;

  if(clat!=0 && clng!=0) {
    map.setCenter(new GLatLng(clat,clng));
    map.setZoom(map.getBoundsZoomLevel(bounds));
  }

}

function toggleGmaps(s,h) {
  if(s==undefined || s=='') { s=GMAP_MAX_TITLE; }
  if(h==undefined || h=='') { h=GMAP_MIN_TITLE; }
  var akt_height = $("#garten_gmaps_toggle").css("height");
  if(akt_height!=GMAP_MAX) {
    $("#garten_gmaps_toggle").animate({height:GMAP_MAX},250);
    $("#garten_gmaps_meta").html(h).attr("title",h);
    $("#garten_gmaps_arrow").attr("title",h);
  } else {
    $("#garten_gmaps_toggle").animate({height:GMAP_MIN},250);
    $("#garten_gmaps_meta").html(s).attr("title",s);
    $("#garten_gmaps_arrow").attr("title",s);
  }
}

