/*************************************************************************
 * Mapping functions
 *
 * @package BMW Finder
 * @author  Alexander Pisculla <api@active-value.de>
 * @version 1.1, 2006-12-08
 * @version 1.2, 2007-01-23 by Andreas Percher
 */

  var ignoreNextMapChange = false;
  var fixZoomLevel = false;
  var suchUrlParms = null; // keine zusätzliche Sucheinschränkung

  var carSearchLevel = 0; // Händler finden=0, Autos finden=1

  // create marker on map
  function createMarker(placemark)  {
    // alert("mapaction.createMarker("+placemark+")");

    // extract data from placemark
    var point = placemark.getElementsByTagName("Point")[0];
    var coords = point.getElementsByTagName("coordinates")[0].childNodes[0].nodeValue;
    coords = coords.split(",");
    point = new GLatLng(parseFloat(coords[0]), parseFloat(coords[1]), 0);

    // var status = 0;
    // if (placemark.getElementsByTagName("status")[0])
    //   status = placemark.getElementsByTagName("status")[0].childNodes[0].nodeValue;

    // alert(placemark.getElementsByTagName("name")[0].childNodes[0].nodeValue
    //      + " : "+coords[0]+","+coords[1]);

    // default icon
    var icon = null;
    var hoticon = null;

    var showLevel = 0;
    var carcnt = 0;
    if (placemark.getElementsByTagName("show")[0])
      showLevel = getPlacemarkIntValue(placemark,"show");

    if (placemark.getElementsByTagName("carcnt")[0])
      carcnt = getPlacemarkIntValue(placemark,"carcnt");

    // alert(getPlacemarkStringValue(placemark,"name") + "\r\nShowLevel "+showLevel+"\r\nCarCnt "+carcnt+"\r\ncarSearchLevel "+carSearchLevel);

    // (03.07.2007 AP)
    // Wenn wir Fahrzeuge suchen dann alle ausgrayen,
    // die nichts passendes haben
    if (carSearchLevel>0 && carcnt<1)
      return null; // showLevel=0;

    icon = new GIcon();

    // mouseover icon
    hoticon = new GIcon();

    // (06.07.2007 AP)
    // Immer das "bubbeln" ermöglichen.
    if (showLevel>1) {  // Kunde ?
      /*
      icon.image = "media/img/marker_bmw_k_hot.png";
      icon.mozPrintImage = "media/img/marker_bmw_hot.png";
      icon.printImage = "media/img/marker_bmw_print.gif";
      icon.iconSize = new GSize(43, 46);
      icon.iconAnchor = new GPoint(2, 42);
      icon.infoWindowAnchor = new GPoint(20, 20);
      */
      icon.image = "media/img/zeigerNeu.png";
      icon.mozPrintImage = "media/img/zeigerNeu.png";
      icon.printImage = "media/img/zeigerNeu.png";
      icon.iconSize = new GSize(38, 42);
      icon.iconAnchor = new GPoint(2, 31);
      icon.infoWindowAnchor = new GPoint(20, 20);

      hoticon = icon;
    } else {
      /*
      icon.image = "media/img/marker_bmw_k_hot75.png";
      icon.mozPrintImage = "media/img/marker_bmw_hot75.png";
      icon.printImage = "media/img/marker_bmw_print.gif";
      icon.iconSize = new GSize(43, 46);
      icon.iconAnchor = new GPoint(2, 42);
      icon.infoWindowAnchor = new GPoint(20, 20);
      */
      icon.image = "media/img/zeigerNeu50.png";
      icon.mozPrintImage = "media/img/zeigerNeu75.png";
      icon.printImage = "media/img/zeigerNeu75.png";
      icon.iconSize = new GSize(38, 42);
      icon.iconAnchor = new GPoint(2, 31);
      icon.infoWindowAnchor = new GPoint(20, 20);

      hoticon = icon;
    }

    var marker = new GMarker( point, icon );
    var markerHot = new GMarker( point, hoticon );

    // (06.07.2007 AP)
    // Immer das "bubbeln" ermöglichen.
    if (showLevel>0) {  // Kunde oder nicht Autos suchen
      // mouseover action
      GEvent.addListener(marker,"mouseover", function()
      {
        map.removeOverlay(marker);
        map.addOverlay(markerHot);

        // (26.09.2007 AP)
        // ignoreNextMapChange = true;
        // map.openInfoWindowHtml(point,infoContent,{pixelOffset: new GSize(-3,6)});
      });

      // mouseout action
      GEvent.addListener(markerHot,"mouseout", function()
      {
        map.removeOverlay(markerHot);
        map.addOverlay(marker);
      });

      // click action (AP) if needed
      var infoContent = getInfoHTML(placemark,markerHot.getPoint());
      GEvent.addListener(markerHot,"click", function() {
        ignoreNextMapChange = true;
        map.openInfoWindowHtml(point,infoContent,{pixelOffset: new GSize(-3,6)});
      });
    }
    return marker;
  }

  function KMLNSResolver(prefix)  {
    if (prefix == 'kml') return "http://earth.google.com/kml/2.0";
    return null;
  }

  //Represents a KML feed. Used internally by KMLHandler.
  function KMLFeed(map, url)   {
    this.map = map;
    this.url = url;
    this.overlays = new Array();
    this.request = undefined;

    this.handleEvent = function()   {
      //Request completed?
      if (this.request.readyState == 4)
      {
        this.overlays = new Array();
        this.map.clearOverlays();

        // alert("Daten empfangen: "+this.request.responseXML);

        // if zoom level is unset, declare bounds
        var zoombounds = new GLatLngBounds();

        // Populate with elements in the updated feed
        var doc = this.request.responseXML;
        if( doc != null && doc.documentElement != null )
        {
          placemarks = doc.documentElement.getElementsByTagName("Placemark");

          // alert("Anzahl Daten empfangen: "+placemarks.length);

          // die gefundenen Firmen in die Liste eintragen
          // und in der Karte anzeigen
          clearFirmenliste();
          for (var i = 0; i < placemarks.length; i++)
          {
            addFirmenliste(placemarks[i]);
            var marker = createMarker(placemarks[i]);
            if (marker!=null)
              map.addOverlay(marker);
            this.overlays.push(marker);
          }

          // if only one placemark found, center it
          if (placemarks.length == 1) {
            var point = placemarks[0].getElementsByTagName("Point")[0];
            map.setCenter(point, 10);
            GEvent.trigger(marker,"click");
          }
          /*
          if (placemarks.length == 0)   {
            alert("Im aktuellen Kartenausschnitt
          }
          */
        }
        //Free the request object
        this.request = undefined;
      }
    }

    //Triggers whenever the map is moved or zoomed.
    //Also manually invoked when the feed is first created to initially populate
    //the feed.
    this.onMapChange = function()   {
      if (ignoreNextMapChange)  {
        ignoreNextMapChange = false;
        return;
      }
      // Trigger fetching the new map
      if (this.request != undefined) {
        this.request.abort();
      }

      url = this.url;
      bounds = map.getBounds();

      // add geo coordinates
      if (url.indexOf("?") == -1)
        url += "?";
      else
        url += "&";

      url += "BBOX=" + bounds.getSouthWest().lng()
            + "," + bounds.getSouthWest().lat() + ","
            + bounds.getNorthEast().lng() + "," + bounds.getNorthEast().lat()
            +"&carsrch="+carSearchLevel;

      if (suchUrlParms==null)
        url = url + getUrlParameters();
      else
        url+=suchUrlParms;

      // alert(url.replace("?","\r\n").replace("&","\r\n").replace("&","\r\n").replace("&","\r\n").replace("&","\r\n").replace("&","\r\n"));
      //window.prompt("KML-URL", url);

      this.request = GXmlHttp.create();
      var thisObject = this;
      this.request.onreadystatechange = function () { thisObject.handleEvent(); }
      this.request.open('GET', url, true);

      this.request.send(null);
    }

    this.destroy = function()
    {
      GEvent.removeListener(this.moveendListener);
      for(var i in this.overlays) this.overlays[i].destroy();
    }

    // Fetch the feed for the first time
    this.onMapChange();

    // Add event handlers
    var thisObject = this;
    this.moveendListener = GEvent.addListener(map, 'moveend', function () { thisObject.onMapChange(); } );
  }

  //A KMLHandler handles (fetching, updating) KML feeds for a map
  function KMLHandler(map)
  {
    this.map = map;
    this.feeds = [];

    this.addFeed = function(url)
    {
      //Add the feed to the feeds array
      this.feeds[url] = new KMLFeed(this.map, url);
    }

    this.removeFeed = function(url)
    {
      //Remove the feed from the feeds array
      this.feeds[url].destroy();
      delete this.feeds[url];
    }
  }

  // locate address on map
  function showAddress(address,zoom)   {
    geocoder.getLatLng (
      address+',germany',
      function(point)   {
        if (!point) {
              alert(address + " konnte nicht gefunden werden");
        }  else  {
          map.setCenter(point, zoom);
          map.setZoom(zoom);
          // fixZoomLevel = true;
        }
      }
    );
  }

  function zoom(lat,lng)   {
    map.setCenter(new GLatLng(lat,lng),17);
    map.setMapType(G_HYBRID_MAP);
  }

  function refreshMap()   {
    if (zoom==null) zoom=10;
    map.setZoom(zoom);
  }

  // update after form submit
  function doFormUpdate()   {
    carSearchLevel = 1;  // Autos suchen
    var ort = document.sucheauto.plzort.value;
    var zoom = parseInt(document.sucheauto.umkreis.value);
    suchUrlParms = null;
    // alert("Ort: "+ort+"\r\nZoom: "+zoom+"\r\rAutos suchen");
    if (ort.length == 0)  {
      refreshMap(zoom);
      document.sucheauto.plzort.className="itext-err";
    }  else {
      showAddress(ort,zoom);
      document.sucheauto.plzort.className="itext";
    }
    return false;
  }

  // update after form submit
  function doForm2Update()   {
    carSearchLevel = 0;  // Händler suchen
    var ort = document.suchehaendler.plzort.value;
    var zoom = parseInt(document.suchehaendler.umkreis.value);
    suchUrlParms = getHaendlerParameters();
    // alert("Ort: "+ort+"\r\nZoom: "+zoom+"\r\nHändler suchen");
    if (ort.length == 0)  {
      refreshMap(zoom);
      document.suchehaendler.plzort.className="itext-err";
    } else {
      showAddress(ort,zoom);
      document.suchehaendler.plzort.className="itext";
    }
    return false;
  }

  // Haendlersuche verfeinern
  function getHaendlerParameters()
  {
    var hndlrUrlParams = '';
    var temp=null;
    // attach search values
    if (document.suchehaendler!=null) {
      if (document.suchehaendler.name!=null)  {
        temp = document.suchehaendler.name.value;
        temp = temp.replace(/ä/g,'%25');
        temp = temp.replace(/ö/g,'%25');
        temp = temp.replace(/ü/g,'%25');
        temp = temp.replace(/ß/g,'%25');
        temp = temp.replace(/Ä/g,'%25');
        temp = temp.replace(/Ö/g,'%25');
        temp = temp.replace(/Ü/g,'%25');
        // alert("name="+temp);
        if (temp)
          hndlrUrlParams += "&name="+temp;
      }
      if (document.suchehaendler.bmwneuwagen!=null)  {
        temp = document.suchehaendler.bmwneuwagen.checked;
        // alert("bmwneuwagen="+temp);
        if (temp) hndlrUrlParams += "&bmwneuwagen=1";
      }
      if (document.suchehaendler.gebrauchtwagen!=null) {
        temp = document.suchehaendler.gebrauchtwagen.checked;
        if (temp) hndlrUrlParams += "&gebrauchtwagen=1";
      }
      if (document.suchehaendler.bmwservice!=null) {
        temp = document.suchehaendler.bmwservice.checked;
        if (temp) hndlrUrlParams += "&bmwservice=1";
      }
      if (document.suchehaendler.bmwersatzteile!=null) {
        temp = document.suchehaendler.bmwersatzteile.checked;
        if (temp) hndlrUrlParams += "&bmwersatzteile=1";
      }
    }
    // alert(hndlrUrlParams);
    return hndlrUrlParams;
  }

