// Geocoding
var map
var geocoder;
var markers;
var delay = 200;
var contacts;
var failCounter = 0;
var cr = String.fromCharCode(10);
var lf = String.fromCharCode(13);

  lib =
  {
    setTimeout: function(fnPointer, ms)
    {
      var args = arguments;
      function proxy()
      {
        var params = new Array();
        var i;
        for (i = 2; i < args.length; i++)
          { params.push(args[i]); }
  
        fnPointer.apply(this, params);
      }
  
      return window.setTimeout(proxy, ms);
    }
  };
       
function initialize() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map"));
    map.enableDoubleClickZoom();    
    map.enableScrollWheelZoom();                     
    map.enableContinuousZoom();	
    map.addControl(new GMapTypeControl());
    map.addControl(new GLargeMapControl());
    map.addControl(new GScaleControl());
    geocoder = new GClientGeocoder();  
    geocoder.getLatLng("Schweiz", 
      function handleResponse(point) {
        if (point) {
          map.setCenter(point, 7);  
        }
      }
    );
  }
}
    
function GetCoordinates() {
  contacts = document.getElementById("input").value.split("\n");
  markers = new Array(contacts.length);
  document.getElementById("output").value = "";
  
  var myLib = lib;
  
  for (var i = 0; i < contacts.length; i++) {
    //setTimeout(function(){GeocodeRequest(i);}, delay);
    //setTimeout(wrapper, delay);
    myLib.setTimeout(GeocodeRequest, i * delay, contacts[i]);   
  }
}

function GeocodeRequest(contact) {
    var contact_fields1;
    var address = "";
    var contact_no = 0;
    var myLib = lib;
    
    contact_fields1 = contact.split(";");
    address = contact_fields1[2].replace(/|/g, "") + "," + contact_fields1[3].replace(/|/g, "") + " " + contact_fields1[4].replace(/|/g, "");
    geocoder.getLocations(address, 
      function handleResponse(response) {
        var contact_fields2 = contact.split(";"); 
        if (response.Status.code == 200) {   
          // Adresse gefunden
          place = response.Placemark[0];
          point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
          document.getElementById("output").value += contact_fields2[0] + ";" + contact_fields2[1] + ";" + contact_fields2[2] + ";" + contact_fields2[3] + ";" + contact_fields2[4] + ";" + point.lat() + ";" + point.lng() + "\r\n"; 
          var marker = new GMarker(point);
          markers[contact_no] = marker; 
          map.addOverlay(marker); 
          GEvent.addListener(marker, "click", function() {
            marker.openInfoWindowHtml("<b>" + contact_fields2[0].replace(/|/g, "") + ": " + contact_fields2[1].replace(/|/g, "") + "</b><p>" + contact_fields2[2].replace(/|/g, "") + "<br />" + contact_fields2[3].replace(/|/g, "") + " " + contact_fields2[4].replace(/|/g, "") + "</p>"); 
          });
          contact_no += 1;
        } else {
          if (response.Status.code == 620) {
            failCounter += 1;
            //alert('Adresse (' + address + ') zu früh gesendet!'); 
            // Geocodeanfrage zu früh gesendet, wiederholen
            //if (delay < 600)
            //  delay += 50;
            myLib.setTimeout(GeocodeRequest, 500, contact);
          }
          else {
            // Keine Adresse gefunden,
            //alert('Adresse (' + address + ') nicht gefunden!'); 
            document.getElementById("output").value += contact + "\n";
          }
        }
        if (contact_no == contacts.length) {
          //alert('Anzahl Fehlversuche: ' + failCounter);
          //SetBoundsAndZoom();
        }
      }
    );
}
           
function SetBoundsAndZoom() {
  var bounds = new GLatLngBounds;
  for (var i = 0; i < markers.length; i++) {
    if (markers[i])
      bounds.extend(markers[i].getLatLng());
  } 
  map.setZoom(map.getBoundsZoomLevel(bounds));
  map.setCenter(bounds.getCenter());
  setBoundsAndZoom = false;
}

