
// Diese sollen als Controils angezeigt werden
var aBuildItems = [];

// Die Variablen für die Clusterer-Objekte
var clustererPaesse;
var clustererOrte;
var clustererHotels;
var clustererUser;
var clustererTermine;

var cur_id = 0;
var request = null;
var cur_lat = null;
var cur_lon = null;
var cur_LocationID = null;
var cur_originating_url = null;

var PAESSE = 0;
var ORTE = 1;
var HOTELS = 2;
var USER = 3;
var TERMINE = 4;
var MIN_ZOOM_FUER_PAESSE= -1;
var MIN_ZOOM_FUER_ORTE = 8;
var MIN_ZOOM_FUER_HOTELS= -1;
var MIN_ZOOM_FUER_USER = -1;
var MIN_ZOOM_FUER_TERMINE= -1;

// Labels für div und Grafiken
var itemsToShowLabel = [];
itemsToShowLabel[PAESSE] = 'paesse';
itemsToShowLabel[ORTE]   = 'orte';
itemsToShowLabel[HOTELS]   = 'hotels';
itemsToShowLabel[USER]   = 'user';
itemsToShowLabel[TERMINE]   = 'termine';
// Texte für die Controls
var itemsToShowText = [];
itemsToShowText[PAESSE] = 'Pässe';
itemsToShowText[ORTE]   = 'Orte';
itemsToShowText[HOTELS]   = 'Hotels';
itemsToShowText[USER]   = 'User';
itemsToShowText[TERMINE]   = 'Termine';
// Wer ist aktiv, wer nicht?
var itemsToShowActive = [];
itemsToShowActive[PAESSE] = false;
itemsToShowActive[ORTE]   = false;
itemsToShowActive[HOTELS]   = false;
itemsToShowActive[USER]   = false;
itemsToShowActive[TERMINE]   = false;
// Arrays mit den Item-IDs, die angezeigt werden 
var itemsToShowID = [];
itemsToShowID[PAESSE] = [];
itemsToShowID[ORTE]   = [];
itemsToShowID[HOTELS]   = [];
itemsToShowID[USER]   = [];
itemsToShowID[TERMINE]   = [];
// assoziatives Arrays mit keys Item-IDs, values null oder 1
var id_is_present = [];
id_is_present[PAESSE] = new Object ();
id_is_present[ORTE]   = new Object ();
id_is_present[HOTELS]   = new Object ();
id_is_present[USER]   = new Object ();
id_is_present[TERMINE]   = new Object ();
// Arrays mit den Items, die angezeigt werden 
var itemsToShow = [];
itemsToShow[PAESSE] = [];
itemsToShow[ORTE]   = [];
itemsToShow[HOTELS]   = [];
itemsToShow[USER]   = [];
itemsToShow[TERMINE]   = [];

// Funktion von Jan, z.Zt. nicht benutzt
/*
function addPass (map, lat, lon, hoehe, PassID, name, icon) {

  var point = new GLatLng(lat, lon);
  var pass = new GMarker(point, {icon: icon, title: name+' (' + hoehe + ' m)'});
  
  // info window nur für den aktuellen Pass. Alle anderen gleich mit Link versehen
  GEvent.addListener(pass, "click", function () {
    self.location = "http://"+window.qd_global_web_home+"Paesse.pl?PassID="+PassID+"&Karte=gm";
    //map.openInfoWindowHtml(point,"<a href=\"http://www.quaeldich.de/Paesse.pl?PassID="+PassID+"\" class=\"plksa\">"+name+"</a><br>"+hoehe+" m");
    });
  return pass;
}
*/

/* Testanzeige in der Karte, z.Zt. nicht benutzt

// A qd_zoom_text is a simple overlay that outlines a lat/lng bounds on the
// map. It has a border of the given weight and color and can optionally
// have a semi-transparent background color.
function qd_zoom_text(lat, lon, PassID, text, opt_color, opt_weight, opt_opacity) {
  this.latlon_ = new GLatLng (lat, lon);
  this.PassID_ = PassID;
  this.text_ = text;
  this.weight_ = opt_weight;
  this.color_ = opt_color || "#376FA6";
}

qd_zoom_text.prototype = new GOverlay();

// Creates the DIV representing this qd_zoom_text.
qd_zoom_text.prototype.initialize = function(map) {
  // Create the DIV representing our qd_zoom_text
  var div = document.createElement("div");
  div.style.position = "absolute";
  div.innerHTML = '';

  // Our qd_zoom_text is flat against the map, so we add our selves to the
  // MAP_PANE pane, which is at the same z-index as the map itself (i.e.,
  // below the marker shadows)
  map.getPane(G_MAP_MAP_PANE).appendChild(div);

  this.map_ = map;
  this.div_ = div;
}

// Remove the main DIV from the map pane
qd_zoom_text.prototype.remove = function() {
  this.div_.parentNode.removeChild(this.div_);
}

// Copy our data to a new qd_zoom_text
qd_zoom_text.prototype.copy = function() {
  return new qd_zoom_text(this.latlon_.lat (), this.latlon_.lon (), this.PassID_, this.text_, this.color_,
                       this.weight_, this.opacity_);
}

// Redraw the qd_zoom_text based on the current projection and zoom level
qd_zoom_text.prototype.redraw = function(force) {
  // We only need to redraw if the coordinate system has changed
  if (!force) return;

  // calculate diagonal of map in meters
  var bounds = this.map_.getBounds();
  var sw = bounds.getSouthWest();
  var ne = bounds.getNorthEast();
  var diag = sw.distanceFrom (ne);
  
  // auto adjust font size
  this.div_.style.fontSize = Math.min (10, Math.round (10 * 90000/+diag))+ "pt";
  this.div_.style.fontWeight = this.weight_;
  this.div_.style.color = this.color_;
  
  
  // set text. set it empty if zoomed out enough
  //this.div_.innerHTML = (diag < 180000?"<nobr>"+this.text_+"</nobr>":'');
  this.div_.innerHTML = (diag < 180000?"<nobr><a href=\"http://"+window.qd_global_web_home+"Paesse.pl?PassID="+this.PassID_+"\" class=\"gm_passlink\">"+this.text_+"</a></nobr>":'');
                            ;//+"<br>"+"w= "+this.div_.clientWidth;//+ "diag = "+ sw.distanceFrom (ne) + " m";
                
  // Calculate the DIV coordinates of two opposite corners of our bounds to
  // get the size and position of our qd_zoom_text
  var c1 = this.map_.fromLatLngToDivPixel(this.latlon_);

  this.div_.style.left = c1.x  - Math.round (this.div_.clientWidth*0.5) + "px";
  this.div_.style.top = c1.y + "px";
}
*/


/* 
  Suche in einem Array
  @param needle
  @param haystack
  @return boolean
*/
function in_array(needle, haystack) {
  if (haystack.length == 0)
    return false;

  for (n = 0; n < haystack.length; n++) {
    if (haystack[n] == needle)
      return true;
  }
  return false;
}
/* 
  Suche im id-Array
  @param needle
  @param haystack
  @return boolean
*/
function in_id_array(needle, id_type) {
  if (id_is_present[id_type]['idmember'+needle]) {
    return true;
  }
  // array is called obnly before insertion
  id_is_present[id_type]['idmember'+needle] = 1
  return false;
}
function update_fullscreen_link () {
  var div = document.getElementById ('qdoverlay_fullscreen');
  if (div) {
    div.innerHTML = fullscreen_link ();
  } 
}
function fullscreen_link () {
  if (cur_originating_url) {
    return '<a href="' + cur_originating_url+ '">zurück</a> ';
  }
  return '<a href="http://' + window.qd_global_web_home + 'karte/' + fullscreen_href() + '" target="_top">vergrößern</a> ';
}
function fullscreen_href () {
  var ret = new Array ();;
  for (var i = 0; i < itemsToShowLabel.length; i++) {
    if (itemsToShowActive[i]) {
      ret.push (itemsToShowLabel[i] + '=1');
    }
  }
  if (cur_lat) 
  ret.push ('lat='+cur_lat);
  if (cur_lon) 
  ret.push ('lon='+cur_lon);
  if (cur_id) 
  ret.push ('id='+cur_id);
  if (cur_LocationID) 
  ret.push ('lid='+cur_LocationID);
  ret.push ('o='+escape(window.location));
  
  
  var ret1 = ret.join ('&');
  if (ret1.length > 0) {
    return '?' + ret1;
  }
  return '';
}
/* 
  Klasse für eigene Controls
  @param type
*/
function QDControl(type) {
}

QDControl.prototype = new GControl();

QDControl.prototype.initialize = function(map) {
  var controlContainer = document.createElement("div");

  for (i = 0; i < itemsToShowLabel.length; i++) {
    if (in_array(i, aBuildItems)) {
      var qdoverlaydiv = document.createElement("div");
      qdoverlaydiv.setAttribute('id', 'qdoverlay'+itemsToShowLabel[i]); 
      controlContainer.appendChild(qdoverlaydiv);
      qdoverlaydiv.appendChild(document.createTextNode(itemsToShowText[i]));
      setButtonDefault(qdoverlaydiv);
      setButtonActive(qdoverlaydiv, itemsToShowLabel[i]);
      GEvent.addDomListener(qdoverlaydiv, "click", toggleControl);
    }
  }
  var fullscreenContainer = document.createElement("div");
  fullscreenContainer.setAttribute('id', 'qdoverlay_fullscreen'); 
  setButtonDefault (fullscreenContainer);
  fullscreenContainer.style.padding = "2px 2px 2px 8px";
  fullscreenContainer.style.background = '#ffffff';
  fullscreenContainer.style.width = '70px';
  
  fullscreenContainer.innerHTML = fullscreen_link ();
  //alert (fullscreenContainer.innerHTML);
  controlContainer.appendChild(fullscreenContainer);
  
  map.getContainer().appendChild(controlContainer);
  return controlContainer;
}

QDControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(7, 7));
}

/* 
  Buttonwerte für ein Control setzen 
  @param button
  @return -
*/
function setButtonDefault(button) {
  button.style.textDecoration = "none";
  button.style.color = "#000000";
  button.style.font = "11px Verdana";
  button.style.border = "1px solid black";
  button.style.padding = "2px 2px 2px 50px";
  button.style.marginRight = "3px";
  button.style.width = "50px";
  button.style.height = "16px";
  button.style.cursor = "pointer";
  button.style.styleFloat = 'left';
  button.style.cssFloat = 'left';
}

/* 
  Setzt den übergebenen Button auf inaktiv, d.h. die Grafik wird getauscht 
  @param button
  @param type
  @return -
*/
function setButtonInactive(button, type) {
  button.style.background = '#ffffff url(http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_'+type+'_hide.png) left top no-repeat';
  update_fullscreen_link ();
}

/* 
  Setzt den übergebenen Button auf aktiv, d.h. die Grafik wird getauscht 
  @param button
  @param type
  @return -
*/
function setButtonActive(button, type) {
  button.style.background = '#ffffff url(http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_'+type+'_show.png) left top no-repeat';
  update_fullscreen_link ();
}

/* 
  Diese Funktion wird aufgerufe, wenn der Button angeklickt wird. Dann 
  wechsel zwischen aktiv/inaktiv und anzeigen bzw. ausblenden der entsprechenden Marker
  @param -
  @return -
*/
function toggleControl() {
  var work = -1;
	switch (this.getAttribute('id')) {
		case "qdoverlaypaesse":
      work = PAESSE;
      break;

		case "qdoverlayorte":
      work = ORTE;
      break;
      
		case "qdoverlayhotels":
      work = HOTELS;
      break;

		case "qdoverlayuser":
      work = USER;
      break;

		case "qdoverlaytermine":
      work = TERMINE;
      break;
  }
  if (itemsToShowActive[work]) {
    itemsToShowActive[work] = false;
    setButtonInactive(this, itemsToShowLabel[work]);
    removeItems(work);
  } else {
    itemsToShowActive[work] = true;
    setButtonActive(this, itemsToShowLabel[work]);
    addItems();
  }
}

// Standartwerte für Icons setzen. Davon werden dann die Icons abgeleitet
var qdicon = new GIcon();
qdicon.iconSize = new GSize(20, 20);
qdicon.shadowSize = new GSize(0, 0);
qdicon.iconAnchor = new GPoint(6, 20);
qdicon.infoWindowAnchor = new GPoint(5, 1);
      
var qdiconcluster = new GIcon();
qdiconcluster.iconSize = new GSize(35, 35);
qdiconcluster.shadowSize = new GSize(0, 0);
qdiconcluster.iconAnchor = new GPoint(6, 20);
qdiconcluster.infoWindowAnchor = new GPoint(5, 1);
      
/* 
  Marker erzeugen, gleichzeitig auch ein Infofenster für "onclick" einbauen
  @param point
  @param name
  @param link
  @param html
  @param ic = icon
  @return -
*/
function openMarker (marker, link, html) {
	marker.openInfoWindowHtml('<div id="window"><div class="name">'+link+'</div>' + html + '</div>');
}
function createMarker(point, name, link, html, ic) {
  var marker = new GMarker(point, {icon: ic, title: name});
  GEvent.addListener(marker,"click", 
      function() {
        marker.openInfoWindowHtml('<div id="window"><div class="name">'+link+'</div>' + html + '</div>');
     }
  );
  return marker;
}

/* 
  Marker für einen Pass erzeugen, Icon setzen
  @param lat
  @param lon
  @param name
  @param passid
  @param hoehe
  @return marker
*/
function addPassAsMarker(lat, lon, name, passid, hoehe, link) {
  var point = new GLatLng(lat, lon);
  if (passid == cur_id)
    passicon = new GIcon(qdicon, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_passaktiv.png', null, '');
  else
    passicon = new GIcon(qdicon, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_pass.png', null, '');
  marker = createMarker(point, name, link, hoehe+' m', passicon);
  return marker;
}
/* 
  Marker für ein Hotel erzeugen, Icon setzen
  @param lat
  @param lon
  @param name
  @param passid
  @param dzab
  @return marker
*/
function addHotelAsMarker(lat, lon, name, passid, dzab, link) {
  var point = new GLatLng(lat, lon);
  if (passid == cur_id)
    hotelicon = new GIcon(qdicon, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_hotelaktiv.png', null, '');
  else
    hotelicon = new GIcon(qdicon, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_hotel.png', null, '');
  var zoomToStreet = '<a href="javascript: void (0)" onclick="map.setCenter (new GLatLng ('+lat+', '+lon+'), 15, G_NORMAL_MAP)">Auf Straßenansicht einzoomen</a>';
  var html = (dzab > 0?'Doppelzimmer ab ' + dzab + '&euro;<br>':'') + '<br>' + zoomToStreet;
  marker = createMarker(point, name, link, html, hotelicon);
  if (passid== cur_id) {
    openMarker (marker, link, html);
  }
  return marker;
}

/* 
  Marker für einen Ort erzeugen, Icon setzen
  @param lat
  @param lon
  @param name
  @param locationid
  @return marker
*/
function addOrtAsMarker(lat, lon, name, locationid, link) {
  point = new GLatLng(lat, lon);
  if (locationid == cur_id)
    orticon = new GIcon(qdicon, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_ortaktiv.png', null, '');
  else
    orticon = new GIcon(qdicon, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_ort.png', null, '');
  marker = createMarker(point, name, link, '', orticon);
  return marker;
}

/* 
  Marker für einen User erzeugen, Icon setzen
  @param lat
  @param lon
  @param name
  @param mitgliedid
  @return marker
*/
function addUserAsMarker(lat, lon, name, mitgliedid, link) {
  point = new GLatLng(lat, lon);
  if (mitgliedid == cur_id)
    usericon = new GIcon(qdicon, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_useraktiv.png', null, '');
  else
    usericon = new GIcon(qdicon, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_user.png', null, '');
  marker = createMarker(point, name, link, '', usericon);
  return marker;
}

/* 
  Marker für einen User erzeugen, Icon setzen
  @param lat
  @param lon
  @param name
  @param mitgliedid
  @return marker
*/
function addTerminAsMarker(lat, lon, name, terminid, link, html) {
  point = new GLatLng(lat, lon);
  if (terminid == cur_id)
    usericon = new GIcon(qdicon, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_terminaktiv.png', null, '');
  else
    usericon = new GIcon(qdicon, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_termin.png', null, '');
  marker = createMarker(point, name, link, html, usericon);
  return marker;
}

/*
function drawPaesse() {
  if (request.readyState == 4) {  
    var xml = request.responseXML;
    var paesse = xml.documentElement.getElementsByTagName("pass");
      
    for (var i = 0; i < paesse.length; i++) {
      var name = paesse[i].getAttribute("name");
                          
      var PassID = paesse[i].getAttribute("id");
      var lon = paesse[i].getAttribute("longitude");
      var lat = paesse[i].getAttribute("latitude");
      var hoehe = paesse[i].getAttribute("hoehe");
        
/*
      var pass = addPass (map, lat, lon, hoehe, PassID, name, icon)
      map.addOverlay(pass);
      passIcons[i] = pass;
    
      var zoom_text = new qd_zoom_text (lat, lon, PassID, paesse[i].getAttribute("name"),
                                      "#376FA6",
                                      (PassID==cur_id? "bold": "normal"));
      map.addOverlay(zoom_text);
      passTexte[i] = zoom_text;
*/
/*
      var pass = addPassAsMarker (lat, lon, name, PassID, hoehe);
      map.addOverlay(pass);
      itemsToShow[PAESSE][i] = pass;
    }
  }
}

*/

/* 
  Die anzuzeigenden Daten wurden per HTTP-Request angefordert und geliefert. Jetzt nach Pässen, Orten und Usern 
  aufteilen, Marker erzeugen und in die entsprechenden Arrays schreiben.
  @param -
  @return -
*/
function drawItems() {
  // markers werden nie aus dem Clusterer gelöscht. (nur, wenn sie abgewählt werden: removeItems) Daher ist es wichtig,
  // sie nur einmal einzufügen (in_id_array ())
  // DIES MUSS IN 0(1) GEHEN.
  if (request.readyState == 4) {  
  
    var mein_web_home = qd_global_web_home;
    if (mein_web_home == '127.0.0.1/') {
      mein_web_home = '127.0.0.1/dein_quaeldich.php?name=';
    } else {
       mein_web_home = mein_web_home.replace ("www", "mein");
    }

    var xml = request.responseXML;
    var items = xml.documentElement.getElementsByTagName("item");
    
    for (var i = 0; i < items.length; i++) {
      var itemtype = items[i].getAttribute("type");
      var name = items[i].getAttribute("name");
      var lon = items[i].getAttribute("longitude");
      var lat = items[i].getAttribute("latitude");
      var id = items[i].getAttribute("id");

      switch (itemtype) {
        case 'pass':
          var hoehe = items[i].getAttribute("hoehe");      
          var textid = items[i].getAttribute("textid");        
          var link = '<a href="http://' + window.qd_global_web_home + 'paesse/' + textid + '/" class="gm_passlink" target="_top">'+name+'</a>';
          var pass = addPassAsMarker (lat, lon, name, id, hoehe, link);
          //map.addOverlay(pass);
          if (!in_id_array(id, PAESSE)) {
            clustererPaesse.AddMarker(pass, link + hoehe + ' m');
            itemsToShow[PAESSE][itemsToShow[PAESSE].length] = pass;
            itemsToShowID[PAESSE][itemsToShowID[PAESSE].length] = id;
          }
          break;

        case 'hotel': 
          var textid = items[i].getAttribute("textid");        
          var DZab = items[i].getAttribute("dzab");        
          var link = '<a href="http://' + window.qd_global_web_home + 'hotels/' + textid + '/" class="gm_passlink" target="_top">'+name+'</a>';
          var hotel = addHotelAsMarker (lat, lon, name, id, DZab, link);
          //map.addOverlay(pass);
          if (!in_id_array(id, HOTELS)) {
            clustererHotels.AddMarker(hotel, link + 'DZ ab ' + DZab + '&euro;');
            itemsToShow[HOTELS][itemsToShow[HOTELS].length] = hotel;
            itemsToShowID[HOTELS][itemsToShowID[HOTELS].length] = id;
          }
          break;

        case 'ort':
          var textid = items[i].getAttribute("textid");       
          var link = '<a href="http://' + window.qd_global_web_home + 'orte/' + textid + '/" class="gm_passlink" target="_top">'+name+'</a>';
          var ort = addOrtAsMarker (lat, lon, name, id, link); 
//          map.addOverlay(ort);
          if (!in_id_array(id, ORTE)) {
            clustererOrte.AddMarker(ort, link);
            itemsToShow[ORTE][itemsToShow[ORTE].length] = ort;
            itemsToShowID[ORTE][itemsToShowID[ORTE].length] = id;
          }
          break;
          
        case 'termin':
          var href = items[i].getAttribute("href");     
          var urlid = items[i].getAttribute("urlid");     
          var mitglied = items[i].getAttribute("mitglied");     
          var mitgliedlink = '<a href="http://'+mein_web_home+urlid+'">'+mitglied+'</a>';
          var km = items[i].getAttribute("km");        
          var hm = items[i].getAttribute("hm");       
          var href_out = 'http://' + window.qd_global_web_home + 'termine/?TerminID='+id;
          if (href != '') {
            href_out = href;
          }
          var link = '<a href="' + href_out + '" target="_top">'+name+'</a>';
          var termin = addTerminAsMarker (lat, lon, name, id, link, '<br>' + km + ' km ' + hm + ' Hm<br>Termin von '+mitgliedlink); 
//          map.addOverlay(ort);
          if (!in_id_array(id, TERMINE)) {
            clustererTermine.AddMarker(termin, link);
            itemsToShow[TERMINE][itemsToShow[TERMINE].length] = termin;
            itemsToShowID[TERMINE][itemsToShowID[TERMINE].length] = id;
          }
          break;

        case 'user':
          var urlid = items[i].getAttribute("urlid");  
          
          var link = '<a href="http://'+mein_web_home+urlid+'" target="_top">'+name+'</a>';
          var user = addUserAsMarker (lat, lon, name, id, link);
//          map.addOverlay(user);
          if (!in_id_array(id, USER)) {
            clustererUser.AddMarker(user, link);
            itemsToShow[USER][itemsToShow[USER].length] = user;
            itemsToShowID[USER][itemsToShowID[USER].length] = id;
          }
          break;
      }
    }
  }
}

/* 
  Diese Funktion löst den HTTP_Request aus, um die anzuzeigenden Daten zu holen
  @param -
  @return -
*/
function addItems() {
  var bounds = map.getBounds();
  var sw = bounds.getSouthWest()
  var ne = bounds.getNorthEast()
  var swlon = sw.lng();
  var swlat = sw.lat();
  var nelon = ne.lng();
  var nelat = ne.lat();

  zoomstufe = map.getZoom();
  
  if (zoomstufe <= MIN_ZOOM_FUER_ORTE)
    removeItems(ORTE);
  if (zoomstufe <= MIN_ZOOM_FUER_PAESSE)
    removeItems(PAESSE);
  if (zoomstufe <= MIN_ZOOM_FUER_HOTELS)
    removeItems(HOTELS);
  if (zoomstufe <= MIN_ZOOM_FUER_USER)
    removeItems(USER);
  if (zoomstufe <= MIN_ZOOM_FUER_TERMINE)
    removeItems(TERMINE);
  
  var itemparam = '';
  if (itemsToShowActive[PAESSE] && zoomstufe > MIN_ZOOM_FUER_PAESSE) {  
    if (itemparam.length != 0)
      itemparam += '-';
    itemparam += PAESSE;
  }
  if (itemsToShowActive[ORTE] && zoomstufe > MIN_ZOOM_FUER_ORTE) {
    if (itemparam.length != 0)
      itemparam += '-';
    itemparam += ORTE;
  }
  if (itemsToShowActive[HOTELS] && zoomstufe > MIN_ZOOM_FUER_HOTELS) {
    if (itemparam.length != 0)
      itemparam += '-';
    itemparam += HOTELS;
  }
  if (itemsToShowActive[USER] && zoomstufe > MIN_ZOOM_FUER_USER) {
    if (itemparam.length != 0)
      itemparam += '-';
    itemparam += USER;
  }
  if (itemsToShowActive[TERMINE]) {
    if (itemparam.length != 0)
      itemparam += '-';
    itemparam += TERMINE;
  }

  // This works for IE also, whereas GDownloadUrl did not work for me
  request = GXmlHttp.create();
  // was window.qd_global_web_home before, but this does not work for 
  // mein.quaeldich.com due to cross site scripting in effect
  request.open("GET", "http://"+window.location.hostname+"/webinclude/php/location_xml.php?swlon="+swlon+"&swlat="+swlat+"&nelon="+nelon+"&nelat="+nelat+"&cur_id="+cur_id+"&items="+itemparam, true);
  request.onreadystatechange = drawItems;
  request.send(null); 
}


/* 
  Entfernen der Marker, die nicht mehr angezeigt werden sollen
  @param type
  @return -
*/
function removeItems (type) {
  for (r = 0; r < itemsToShow[type].length; r++) {
    switch (type) {
      case PAESSE: clustererPaesse.RemoveMarker(itemsToShow[type][r]); break;
      case ORTE:   clustererOrte.RemoveMarker(itemsToShow[type][r]); break;
      case HOTELS:   clustererHotels.RemoveMarker(itemsToShow[type][r]); break;
      case USER:   clustererUser.RemoveMarker(itemsToShow[type][r]); break;
      case TERMINE:   clustererTermine.RemoveMarker(itemsToShow[type][r]); break;
    }
  }
  itemsToShow[type] = [];
  itemsToShowID[type] = [];
  // assoc array resetten
  id_is_present[type] = new Object ();

/*  
  for (i = 0; type != PAESSE && i < itemsToShow[PAESSE].length; i++)
    if (itemsToShow[PAESSE][i])
      map.addOverlay(itemsToShow[PAESSE][i]);
  for (i = 0; type != ORTE && i < itemsToShow[ORTE].length; i++)
    if (itemsToShow[ORTE][i])
      map.addOverlay(itemsToShow[ORTE][i]);
  for (i = 0; type != USER && i < itemsToShow[USER].length; i++)
    if (itemsToShow[USER][i])
      map.addOverlay(itemsToShow[USER][i]);
*/
}

/* 
  Die Mutter aller JS-GM-Funktionen, wird per PHP auf die Seite geschrieben
  @param elements_id
  @param curid
  @param lon
  @param lat
  @param builditems -> Welche Controls sollen angezeigt werden?
  @param items -> Welche Daten sollen direkt angezeigt werden?
  @return -
*/
function loadGoogleMapLonLat(elements_id, curid, lon, lat, builditems, items, LocationID, originating_url, mistjob_LocationID) {
  aBuildItems = builditems;
  cur_id = curid; 
  cur_lon = lon; 
  cur_lat = lat; 
  cur_LocationID = LocationID;
  cur_originating_url = originating_url;
  if (GBrowserIsCompatible()) {

    var elem = document.getElementById(elements_id);
    map = new GMap2(elem);
    map.addMapType(G_PHYSICAL_MAP);

    clustererPaesse = new Clusterer(map);
    clustererPaesseIcon = new GIcon(qdiconcluster, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_pass_cluster.png', null, '');    
    clustererPaesse.SetIcon(clustererPaesseIcon);

/*
  // lets you change the threshold marker count where clustering kicks in. The default is 150 markers.
  clusterer.SetMaxVisibleMarkers(n)
  
  // sets the minumum number of markers for a cluster. The default is five.
  clusterer.SetMinMarkersPerCluster(n)
  
  // sets the maximum number of lines in an info box. The default is ten.
  clusterer.SetMaxLinesPerInfoBox(n)      
*/
    clustererOrte = new Clusterer(map);
    clustererOrteIcon = new GIcon(qdiconcluster, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_ort_cluster.png', null, '');    
    clustererOrte.SetIcon(clustererOrteIcon);
    
    clustererHotels = new Clusterer(map);
    clustererHotelsIcon = new GIcon(qdiconcluster, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_hotel_cluster.png', null, '');    
    clustererHotels.SetIcon(clustererHotelsIcon);

    clustererUser = new Clusterer(map);
    clustererUserIcon = new GIcon(qdiconcluster, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_user_cluster.png', null, '');    
    clustererUser.SetIcon(clustererUserIcon);

    clustererTermine = new Clusterer(map);
    clustererTermineIcon = new GIcon(qdiconcluster, 'http://' + window.qd_global_web_home + 'webinclude/img/icon/gm_termine_cluster.png', null, '');    
    clustererTermine.SetIcon(clustererTermineIcon);
    
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.enableDoubleClickZoom();
    map.enableContinuousZoom();
    //map.enableScrollWheelZoom();
    icon = new GIcon();
    icon.image = "http://"+window.qd_global_web_home+"/Bilder/bullet_ball_blue.gif";
    icon.iconSize = new GSize(10, 10);
    icon.iconAnchor = new GPoint(1, 1);
    icon.infoWindowAnchor = new GPoint(1, 1);
    
    if (lat && lon) {
      var point = new GLatLng(lat, lon);
      map.setCenter(point, 10, G_NORMAL_MAP);
      map.setMapType(G_PHYSICAL_MAP);
    } else {
      if (mistjob_LocationID) {
        //alert (mistjob_LocationID);
      //alert ("http://"+window.qd_global_web_home+"qdtp/regions/location_"+mistjob_LocationID+".kmz");
        if (typeof mistjob_LocationID == 'number') {
          var href = "http://"+window.qd_global_web_home+"qdtp/regions/location_"+mistjob_LocationID+".kmz";
        } else {
          var href = mistjob_LocationID;
        }
        var geoxml = new GGeoXml(href, function() {
        if (geoxml.loadedCorrectly()) {
          var center = geoxml.getDefaultCenter ();
          map.setCenter(center, 11);
          map.setMapType(G_PHYSICAL_MAP);
          geoxml.gotoDefaultViewport(map);
          map.addOverlay(geoxml);
        }
      });
      } else {
      var geoxml = new GGeoXml("http://"+window.qd_global_web_home+"webinclude/php/qd_region_extent.php?LocationID="+LocationID, function() {
        if (geoxml.loadedCorrectly()) {
          var center = geoxml.getDefaultCenter ();
          map.setCenter(center, 11);
          map.setMapType(G_PHYSICAL_MAP);
          geoxml.gotoDefaultViewport(map);
          //  map.addOverlay(geoxml);
        }
      });
      }
    }

    // add an event listener that 
    GEvent.addListener(map , "moveend", addItems);


    map.addControl(new QDControl());
    
    if (document.getElementById('qdoverlaypaesse'))
      setButtonInactive(document.getElementById('qdoverlaypaesse'), itemsToShowLabel[PAESSE]);
    if (document.getElementById('qdoverlayorte'))
      setButtonInactive(document.getElementById('qdoverlayorte'), itemsToShowLabel[ORTE]);
    if (document.getElementById('qdoverlayhotels'))
      setButtonInactive(document.getElementById('qdoverlayhotels'), itemsToShowLabel[HOTELS]);
    if (document.getElementById('qdoverlayuser'))
      setButtonInactive(document.getElementById('qdoverlayuser'), itemsToShowLabel[USER]);
    if (document.getElementById('qdoverlaytermine'))
      setButtonInactive(document.getElementById('qdoverlaytermine'), itemsToShowLabel[TERMINE]);
      
    for (i = 0; i < items.length; i++) {
      if (document.getElementById('qdoverlay'+itemsToShowLabel[items[i]])) {
        itemsToShowActive[items[i]] = true;
        setButtonActive(document.getElementById('qdoverlay'+itemsToShowLabel[items[i]]), itemsToShowLabel[items[i]]);
      }
    }
    //map.addControl(new QDEnlarge());
    addItems();
  }
}



