  var map;
  var totalLocations = 0;
  var main_host = "http://"+document.location.host;
  var markers_array = new Array();
  var draw_interval;
  var MapBounds = new GLatLngBounds();
  var clusters_array = new Array();
  var selected_cluster, selected_marker;
  var init_array = new Array();

  $(function () {
    $("#add_listing").dialog({
      autoOpen: false,
      bgiframe: true,
      height: 400,
      width: 410,
      modal: true,
      resizable: false,
      buttons: {
        'Hinzufügen': function() {
          $(this).dialog('close');
        },
        Cancel: function() {
          $(this).dialog('close');
        }
      }
    });
    $("#html_pages").dialog({
      autoOpen: false,
      bgiframe: true,
      width: 700,
      height: 600,
      modal: false,
      resizable: false,
      close: function(event, ui){
        $('#get_date').datepicker('destroy');
      },
      buttons: {
        'Schließen': function() {
          $(this).dialog('close');
        }
      }
    });
    initialize();
    $("#main").css("visibility","visible");
  });

  function showHTMLPage(url,title_text){
    $("#html_pages").load(url, null, function(){
      $(this).dialog("open");
      if(title_text){
        $(this).dialog('option', 'title', title_text);
      } else {
        $(this).dialog('option', 'title', '');
      }
    });
  }

  function showDialog(){
    $("#add_listing").dialog("open");
    $('#get_date').datepicker({
      changeMonth: true,
      changeYear: true
    });
  }

  function initialize() {
    if(GBrowserIsCompatible()) {
      map = new GMap2(document.getElementById("map_canvas"));
      var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(440, 10));
      map.addControl(new GLargeMapControl(),pos);
      map.addControl(new GMapTypeControl());
      map.setCenter(new GLatLng(46.912750956378915, 7.8826904296875), 9);
    }
    $.ajax({
      type: "GET",
      url: "data.php?operation=init",
      dataType: "xml",
      success: initClusters
    });
  }

  function initClusters(xd){
    $("listing",xd).each(function(){
      init_array.push({attr:$(this).find("kanton").text(),count:parseInt($(this).find("number").text())});
    });
    $.ajax({
      type: "GET",
      url: "data/clusters.xml",
      dataType: "xml",
      success: outputClusters
    });
  }

  function listingClass(src_xml){
    this.id = $("id", src_xml).text();
    this.address = $("address", src_xml).text();
    this.lat = $("latitude", src_xml).text();
    this.lng = $("longitude", src_xml).text();
    this.price = $("price", src_xml).text();
    this.bd = $("number-of-rooms", src_xml).text();
    this.description = $("description", src_xml).text();
    this.city = $("city", src_xml).text();
    this.phone = $("phone", src_xml).text();
    this.precision = $("precision", src_xml).text();
    this.apartment_size = $("apartment-size", src_xml).text();
    this.floor = $("floor", src_xml).text();
    this.elevator = $("elevator", src_xml).text();
    this.cleanup = $("cleanup", src_xml).text();
    this.windows = $("windows", src_xml).text();
    this.terrace_or_balcony = $("terrace-or-balcony", src_xml).text();
    this.carpet = $("carpet", src_xml).text();
    this.basement = $("basement", src_xml).text();
    this.attic = $("attic", src_xml).text();
    this.photos = new Array();
    $("photo",src_xml).each(function(){
      this.photos.push($(this));
    });
    var date_array = $("date", src_xml).text().split("-");
    this.date = date_array[1]+"/"+date_array[2];
  }

  function mainFilter(){
    var pcode = $("#codes_box").val();
    var zimmer = $("#zimmer_box").val();
    if(pcode!=""){
      getCluster(pcode);
    }
  }

  function focusLocation(mid){
    var current_marker = markers_array[mid];
    map.setCenter(current_marker.getPoint());
    current_marker.openInfoWindowTabsHtml(current_marker.infoTabs, {maxWidth: 250});
  }

  function createClusterMarker(latlng, title, abbr, count) {
    var icon = new GIcon();
    icon.image = "img/cluster.png";
    icon.shadow = "img/shadow-cluster.png";
    icon.iconSize = new GSize(30.0, 28.0);
    icon.shadowSize = new GSize(45.0, 28.0);
    icon.iconAnchor = new GPoint(15.0, 14.0);
    icon.infoWindowAnchor = new GPoint(15.0, 14.0);
    markerOptions = { icon:icon, title:count };
    var marker = new GMarker(latlng,markerOptions);
    marker.value = abbr;
    GEvent.addListener(marker,"click", function() {
      getCluster(abbr);
      //var myHtml = "<b><a href='javascript:void(0)' onclick='getCluster(\""+abbr+"\")'>" + title + "</a></b>";
      //map.openInfoWindowHtml(latlng, myHtml);
    });
    return marker;
  }

  function createListingMarker(latlng, listing, marker_count) {
    var icon = new GIcon();
    if(listing.photos.length>0){
      icon.image = "img/location_photo.png";
      icon.shadow = "img/shadow-location_photo.png";
    } else {
      icon.image = "img/location.png";
      icon.shadow = "img/shadow-location.png";
    }
    icon.iconSize = new GSize(18.0, 17.0);
    icon.shadowSize = new GSize(27.0, 17.0);
    icon.iconAnchor = new GPoint(9.0, 8.0);
    icon.infoWindowAnchor = new GPoint(9.0, 8.0);
    markerOptions = { icon:icon };
    var marker = new GMarker(latlng,markerOptions);
    marker.value = listing.id;
    marker.marker_count = marker_count;

    var apartment_size = "";
    if(listing.apartment_size!=""){
      apartment_size = "Wohnungsgr&ouml;sse: "+listing.apartment_size+"<br>";
    }
    var floor = "";
    if(listing.floor!="" && listing.floor!="0"){
      floor = "Stockwerk: "+listing.floor+"<br>";
    }
    var elevator = "";
    if(listing.elevator!=""){
      if(listing.elevator=="1"){
        elevator = "Aufzug im Haus: Ja<br>";
      } else {
        elevator = "Aufzug im Haus: Nein<br>";
      }
    }
    var windows = "";
    if(listing.windows!="" && listing.windows!="0"){
      windows = "Anzahl Fenster: "+listing.windows+"<br>";
    }
    var terrace_or_balcony = "";
    if(listing.terrace_or_balcony!="" && listing.terrace_or_balcony=="1"){
      terrace_or_balcony = "Balkon oder Terrasse: Ja<br>";
    }
    var basement = "";
    if(listing.basement!="" && listing.basement=="1"){
      basement = "Keller: Ja<br>";
    }
    var attic = "";
    if(listing.attic!="" && listing.attic=="1"){
      attic = "Dachboden: Ja<br>";
    }

    var myHtml = "<table width='240' cellpadding='0' cellspacing='0' border='0'><tr><td>";
    myHtml += "<div style='margin-bottom:10px;'>"+
              "  <div style='margin-bottom:2px;'>"+
              "    <b><a href='javascript:void(0)' onclick='getListing(\""+listing.id+"\")'>"+listing.price +" - "+listing.bd+"<br>"+listing.address + "</a></b><br>"+
              //"  </div>"+apartment_size+floor+elevator+windows+terrace_or_balcony+basement+attic+"<br><a href='javascript:void(0)' onclick='map.getInfoWindow().selectTab(1)'>Contact</a>"
              "  </div>"+apartment_size+floor+elevator+windows+terrace_or_balcony+basement+attic+
              "</div>";
    if(listing.photos.length>0){
      var cc = 1;
      for(var i=0;i<listing.photos.length;i++){
        myHtml += "<img src='"+listing.photos[i]+"' width='100' style='margin-bottom:5px;margin-right:5px;'>";
        if(cc % 2==0){
          myHtml += "<br>";
        }
        cc++;
      }
    }
    myHtml += "<div style='margin-top:10px;'>"+listing.phone+"</div></td></tr></table>";
    var contactForm = ""+
    "<form id='contactForm' style='margin0px;padding:0px;'>"+
    "<table width='100%' cellpadding='2' cellspacing='0'>"+
    "<input type='hidden' id='form_id' value='"+listing.id+"'>"+
    "<tr>"+
    "  <td>Name*:</td>"+
    "  <td><input type='text' id='form_name' minlength='2' style='width:150px;'/></td>"+
    "</tr>"+
    "<tr>"+
    "  <td>E-Mail*:</td>"+
    "  <td><input type='text' name='form_email' id='form_email' style='width:200px;'/></td>"+
    "</tr>"+
    "<tr><td colspan='2'>Nachricht*:</td></tr>"+
    "<tr><td colspan='2'><textarea id='form_message' class='required' cols='20' rows='3' style='width:250px;'></textarea></td></tr>"+
    "<tr><td colspan='2' align='right'><input type='button' value='Absenden' onclick='doContactForm("+marker_count+")'></td></tr>"+
    "</table>"+
    "</form>";
    //var infoTabs = [new GInfoWindowTab("Info", myHtml), new GInfoWindowTab("Contact", "<div id='contactFormDiv'>"+contactForm+"</div>")];
    var infoTabs = [new GInfoWindowTab("Info", myHtml+"<hr size='1'/>"+contactForm)];
    marker.infoTabs = infoTabs;
    GEvent.addListener(marker,"click", function() {
      marker.openInfoWindowTabsHtml(infoTabs, {maxWidth: 250});
    });
    return marker;
  }

  function isEmail(email) {
    var regex = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    if (regex.test(email)) return true;
    else return false;
  }

  function doContactForm(mid){
    var form_id = $("#form_id","#contactForm").val();
    var form_name = $("#form_name","#contactForm");
    var form_email = $("#form_email","#contactForm");
    var form_message = $("#form_message","#contactForm");
    if(form_name.val().length<2){
      alert("Dieses Feld ist ein Pflichtfeld.");
      form_name.focus();
      return;
    }
    if(!isEmail(form_email.val())){
      alert("Geben Sie bitte eine gültige E-Mail Adresse ein.");
      form_email.focus();
      return;
    }
    if(form_message.val().length<5){
      alert("Dieses Feld ist ein Pflichtfeld.");
      form_message.focus();
      return;
    }
    //prompt("aa: ","http://www.wohnungmieten.in/mail/"+form_id+"?tenant_name="+form_name.val()+"&tenant_email="+form_email.val()+"&tenant_message="+form_message.val());
    selected_marker = markers_array[mid];
    selected_marker.closeInfoWindow();
    $.ajax({
      type: "GET",
      url: "http://www.wohnungmieten.in/mail/"+form_id+".html?tenant_name="+encodeURIComponent(form_name.val())+"&tenant_email="+encodeURIComponent(form_email.val())+"&tenant_message="+encodeURIComponent(form_message.val()),
      success: function(html){
        alert("Ihre Nachricht wurde an den Wohnungsinhaber weitergeleitet.\nVielen Dank für Ihr Interesse!");
      },
      error: function(html){
        alert("Ihre Nachricht konnte aufgrund technischer Probleme nicht weitergeleitet werden.\n");
      }
    });
  }

  function outputClusters(xd){
    var objSel = document.getElementById("codes_box");
    clusters_array = new Array();
    //clusters_array.push({attr:$(this).find("kanton").text(),count:parseInt($(this).find("number").text())});
    for(var i=0;i<init_array.length;i++){
      $("cluster",xd).each(function(){
        if(init_array[i].attr==$("abbr", this).text()){
          var abbr = $("abbr", this).text();
          var title = $("title", this).text();
          var lat = $("lat", this).text();
          var lng = $("lng", this).text();
          if(lat && lng){
            var point = new GLatLng(lat,lng);
            map.addOverlay(new createClusterMarker(point,title,abbr,init_array[i].count));
          }
          clusters_array.push({abbr:abbr,title:title,point:point});
          objSel.options[objSel.options.length] = new Option(title+" ("+init_array[i].count+")", abbr);
        }
      });
    }
  }

  function getCluster(abbr){
    var url = main_host+"/data.php?operation=kanton&kanton="+abbr;
    var codes_box = document.getElementById("codes_box");
    for(var i=0;i<codes_box.options.length;i++){
      if(codes_box.options[i].value==abbr){
        codes_box.options[i].selected = 1;
        selected_cluster = clusters_array[i-1];
      }
    }
    var content = "<p>Suche Wohnungen in "+selected_cluster.title+" &hellip;</p>";
    $("#result_area").html(content);
    $.ajax({
      type: "GET",
      url: url,
      dataType: "xml",
      success: outputCluster
    });
  }

  function outputCluster(xd){
    map.clearOverlays();
    markers_array = new Array();
    totalLocations = $("listing",xd).length;
    map.setCenter(selected_cluster.point);
    if(totalLocations>0){
      var content = "<div align='right'><p style='padding-bottom:4px;'><a href='javascript:void(0)' onclick='showDialog()' style='color:#0000ff'>Meine Wohnung hinzuf&uuml;gen</a></p></div>"+
                    "<div class='results_list_header results_list1'>&#160;</div>"+
                    "<div class='results_list_header results_list2'>Preis</div>"+
                    "<div class='results_list_header results_list3'>Gr&ouml;&szlig;e</div>"+
                    "<div class='results_list_header results_list4'>Beschreibung</div>"+
                    "<div class='results_list_header results_list5'>Stadt</div>"+
                    "<div class='results_list_header results_list6'>Datum</div>"+
                    "<div class='results_list_header results_list7'>&#160;</div><div style='clear:both'></div>";
      content += "<div id='result_lists_div'>";
      var marker_count = 0;
      $("listing",xd).each(function(){
        var listing = new listingClass($(this));
        var description = listing.description;
        if(description.length>50){
          description = description.substr(0,50)+"...";
        }
        if(listing.photos.length>0){
          var photos = "<img src='img/location_photo.png'>";
        } else {
          var photos = "<img src='img/location.png'>";
        }
        if(listing.lat && listing.lng){
          var point = new GLatLng(listing.lat,listing.lng);
          var marker=new createListingMarker(point, listing,marker_count);
          map.addOverlay(marker,0,17);
          MapBounds.extend(point);
          markers_array.push(marker);
          photos = "<a href='javascript:void(0)' onclick='focusLocation("+marker_count+")'>"+photos+"</a>";
          marker_count++;
        }
        content += "<div class='results_list results_list1'>"+photos+"</div>"+
                   "<div class='results_list results_list2'>&#160;"+listing.price+"</div>"+
                   "<div class='results_list results_list3'>"+listing.bd+"</div>"+
                   "<div class='results_list results_list4'><a href='javascript:void(0)'>"+description+"</a></div>"+
                   "<div class='results_list results_list5'>"+listing.city+"</div>"+
                   "<div class='results_list results_list6'>"+listing.date+"</div><div style='clear:both'></div>";
      });
      content += "</div>";
      map.setZoom(map.getBoundsZoomLevel(MapBounds));
      var clat = (MapBounds.getNorthEast().lat() + MapBounds.getSouthWest().lat()) /2;
      var clng = (MapBounds.getNorthEast().lng() + MapBounds.getSouthWest().lng()) /2;
      map.setCenter(new GLatLng(clat,clng));
    } else {
      var content = "<div class='ui-state-highlight ui-corner-all' style='margin-top:10px;padding:0 .7em;margin-bottom:10px;'>"+
                    "  <div><p style='padding:5px 0px 6px 0px;'>Keine Eintr&auml;ge gefunden! Versuchen Sie es sp&auml;ter erneut.</p></div>"+
                    "</div>"+
                    "<p align='right'><b><a href='javascript:void(0)' onclick='showDialog()' style='color:#0000ff'>Meine Wohnung hinzuf&uuml;gen</a></b></p>";
    }
    $("#result_area").html(content);
  }

  function getInfo(){
    prompt("Map: ",map.getCenter()+map.getZoom());
  }

