// Globale Variablen

var batchmap;

var yellowIcon = createNewIcon("img/yellowIcon.PNG");
var blueIcon = createNewIcon("img/blueIcon.PNG");
var redIcon = createNewIcon("img/redIcon.PNG");
var greenIcon = createNewIcon("img/greenIcon.PNG");
var orangeIcon = createNewIcon("img/orangeIcon.PNG");

var source;

var Trennzeichen;
var FileFormat;
var Filename;
var readFileInterval;

var geocodeQuerys = [];
var geocodeQuerysIndex;

var optionNr;

var geocodeValidation;
var str;
var hnr;
var plz;
var ort;

var digitizeCommand = [];  // [0]=geocodeQuerysIndex  [1]=Command (digiPosition, digiPosition&Address, )

//********************************************************************************************************************************************************
// batchmap-Setup
//********************************************************************************************************************************************************
function batchinit() {
        handleResize(); 
        //showdiv('batchmap');
	batchmap = new GMap(document.getElementById("batchmap"));
	batchmap.addControl(new GLargeMapControl());
	batchmap.addControl(new GMapTypeControl());
	//batchmap.addControl(new GOverviewMapControl());
	batchmap.enableScrollWheelZoom();
	batchmap.setCenter(new GLatLng(startCenterLatitude, startCenterLongitude), startZoom);
	batchmap.setMapType(G_HYBRID_MAP);

        //*******************************************************************************************************************************************************
        // CLICK-Listener-Setup
        //*******************************************************************************************************************************************************
	GEvent.addListener(batchmap, "click", function(overlay, latlng) {
          if (!overlay ) {

             if(BlinkMarker) {
                         batchmap.removeOverlay(BlinkMarker);
             }
            if (document.getElementById('ResultList').selectedIndex != -1) {
              var columns = geocodeQuerys[document.getElementById('ResultList').options[document.getElementById('ResultList').selectedIndex].value].split("*");
              switch (columns[0]) {
                  case "Geocoded":
                    openBatchDigitizeWindow(overlay, latlng, columns);
                    break;
                  case "NotGeocoded":
                    openBatchDigitizeWindow(overlay, latlng, columns);
                    break;
                  case "Incomplete":
                    openBatchDigitizeWindow(overlay, latlng, columns);
                    break;
                  //case "AlreadyExist":
                 //   alert("Bereits vorliegende Adressen können nur im Register 'Karte' editiert werden!");
                  //  break;
                  case "Finished":
                    alert("Neue vollständige Adressen können nur im Register 'Karte' editiert werden!");
                    break;
              }
            }

          }
	});

        //*******************************************************************************************************************************************************
        // INFOWINDOWCLOSE-Listener-Setup
        //*******************************************************************************************************************************************************
	GEvent.addListener(batchmap, "infowindowclose", function() {
            BlinkCounter=6;
            PositionCursor();
             if(BlinkMarker) {
                         batchmap.removeOverlay(BlinkMarker);
             }
	});

        //*******************************************************************************************************************************************************
        // MOVEEND-Listener-Setup
        //*******************************************************************************************************************************************************
	GEvent.addListener(batchmap, "moveend", function() {
             if(BlinkMarker) {
                         batchmap.removeOverlay(BlinkMarker);
             }
	});

        //*******************************************************************************************************************************************************
        // ZOOMEND-Listener-Setup
        //*******************************************************************************************************************************************************
	GEvent.addListener(batchmap, "zoomend", function() {
                         if(BlinkMarker) {
                         batchmap.removeOverlay(BlinkMarker);
             }
 	});
        document.getElementById("tooltip2").style.visibility="hidden";
}

//********************************************************************************************************************************************************
// Workflowsteuerung beim FileFormatWechsel
//********************************************************************************************************************************************************
function changeFileFormat() {
  if (document.getElementById("XMLFile").checked==true || document.getElementById("ExcelFile").checked==true || document.getElementById("MobileFile").checked==true) {
    document.getElementById("Tab").disabled=true;
    document.getElementById("Comma").disabled=true;
  }else{
    document.getElementById("Tab").disabled=false;
    document.getElementById("Comma").disabled=false;
  }
}

//********************************************************************************************************************************************************
// Funktionen zum Ein- und Ausblenden der automatischen Prozessierung
//********************************************************************************************************************************************************
function showProcessing(Process, Progress, Dataset) {
  document.getElementById("proceedBatchGeocoding").style.visibility = "visible";
  document.getElementById("Process").innerHTML = Process;
  document.getElementById("Progress").innerHTML = "<br>" + Progress;
  document.getElementById("Dataset").innerHTML = Dataset;
}

function hideProcessing() {
  document.getElementById("proceedBatchGeocoding").style.visibility = "hidden";
}

//********************************************************************************************************************************************************
// Hautptfunktionen zur Ausführung der batch-Geocodierung (Ruft SubFunktionen auf)
//********************************************************************************************************************************************************
function BatchGeocodingPart1() {
//Resultate zurücksetzten
  if (document.getElementById("uploadSource").value=="") {
    alert("Keine Datei angegeben!");
    return;
  }
  var maxI = document.getElementById("ResultList").length-1;
  for (var i=0; i <= maxI; i++) {
    document.getElementById("ResultList").remove(0);
  }
  batchmap.clearOverlays();
  source = "";
  Filename = "";
  geocodeQuerys = [];
  document.getElementById("Count1").innerHTML = "";
  document.getElementById("Image1").src="img/list.GIF";
  document.getElementById("Count2").innerHTML = "";
  document.getElementById("Image2").src="img/list.GIF";
  document.getElementById("Count3").innerHTML = "";
  document.getElementById("Image3").src="img/list.GIF";
  document.getElementById("Count4").innerHTML = "";
  document.getElementById("Image4").src="img/list.GIF";
  document.getElementById("Count5").innerHTML = "";
  document.getElementById("Image5").src="img/list.GIF";
  document.getElementById("Count6").innerHTML = "";

  if (document.getElementById("MobileFile").checked==false){
     if (checkUser()==false) return;
  }
  showProcessing("Sende Datei", "1 / 4", "-");
  detectFilename();
  setFileAnalyzeParameters();
  getFileContent();
}

function BatchGeocodingPart2() {
// File auf Server löschen und Daten in Variabeln einlesen
  showProcessing("Lese Datei", "2 / 4", "-");
  if (getGeocodeQuerys()==false) {
    hideProcessing();
    return;
  }
}

function BatchGeocodingPart3() {
// Abgleich mit DB
  showProcessing("Abgleich mit Datenbank", "3 / 4", "");
  checkIfAlreadyExist(0, geocodeQuerys.length-1);
  geocodeQuerysIndex=-1;
}

function BatchGeocodingPart4() {
// Näherungs-Geokodierung
  showProcessing("Prov. Geokodierung läuft", "4 / 4", "");
  if (FileFormat=="Mobile"){
      BatchGeocodingPart5();
    }else{
      doGeocoding();
    }
  }

function BatchGeocodingPart5() {
  drawMarkers();
  hideProcessing();
}

//********************************************************************************************************************************************************
// Überprüft ob User eingetragen ist
//********************************************************************************************************************************************************
function checkUser() {
  if (document.getElementById("InputUSR2").value=="") {
    alert("Zum Starten der halbautomatischen Geokodierung ist die Eingabe eines Benutzernamens erforderlich!");
    return false;
  }else{
    return true;
  }
}

//********************************************************************************************************************************************************
// Detektiert den Filenamen aus dem Formular
//********************************************************************************************************************************************************
function detectFilename() {
  if (document.getElementById("uploadSource").value!="") {
    var splitter = String.fromCharCode(92);  // ='\'
    var tmp = document.getElementById("uploadSource").value.split(splitter);
    Filename = tmp[tmp.length-1];
  }
}

//********************************************************************************************************************************************************
// Übernimmt aus dem Formular die Angaben zur Formatierung der Datei und speichert diese in globalen Variablen
//********************************************************************************************************************************************************
function setFileAnalyzeParameters(){
  //Ermittle FileFormat
  if (document.getElementById("OutlookFile").checked==true) FileFormat="Outlook";
  if (document.getElementById("ExcelFile").checked==true) FileFormat="Excel";
  if (document.getElementById("XMLFile").checked==true) FileFormat="XML";
  if (document.getElementById("CSVFile").checked==true) FileFormat="CSV";
  if (document.getElementById("MobileFile").checked==true) FileFormat="Mobile";

  //Ermittle Trennzeichen
  if (document.getElementById("Tab").checked==true) {
    Trennzeichen="\t";
  }else{
    Trennzeichen=",";
  }
}

//********************************************************************************************************************************************************
// Speichert den Fileinhalt in die Variable 'source'
//********************************************************************************************************************************************************
function getFileContent() {
  readFileInterval = window.setInterval("readFile()", 4000);
}

function readFile() {
  var getVars = '?filename=upload/' + Filename + "&fileformat=" + FileFormat;
  //var getVars = '?filename=upload/AdressenBS.csv&fileformat=Excel';
  if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
    if (xmlHttp) {
      xmlHttp.open('GET', 'readFile.php' + getVars  , true);
      xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState == 4) {
          source = xmlHttp.responseText;
          //alert(source);
          if (source == "") {
            return ;
          }else{
            window.clearInterval(readFileInterval);
            //deleteServerFile();
			BatchGeocodingPart2();
          }
        }
      };
      xmlHttp.send(null);
    }
  }
}

//********************************************************************************************************************************************************
// Löscht das Upload-File auf dem Server
//********************************************************************************************************************************************************
function deleteServerFile() {
  var getVars = "?filename=" + Filename;
  if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
    xmlHttp.open('GET', 'deleteServerFile.php'+ getVars, true);

    //tell the request what to do when the state changes.
    xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4) {
      if (xmlHttp.status == 200){
        var xml = xmlHttp.responseXML;
        if(xml) {
          BatchGeocodingPart2();
        }
      } //if
    } //if
  } //function
  xmlHttp.send(null);
  } //if
}

//********************************************************************************************************************************************************
// Liest aus 'source' und stellt die GeocodeQuery zusammen
//********************************************************************************************************************************************************
function getGeocodeQuerys() {
  switch (FileFormat) {
  case "Mobile":
            lines = source.split("\n");
            j=-1;
            for (var i=0; i <= lines.length-1; i++){
              if (lines[i]=="") continue;   //leere Zeilen überstringen
              if (lines[i].substring(0, 15)=="//Benutzername:") {
                 tmp = lines[i].split(":");
                 usr = cutString(tmp[1]);
                 continue;
              }
              if (lines[i].substring(0, 2)=="//") continue;
              j=j+1;
              columns = lines[i].split(";");
              if (columns.length!=7) {
                alert("Fehler in Datei (Zeile " + (i+1) + "): Datei entspricht nicht den Formatierungsregeln!");
                hideProcessing();
                return false;
              }
              str = checkCapital(cutString(columns[0]));
              hnr = cutString(columns[1]);
              adrzusatz = cutString(columns[2]);
              if (adrzusatz == "") adrzusatz = "-";
              plz = cutString(columns[3]);
              ort = checkCapital(cutString(columns[4]));
              lat = columns[6];
              lng = columns[5];
              if (str=="" || hnr=="" || plz=="" || ort=="" || String(Number(plz))=="NaN" || plz.length<4 || plz.length>5) {
                geocodeValidation="MobileIncomplete";
              }else{
                geocodeValidation="Complete";
              }
              geocodeQuerys[j] = geocodeValidation + "*" +str + "*" + hnr + "*" + adrzusatz + "*" + plz + "*" + ort + "*" + lat + "*" + lng+ "*"+ j;
            }
            document.getElementById("InputUSR2").value = usr;
            BatchGeocodingPart3();  //Weiter mit Abgleich in DB
    break;

  case "CSV":
            lines = source.split("\n");
            for (var i=0; i <= lines.length-1; i++){
              if (lines[i]=="") continue;
              columns = lines[i].split(Trennzeichen);
              if (columns.length!=5) {
                alert("Fehler in Datei (Zeile " + (i+1) + "): Datei entspricht nicht den Formatierungsregeln!");
                hideProcessing();
                return false;
              }
              str = checkCapital(cutString(columns[0]));
              hnr = cutString(columns[1]);
              adrzusatz = cutString(columns[2]);
              if (adrzusatz == "") adrzusatz = "-";
              plz = cutString(columns[3]);
              ort = checkCapital(cutString(columns[4]));
              if (str=="" || hnr=="" || plz=="" || ort=="" || String(Number(plz))=="NaN" || plz.length<4 || plz.length>5) {
                geocodeValidation="Incomplete";
              }else{
                geocodeValidation="Complete";
              }
              geocodeQuerys[i] = geocodeValidation + "*" +str + "*" + hnr + "*" + adrzusatz + "*" + plz + "*" + ort;
            }
            BatchGeocodingPart3();  //Weiter mit Abgleich in DB
    break;

  case "Excel":
            lines = source.split("\n");
            for (var i=0; i <= lines.length-1; i++){
              if (lines[i]=="") continue;
              columns = lines[i].split(";");
              if (columns.length!=5) {
                alert("Fehler in Datei (Zeile "+ (i+1) +"): Datei entspricht nicht den Formatierungsregeln!");
                hideProcessing();
                return false;
              }
              str = checkCapital(cutString(columns[0]));
              hnr = cutString(columns[1]);
              adrzusatz = cutString(columns[2]);
              if (adrzusatz == "") adrzusatz = "-";
              plz = cutString(columns[3]);
              ort = checkCapital(cutString(columns[4]));

              if (str=="" || hnr=="" || plz=="" || ort=="" || String(Number(plz))=="NaN" || plz.length<4 || plz.length>5) {
                geocodeValidation="Incomplete";
              }else{
                geocodeValidation="Complete";
              }
              geocodeQuerys[i] = geocodeValidation + "*" +str + "*" + hnr + "*" + adrzusatz + "*" + plz + "*" + ort;
              //alert(geocodeQuerys[i]+"/"+ort.charCodeAt(0));
            }
            BatchGeocodingPart3();  //Weiter mit Abgleich in DB
    break;

  case "Outlook":
            lines = source.split("\n");
            //Eingabe der Spaltennr.
            var answer = prompt('Geben Sie die für Ihre Datei gültigen Positionen (Spalten) der\nfolgenden Attribute durch Kommas getrennt an (Zählung beginnt bei 1):\n"Strasse Hausnummer","Postleitzahl","Ort"', '9,14,12');
            
            if (answer == null) {    //Aussteigen falls Abrechen geklickt wurde
              hideProcessing();
              return;
            }

            positions = answer.split(",");
            //Check, ob 3 Spalten angegeben wurden
            if (positions.length!=3) {
                alert("Eingabefehler: Sie müssen exakt 3 Positionen (Spalten) angeben!");
                hideProcessing();
                return false;
            }
            //Check ob 3 gültige Spalten angegeben wurden
            if (isNotGanzzahl(positions[0]) || isNotGanzzahl(positions[1]) || isNotGanzzahl(positions[2])) {
                alert("Eingabefehler: Eine oder mehrere angegebene Positionen sind falsch (keine Ganzzahl)!");
                hideProcessing();
                return false;
            }
            var spalten = lines[0].split(Trennzeichen);
            var spaltenanzahl = spalten.length;
            if (positions[0]>spaltenanzahl || positions[1]>spaltenanzahl || positions[2]>spaltenanzahl || positions[0]<=0 || positions[1]<=0 || positions[2]<=0) {
                alert("Eingabefehler: Eine oder mehrere angegebene Positionen sind falsch (Zählung beginnt bei 1)!");
                hideProcessing();
                return false;
            }
            //Check ob File Daten enthält
            if (lines.length==1) {
              alert("Fehler in Datei: Datei enthält keine Daten!");
              hideProcessing();
              return false;
            }
            for (var i=1; i < lines.length-1; i++){
              if (lines[i]=="") continue;               //Zeile ohne Inhalt -->überspringen
              columns = lines[i].split(Trennzeichen);

              str = checkCapital(cutString(columns[positions[0]-1]));
              plz = cutString(columns[positions[1]-1]);
              ort = checkCapital(cutString(columns[positions[2]-1]));
              adrzusatz = "-";
              //Trennen von "Strasse Hausnummer"
              firstHit = str.search(/\b\d/);            //Suche nach "'Wortende''Ziffer'
              if (firstHit!=-1) {
                hnr = cutString(str.substr(firstHit));
                str = cutString(str.substr(0, firstHit-1));
              }else{
                hnr="";
              }
              if (str=="" || hnr=="" || plz=="" || ort=="" || String(Number(plz))=="NaN" || plz.length<4 || plz.length>5) {
                geocodeValidation="Incomplete";
              }else{
                geocodeValidation="Complete";
              }
              geocodeQuerys[i-1] = geocodeValidation + "*" +str + "*" + hnr + "*" + adrzusatz + "*" + plz + "*" + ort;
            }
            BatchGeocodingPart3();  //Weiter mit Abgleich in DB
    break;

  case "XML":
            var fromPos;
            var toPos;
            var tagNames = [];
            var lines = [];
            var tagName;
            var a=0;
            lines = source.split('\n');
            for (var i=0; i <= 6; i++){
              fromPos = lines[i].search(/\</);
              toPos = lines[i].search(/\>/);
              if (lines[i].slice(fromPos,fromPos+5)=="<?xml") {
                  continue;
              }
              tagNames[a] = lines[i].slice(fromPos+1, toPos);
              a++;
            }
            var answer = prompt('Korrigieren Sie wenn nötig die nachstehend aufgelisteten automatisch ermittelten\nTag-Namen Ihrer Datei!\n\nWurzel-Element: '+tagNames[0]+'\nAdressen-Element: '+tagNames[1]+'\nStrassen-Element: '+tagNames[2]+'\nHausnummer-Element: '+tagNames[3]+'\nAdresszusatz-Element: '+tagNames[4]+'\nPLZ-Element: '+tagNames[5]+'\nOrt-Element: '+tagNames[6],tagNames[0]+","+tagNames[1]+","+tagNames[2]+","+tagNames[3]+","+tagNames[4]+","+tagNames[5]+","+tagNames[6]);

            if (answer == null) {    //Aussteigen falls Abrechen geklickt wurde
              hideProcessing();
              return;
            }

            tagNames = answer.split(",");

            for (var z=0; z <= tagNames.length-1; z++){
              if (source.search(tagNames[z])==-1) {
                alert("Fehler in Datei: Tag-Name '" + tagNames[z] +"' nicht gefunden!");
                hideProcessing();
                return;
              }
            }

            //alles ausserhalb des Adressen-Elemente wegschneiden
            fromPos = source.indexOf("<"+tagNames[1]+">");
            toPos = source.lastIndexOf("</"+tagNames[1]+">");
            toPos = toPos + tagNames[1].length + 3;
            source =  source.slice(fromPos, toPos);

            //Aufsplitten nach Names des Adressen-Elementes --> Datensätze
            var datasets = source.split("</"+tagNames[1]+">");
            for (var i=0; i < datasets.length-1; i++){
              //Aufsplitten der Datensätze durch Zeilenumbrüche --> Attributwerte
              lines = [];
              lines = datasets[i].split("\n");
              for (var j=0; j < lines.length-1; j++) {
                //Ermitteln des TagNamens
                fromPos = lines[j].indexOf("<");
                toPos = lines[j].indexOf(">");
                tagName = lines[j].slice(fromPos+1, toPos);
                //Zuordnung Attributwerte <-> Attributtypen
                switch(tagName) {
                case tagNames[2]:
                  fromPos = lines[j].indexOf("<"+tagNames[2]+">");
                  fromPos = fromPos + tagNames[2].length +2;
                  toPos = lines[j].indexOf("</"+tagNames[2]+">");
                  str = checkCapital(cutString(lines[j].slice(fromPos, toPos)));
                  break;
                case tagNames[3]:
                  fromPos = lines[j].indexOf("<"+tagNames[3]+">");
                  fromPos = fromPos + tagNames[3].length +2;
                  toPos = lines[j].indexOf("</"+tagNames[3]+">");
                  hnr = cutString(lines[j].slice(fromPos, toPos));
                  break;
                case tagNames[4]:
                  fromPos = lines[j].indexOf("<"+tagNames[4]+">");
                  fromPos = fromPos + tagNames[4].length +2;
                  toPos = lines[j].indexOf("</"+tagNames[4]+">");
                  adrzusatz = cutString(lines[j].slice(fromPos, toPos));
                  if (adrzusatz == "") adrzusatz = "-";
                  break;
                case tagNames[5]:
                  fromPos = lines[j].indexOf("<"+tagNames[5]+">");
                  fromPos = fromPos + tagNames[5].length +2;
                  toPos = lines[j].indexOf("</"+tagNames[5]+">");
                  plz = cutString(lines[j].slice(fromPos, toPos));
                  break;
                case tagNames[6]:
                  fromPos = lines[j].indexOf("<"+tagNames[6]+">");
                  fromPos = fromPos + tagNames[6].length +2;
                  toPos = lines[j].indexOf("</"+tagNames[6]+">");
                  ort = checkCapital(cutString(lines[j].slice(fromPos, toPos)));
                  break;
                }
              }
              if (str=="" || hnr=="" || plz=="" || ort=="" || String(Number(plz))=="NaN" || plz.length<4 || plz.length>5) {
                geocodeValidation="Incomplete";
              }else{
                geocodeValidation="Complete";
              }
              geocodeQuerys[i] = geocodeValidation + "*" +str + "*" + hnr + "*" + adrzusatz + "*" + plz + "*" + ort;
              str="";
              hnr="";
              plz="";
              ort="";
              adrzusatz="";
            }
            BatchGeocodingPart3();  //Weiter mit Abgleich in DB
            break;
  }
}

//********************************************************************************************************************************************************
// Kontrollausgabe von geocodeQuerys
//********************************************************************************************************************************************************
function showAlert() {
  var output="";
  for (var i=0; i <= geocodeQuerys.length-1; i++) {
      output = output + "\n" + geocodeQuerys[i];
  }
  alert(output);
}

//********************************************************************************************************************************************************
// Grossschreib-Überprüfung
//********************************************************************************************************************************************************
function checkCapital(word) {
    // Wandelt das 1. Zeichen eines Strings in einen Grossbuchstaben, den Rest in Kleinbuchstaben um
    var correctWord
    var firstLetter =  word.substring(0, 1);
    var followingLetters = word.substring(1);
    firstLetter = firstLetter.toUpperCase();
    correctWord = firstLetter + followingLetters;
    return correctWord;
}
//********************************************************************************************************************************************************
// Ganzzahl-Überprüfung
//********************************************************************************************************************************************************
function isNotGanzzahl(wert) {
  if (isNaN(wert)) {
    return true;
  }else{
    if (wert.indexOf(".")==-1) {
      return false;
    }else{
      return true;
    }
  }
}

//********************************************************************************************************************************************************
// Schneidet einen String aufgrund der Formatierungs-Einstellungen zurecht
//********************************************************************************************************************************************************
function cutString(mytext) {
  var replaced = false;
  //Ersetzt Anführungszeichen am String-Anfang und -Ende durch Nichts ('"'-->'')
  var searchString = '"';
  if (mytext.charAt(0)==searchString) {
    mytext=mytext.substring(1);
    replaced = true;
  }
  if (mytext.charAt(mytext.length-1)==searchString) {
    mytext=mytext.substring(0,mytext.length-1);
    replaced = true;
  }
  //Ersetzt Anführungszeichen am String-Anfang und -Ende durch Nichts ('''-->'')
  searchString = "'";
  if (mytext.charAt(0)==searchString) {
    mytext=mytext.substring(1);
    replaced = true;
  }
  if (mytext.charAt(mytext.length-1)==searchString) {
    mytext=mytext.substring(0,mytext.length-1);
    replaced = true;
  }
  //Ersetzt Leerzeichen am String-Anfang und -Ende durch Nichts (' '-->'')
  searchString = ' ';
  if (mytext.charAt(0)==searchString) {
    mytext=mytext.substring(1);
    replaced = true;
  }
  if (mytext.charAt(mytext.length-1)==searchString) {
    mytext=mytext.substring(0,mytext.length-1);
    replaced = true;
  }
  //Ersetzt CharCode 13 am String-Anfang und -Ende durch Nichts ('X'-->'')
  searchString = String.fromCharCode(13);
  if (mytext.charAt(0)==searchString) {
    mytext=mytext.substring(1);
    replaced = true;
  }
  if (mytext.charAt(mytext.length-1)==searchString) {
    mytext=mytext.substring(0,mytext.length-1);
    replaced = true;
  }
  if(replaced == true) {
    mytext=cutString(mytext);
  }
  return mytext;
}

//********************************************************************************************************************************************************
// Überprüft, ob der Geocode in der DB bereits existiert
//********************************************************************************************************************************************************
function checkIfAlreadyExist(i, maxI) {
	if (i<=maxI) {
    showProcessing("Abgleich mit Datenbank", "3 / 4", i+1 +" / "+ geocodeQuerys.length);
    var columns = geocodeQuerys[i].split("*");
    if (columns[0]=="Complete") {
      var getVars = "?str=" + columns[1]
        + "&hnr=" + columns[2]
        + "&adrzusatz=" + columns[3]
        + "&plz=" + columns[4]
        + "&ort=" + columns[5]
        + "&browser=" + BrowserDetect.browser
        + "&version=" + BrowserDetect.version;
	     
       // http://www.openaddresses.ch/de/checkOnExisting.php?str=bahnhofstrasse&hnr=43&adrzusatz=&plz=4132&ort=Muttenz&browser=Firefox&version=3
	   var request = createXmlHttpRequestObject();
      if (request.readyState == 4 || request.readyState == 0){
        request.open('GET', 'checkOnExisting.php'+ getVars, true);

	  //tell the request what to do when the state changes.
	  request.onreadystatechange = function() {
		  
	    if (request.readyState == 4) {
            if (request.status == 200){
			  var xml = request.responseXML;

              if(xml) {
                  //Namen entsprechen den columnsnamen in der DB
                  punkte = xml.getElementsByTagName("pnt");
                  hoch = xml.getElementsByTagName("hoch");
                  rechts = xml.getElementsByTagName("rechts");

                  if(punkte.length>0) {
                      lat = hoch[0].firstChild.data;
                      lng = rechts[0].firstChild.data;
                      columns[0]="AlreadyExist";
                  }else{
                      columns[0]="DontExist";
                      if (FileFormat=="Mobile") {
                        columns[0]="MobileGeocoded";
                        lat=columns[6];
                        lng=columns[7];
                      }else{
                        lat="";
                        lng="";
                      }
                  }
                  geocodeQuerys[i]= columns[0] + "*" + columns[1] + "*" + columns[2] + "*" + columns[3] + "*" + columns[4] + "*" + columns[5] + "*" + lat + "*" + lng;
                  i=i+1;
                  checkIfAlreadyExist(i, maxI);
              } //if
            } //if
          } //if
        } //function
        request.send(null);
      } //if
    }else{
      i=i+1;
      checkIfAlreadyExist(i, maxI);
    }
  }else{
    //Weiter mit Geokodierung
    geocodeQuerysIndex=-1;
    updateCounters();
    BatchGeocodingPart4();
  }
}

//********************************************************************************************************************************************************
// Geokodierung mit Google Maps ClientGeocoder
//********************************************************************************************************************************************************
function doGeocoding() {
  
  geocodeQuerysIndex=geocodeQuerysIndex+1;
  showProcessing("Prov. Geokodierung läuft", "4 / 4", geocodeQuerysIndex+1 +" / "+ geocodeQuerys.length);
  var address;        
    columns = geocodeQuerys[geocodeQuerysIndex].split("*");
    if (columns[0]=="DontExist" || columns[0]=="Incomplete") {
      zustand = columns[0];         
      var str = columns[1];
      var hnr = columns[2];
      var adrzusatz = columns[3];
      var plz = columns[4];
      var ort = columns[5];
      var address = str + " " + hnr + " " + plz + " " + ort;
      var validation;
      var lat;
      var lng;
      var geo = new GClientGeocoder();

      // ====== Perform the Geocoding ======
        // Viewport für Suche auf ganze Schweiz setzten
        //var southwest = new GLatLng(45.81827218518002, 5.9497833251953125);
        //var northeast = new GLatLng(47.81038774105833, 10.498123168945312);
        // Viewport für Suche auf ganzen Deutschsprachigen Raum setzten
        var southwest = new GLatLng(45, 5);
        var northeast = new GLatLng(55, 17);
        var bounds = new GLatLngBounds(southwest, northeast);
        geo.setViewport(bounds);

        //geo.getLatLng( address + ", Schweiz", function(point) {
        geo.getLatLng( address , function(point) {
          if (!point) {
            if (zustand=="DontExist") {
              validation="NotGeocoded";
            }else{
              validation="Incomplete";
            }
            lat="";
            lng="";
          }else{
            if (zustand=="DontExist") {
              validation="Geocoded";
            }else{
              validation="Incomplete";
            }
            lat=point.lat();
            lng=point.lng();
          }
          geocodeQuerys[geocodeQuerysIndex]= validation + "*" + str + "*" + hnr + "*" + adrzusatz + "*" + plz + "*" + ort + "*" + lat + "*" + lng;
          updateCounters();
          if (geocodeQuerysIndex < geocodeQuerys.length-1) {
            doGeocoding();
          } else {
            BatchGeocodingPart5();
          }
        });
    } else {   // Geocode "already Exist"
      if (geocodeQuerysIndex < geocodeQuerys.length-1) {
        doGeocoding();
      } else {
        BatchGeocodingPart5();
      }
    }//if

}

//********************************************************************************************************************************************************
// Update der ListenCounter
//********************************************************************************************************************************************************
function updateCounters() {
  var summe = 0;
  var count;
  count = CountListEntries("Geocoded", "MobileGeocoded");
  document.getElementById("Count1").innerHTML = count;
  if (count==0) {document.getElementById("Image1").src="img/ok.GIF";}else{document.getElementById("Image1").src="img/redList.GIF";}
  summe= summe + count;
  count = CountListEntries("NotGeocoded", "NotGeocoded");
  document.getElementById("Count2").innerHTML = count;
  if (count==0) {document.getElementById("Image2").src="img/ok.GIF";}else{document.getElementById("Image2").src="img/redList.GIF";}
  summe= summe + count;
  count = CountListEntries("Incomplete", "MobileIncomplete");
  document.getElementById("Count3").innerHTML = count;
  if (count==0) {document.getElementById("Image3").src="img/ok.GIF";}else{document.getElementById("Image3").src="img/redList.GIF";}
  summe= summe + count;
  count = CountListEntries("Finished", "Finished");
  document.getElementById("Count4").innerHTML = count;
  summe= summe + count;
  count = CountListEntries("AlreadyExist", "AlreadyExist");
  document.getElementById("Count5").innerHTML = count;
  summe= summe + count;
  document.getElementById("Count6").innerHTML = "<b>" + summe + "</b>";
}

//********************************************************************************************************************************************************
// Zählen der Listeneinträge
//********************************************************************************************************************************************************
function CountListEntries(Status1, Status2) {
  var count=0;
  for (var i=0; i <= geocodeQuerys.length-1; i++) {
    columns = geocodeQuerys[i].split("*");
    if (columns[0]==Status1 || columns[0]==Status2) {
      count=count+1;
    }
  }
  return count;
}

//********************************************************************************************************************************************************
// Marker zeichnen
//********************************************************************************************************************************************************
function drawMarkers() {
  for (var i=0; i <= geocodeQuerys.length-1; i++) {
    columns = geocodeQuerys[i].split("*");
    if (columns[0]=="AlreadyExist" && columns[6]!="" && columns[7]!="") {
      var html = '<table bgcolor="#FFFFFF" id="gm_infowin" cellspacing="1" cellpadding="0"><tr><td><b>Strasse:</b></td><td>'
             + columns[1]
      	     + '</td></tr><tr><td><b>Hausnummer:</b></td><td>'
             + columns[2]
             + '</td></tr><tr><td><b>Adresszusatz:</b></td><td>'
             + columns[3]
             + '</td></tr><tr><td><b>PLZ:</b></td><td>'
             + columns[4]
             + '</td></tr><tr><td><b>Ort:</b></td><td>'
             + columns[5]
             + '</td></tr></table>';
      marker = createBatchMarker(columns[6], columns[7], html, blueIcon, columns[1]+", "+columns[2]+", "+columns[3]+", "+columns[4]+", "+columns[5], false, i);
      batchmap.addOverlay(marker);
    }
    if (FileFormat=="Mobile"){
      switch (columns[0]) {
        
        case "MobileGeocoded":
          var html = '<table bgcolor="#FFFFFF" id="gm_infowin" cellspacing="1" cellpadding="0"><tr><td><b>Strasse:</b></td><td>'
             + columns[1]
      	     + '</td></tr><tr><td><b>Hausnummer:</b></td><td>'
             + columns[2]
             + '</td></tr><tr><td><b>Adresszusatz:</b></td><td>'
             + columns[3]
             + '</td></tr><tr><td><b>PLZ:</b></td><td>'
             + columns[4]
             + '</td></tr><tr><td><b>Ort:</b></td><td>'
             + columns[5]
             + '</td></tr></table>';
          marker = createBatchMarker(columns[6], columns[7], html, redIcon, columns[1]+", "+columns[2]+", "+columns[3]+", "+columns[4]+", "+columns[5], true, i);
          //GEvent.addListener(marker, "dragend", function() {
          //  alert("Dragend a Geocoded marker");
          //});
          batchmap.addOverlay(marker);
          break;

        case "MobileIncomplete":
          var html = '<table><tr><td colspan="2" text="#FFCC99"><b>Adressdatensatz ist unvollständig:<br>Editieren Sie Ihre Upload-Datei<br>und importieren Sie die Liste erneut!<br><br></b></td></tr>'
             +'<tr><td><b>Strasse:</b></td><td>'
             + columns[1]
      	     + '</td></tr><tr><td><b>Hausnummer:</b></td><td>'
             + columns[2]
      	     + '</td></tr><tr><td><b>Adresszusatz:</b></td><td>'
             + columns[3]
             + '</td></tr><tr><td><b>PLZ:</b></td><td>'
             + columns[4]
             + '</td></tr><tr><td><b>Ort:</b></td><td>'
             + columns[5]
             + '</td></tr></table>';
          marker = createBatchMarker(columns[6], columns[7], html, orangeIcon, columns[1]+", "+columns[2]+", "+columns[3]+", "+columns[4]+", "+columns[5], false, i);
          batchmap.addOverlay(marker);
          break;
      }
    }
  }
}

//********************************************************************************************************************************************************
// Create-Marker-Funktion
//********************************************************************************************************************************************************
function createBatchMarker(lat, lng, html, icon, tooltiptext, draggable, id) {
	var marker = new GMarker(new GLatLng(lat,lng), {icon:icon, draggable:draggable});
        marker.title = tooltiptext;
        marker.id = id;

// Our info window content - für 1 Registerkarte
        var infoTabs = [
          new GInfoWindowTab("Tab #1", html)
        ];
	GEvent.addListener(marker, 'click', function() {
	  marker.openInfoWindowHtml(html);
        });
        //Funktionen für Verschieben der Marker
        GEvent.addListener(marker, "dragstart", function() {
          document.getElementById("tooltip2").style.visibility="hidden";
        });
        GEvent.addListener(marker, "dragend", function() {
          if (FileFormat=="Mobile"){
            dragendMobileMarker(lat, lng, html, marker);
          }else{
            dragendMarker(lat, lng, html, marker);
          }
        });
        GEvent.addListener(marker,"mouseover", function() {
          showTooltipDiv(marker);
        });
        GEvent.addListener(marker,"mouseout", function() {
          document.getElementById("tooltip2").style.visibility="hidden";
        });
	return marker;
}

//********************************************************************************************************************************************************
// Create-Icon-Funktion
//********************************************************************************************************************************************************
function createNewIcon(image) {
  var icon = new GIcon();
  icon.image = image;
  icon.iconSize = new GSize(15, 15);
  icon.iconAnchor = new GPoint(7.5, 7.5);
  icon.infoWindowAnchor = new GPoint(7.5, 7.5);
  icon.dragCrossImage = "img/cross.PNG";
  icon.dragCrossSize = new GSize(15, 15);
  icon.maxHeight = 20
  icon.dragCrossAnchor = new GPoint(7.5, 7.5);
  return icon;
}

//********************************************************************************************************************************************************
// Tooltip-Funktion
//********************************************************************************************************************************************************
function showTooltipDiv(marker) {
      	document.getElementById("tooltip2").innerHTML = marker.title;
	var markerAnchor=batchmap.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),batchmap.getZoom());    //PixelPosition des Markers
        var west = batchmap.getBounds().getSouthWest().lng();
        var north = batchmap.getBounds().getNorthEast().lat();
        var northWest = new GLatLng(north, west);
        var northWestXY = batchmap.getCurrentMapType().getProjection().fromLatLngToPixel(northWest,batchmap.getZoom());  //PixelPosition der Linkenoberen Kartenecke
        var delta = new GPoint(markerAnchor.x - northWestXY.x, markerAnchor.y - northWestXY.y);
        var tooltipAnchor = new GSize(delta.x+390, delta.y+45);    //Korrektur der Pixelposition durch linke obere DIV-Tag-Ecke
        var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, tooltipAnchor);
        pos.apply(document.getElementById("tooltip2"));
	document.getElementById("tooltip2").style.visibility="visible";
}

//********************************************************************************************************************************************************
// Fügt die anzuzeigenden Einträge in das Listenfeld ein
//********************************************************************************************************************************************************
function showList(ListId, ListId2) {
  //Liste leeren
  var maxI = document.getElementById("ResultList").length-1;
  for (var i=0; i <= maxI; i++) {
    document.getElementById("ResultList").remove(0);
  }

  //Liste füllen
  for (var i=0; i <= geocodeQuerys.length-1; i++) {
    columns  = geocodeQuerys[i].split("*");
    if (columns[0]==ListId || columns[0]==ListId2) {
      List=document.getElementById("ResultList");
      newOption = document.createElement("option");
      newOption.appendChild(document.createTextNode(columns[1] + ", " + columns[2]  + ", " + columns[3]  + ", " + columns[4] + ", " + columns[5]));
      newOption.value = i;
      List.appendChild(newOption);
    }
  }
  
  //Titel der Liste anpassen
  switch (ListId) {
    case "Geocoded":
      document.getElementById("ListHeader").innerHTML = "LISTE: Provisorisch geokodierte Adressen";
      break;    
    case "NotGeocoded":
      document.getElementById("ListHeader").innerHTML = "LISTE: Nicht auto. geokodierbare Adressen";
      break;
    case "Incomplete":
      document.getElementById("ListHeader").innerHTML = "LISTE: Unvollständige/inkorrekte Adressen";
      break;
    case "Finished":
      document.getElementById("ListHeader").innerHTML = "LISTE: Neue vollständige Adressen";
      break;
    case "AlreadyExist":
      document.getElementById("ListHeader").innerHTML = "LISTE: Bereits existierende Adressen";
      break;
  }

  // Disabled the 'btnShowInMap'-Button
  document.getElementById("btnShowInMap").disabled=true;
}

//********************************************************************************************************************************************************
// Enables the 'btnShowInMap'-Button
//********************************************************************************************************************************************************
function enabledBtn() {
  document.getElementById("btnShowInMap").disabled=false;
}

//********************************************************************************************************************************************************
// Checkt ob der Listeneintrag gekodiert ist oder nicht
//********************************************************************************************************************************************************
function checkIfGeocoded(OptionValue) {
  columns = geocodeQuerys[OptionValue].split("*");
  if (columns[6]!="" && columns[7]!="" ) {
    var zoomLevel = batchmap.getZoom();
    if (zoomLevel < 17) {zoomLevel = 17;}
    var center = new GLatLng(columns[6], columns[7]);
    batchmap.setCenter(center, zoomLevel);
    PositionCursorInitial(center.lat(), center.lng());
  }else{
    alert("Ausgewählte Adresse hat keine provisorische Geokodierung.\nGeokodieren Sie die Adresse manuell und vervollständigen Sie diese allenfalls!");
  }
}

//********************************************************************************************************************************************************
// Blink-Funktionen
//********************************************************************************************************************************************************
function PositionCursorInitial(lat, lng) {
   BlinkCounter=0;
   BlinkMarkerLatLng = new GLatLng(lat, lng);
   aktivBlink = window.setInterval("PositionCursor();", 250);
}

function PositionCursor() {
  switch (BlinkCounter) {
    case 1:
      var blinkIcon = createBlinkIcon("img/Ring1.PNG");
      BlinkMarker = new GMarker(BlinkMarkerLatLng, blinkIcon);
      batchmap.addOverlay(BlinkMarker);
      break;
    case 2:
      batchmap.removeOverlay(BlinkMarker);
      var blinkIcon = createBlinkIcon("img/Ring2.PNG");
      BlinkMarker = new GMarker(BlinkMarkerLatLng, blinkIcon);
      batchmap.addOverlay(BlinkMarker);
      break;
    case 3:
      batchmap.removeOverlay(BlinkMarker);
      var blinkIcon = createBlinkIcon("img/Ring3.PNG");
      BlinkMarker = new GMarker(BlinkMarkerLatLng, blinkIcon);
      batchmap.addOverlay(BlinkMarker);
      break;
    case 4:
      batchmap.removeOverlay(BlinkMarker);
      var blinkIcon = createBlinkIcon("img/Ring4.PNG");
      BlinkMarker = new GMarker(BlinkMarkerLatLng, blinkIcon);
      batchmap.addOverlay(BlinkMarker);
      break;
    case 5:
      batchmap.removeOverlay(BlinkMarker);
      var blinkIcon = createBlinkIcon("img/Ring5.PNG");
      BlinkMarker = new GMarker(BlinkMarkerLatLng, blinkIcon);
      batchmap.addOverlay(BlinkMarker);
      break;
    case 6:
      batchmap.removeOverlay(BlinkMarker);
      window.clearInterval(aktivBlink);
      return;
      break;
  }
  BlinkCounter = BlinkCounter + 1;
}

//*******************************************************************************************************************************************************
// Open-Digitize-InfoWindow for Map-Click-Listener
//*******************************************************************************************************************************************************
function openBatchDigitizeWindow(overlay, latlng, columns) {
      //nur digitalisieren, wenn Zoomlevel iO und noch kein Marker vorhanden (!Overlay)
      if(batchmap.getZoom() <= 16) {
       return;
      }
       if(!overlay) {
         //create an HTML DOM form element
    	 var inputForm = document.createElement("form");
    	 inputForm.setAttribute("action","");
    	 inputForm.onsubmit = function() {saveMarker(); return false;};

    	 //retrieve the longitude and lattitude of the click point
    	 var lng = latlng.lng();
    	 var lat = latlng.lat();

         PositionCursorInitial(lat, lng);

    	//Werte aus geocodeQuery übernehmen
    	var str = columns[1];
    	var hnr = columns[2];
    	var adrzusatz = columns[3];
        var plz = columns[4];
    	var ort = columns[5];
    	var usr = document.getElementById("InputUSR2").value;

    	inputForm.innerHTML = '<table bgcolor="#FFFFFF" id="gm_infowin" ><tr><td colspan="2" bgcolor="#DAE0D2" style="font-weight:bold">NEUE ADRESSE</td></tr>'
                            + '<tr><td>Strasse:</td>'
                            + '<td><input type="text" value="' + str + '" id="newStr" style="width:160px;"/></td></tr>'
                            + '<tr><td>Hausnummer:</td>'
    			    + '<td><input type="text" value="' + hnr + '" id="newHnr" style="width:50px;"/></td></tr>'
                            + '<tr><td>Adresszusatz: </td>'
                            + '<td><input type="text" value="' + adrzusatz + '" id="newAdrzusatz" style="width:160px;"/></td></tr>'
    			    + '<tr><td>PLZ:</td>'
                            + '<td><input type="text" value="' + plz + '" id="newPLZ" style="width:50px;"/></td></tr>'
    			    + '<tr><td>Ort:</td>'
                            + '<td><input type="text" value="' + ort + '" id="newOrt" style="width:160px;"/></td></tr>'
                            + '<tr><td>Erfasser:</td>'
                            + '<td><input type="text" value="' + usr + '" id="newUsr" style="width:160px;"/></td></tr>'
                            + '<tr><td colspan="2">'
    			    + '<input type="submit" value="Speichern"/>'
    			    + '<input type="hidden" id="newLng" value="' + lng + '"/>'
    			    + '<input type="hidden" id="newLat" value="' + lat + '"/>'
    			    + '</td></tr></table>';

        batchmap.openInfoWindow(latlng,inputForm);
     }
}

//********************************************************************************************************************************************************
// Marker-Speicher-Funktion
//********************************************************************************************************************************************************
function saveMarker(){
  //InputCheck
  if (checkIsNotEmty("newStr", "Strasse")==false) return;
  if (checkIsNotEmty("newHnr", "Hausnummer")==false) return;
  if (checkIsNotEmty("newPLZ", "PLZ")==false) return;
  if (checkIsNotEmty("newOrt", "Ort")==false) return;
  if (checkIsNotEmty("newUsr", "Erfasser")==false) return;
  //Check PLZ auf 4-stellig
  if (checkPLZ("newPLZ")==false) return;

  var str = document.getElementById("newStr").value;
  var hnr = document.getElementById("newHnr").value;
  var plz = document.getElementById("newPLZ").value;
  var ort = document.getElementById("newOrt").value;
  var lng = document.getElementById("newLng").value;
  var lat = document.getElementById("newLat").value;
  var usr = document.getElementById("newUsr").value;
  var adrzusatz = document.getElementById("newAdrzusatz").value;
  if (adrzusatz == "") adrzusatz = "-";

  // Check if the Geocode already exist
  var getVars = "?str=" + str
        + "&hnr=" + hnr
        + "&adrzusatz="
        + "&plz=" + plz
        + "&ort=" + ort
        + "&browser=" + BrowserDetect.browser
        + "&version=" + BrowserDetect.version;

  var request = GXmlHttp.create();
  if (request.readyState == 4 || request.readyState == 0){
    request.open('GET', 'checkOnExisting.php'+ getVars, true);

    //tell the request what to do when the state changes.
    request.onreadystatechange = function() {
    if (request.readyState == 4) {
      if (request.status == 200){
        var xmlResponse = request.responseXML.documentElement;
        var xml = request.responseXML;
        if(xml) {
          //Namen entsprechen den columnsnamen in der DB
          punkte = xml.getElementsByTagName("pnt");
          hoch = xml.getElementsByTagName("hoch");
          rechts = xml.getElementsByTagName("rechts");

          if(punkte.length>0) {  //Geocode existiert bereits in DB
            lat = hoch[0].firstChild.data;
            lng = rechts[0].firstChild.data;

            alert ("Datensatz nicht gespeichert. Ein Datensatz mit der Adresse " + str + " " + hnr + ", " + plz + " " + ort + " existiert bereits!");

              batchmap.closeInfoWindow();   /*
              var html = '<table bgcolor="#FFFFFF" id="gm_infowin" cellspacing="1" cellpadding="0"><tr><td><b>Strasse:</b></td><td>'
                       + str
      	               + '</td></tr><tr><td><b>Hausnummer:</b></td><td>'
                       + hnr
                       + '</td></tr><tr><td><b>Adresszusatz:</b></td><td>'
                       + adrzsuatz
                       + '</td></tr><tr><td><b>PLZ:</b></td><td>'
                       + plz
                       + '</td></tr><tr><td><b>Ort:</b></td><td>'
                       + ort
                       + '</td></tr></table>';
              marker = createBatchMarker(lat, lng, html, blueIcon, str+", "+hnr+", "+adrzusatz+", "+plz+", "+ort, false, "fromDB");
              batchmap.addOverlay(marker);   */
              batchmap.setCenter(new GLatLng(lat, lng));
              PositionCursorInitial(lat, lng);
              return;
            //}else{
            //  batchmap.closeInfoWindow();
            //  return;
            //} //if
          }else{  //Geocode exisitert noch nicht in DB

              //Speichere Geocode in DB
              getVars =  "?str=" + str
              + "&hnr=" + hnr
              + "&adrzusatz=" + adrzusatz
              + "&plz=" + plz
              + "&ort=" + ort
              + "&usr=" + usr
              + "&lng=" + lng
              + "&lat=" + lat
              + "&browser=" + BrowserDetect.browser
              + "&version=" + BrowserDetect.version;
            
              var request2 = GXmlHttp.create();
              //open the request to storeMakres.php on your server
              request2.open('GET', 'storeBatchMarker.php' + getVars, true);
              request2.onreadystatechange = function() {
                if (request2.readyState == 4) {
                    //the request2 in complete
                    var xmlDoc = request2.responseXML;
                    //retrieve the root document element (response)
                    var responseNode = xmlDoc.documentElement;
                    //retrieve the type attribute of the node
                    var type = responseNode.getAttribute("type");
                    //retrieve the content of the responseNode
                    var content = responseNode.firstChild.nodeValue;
                    //check to see if it was an error or success
                    if(type!='success') {
                      alert(content);
                    } else {
                      //display a marker
                      var html = '<table bgcolor="#FFFFFF" id="gm_infowin" cellspacing="1" cellpadding="0"><tr><td><b>Strasse:</b></td><td>'
                      + str
                      + '</td></tr><tr><td><b>Hausnummer:</b></td><td>'
                      + hnr
                      + '</td></tr><tr><td><b>Adresszusatz:</b></td><td>'
                      + adrzusatz
                      + '</td></tr><tr><td><b>PLZ:</b></td><td>'
                      + plz
                      + '</td></tr><tr><td><b>Ort:</b></td><td>'
                      + ort
                      + '</td></tr></table>';
                      marker = createBatchMarker(lat, lng, html, greenIcon, str+", "+hnr+", "+adrzusatz+", "+plz+", "+ort, true, "digitalized");
                      batchmap.addOverlay(marker);
                      batchmap.closeInfoWindow();

                      //Update geocodeQuerys
                      var geocodeQuerysIndex = document.getElementById('ResultList').options[document.getElementById('ResultList').selectedIndex].value
                      var columns = geocodeQuerys[geocodeQuerysIndex].split("*");
                      var currentListId = columns[0];
                      geocodeQuerys[geocodeQuerysIndex] = "Finished"+"*"+str+"*"+hnr+"*"+adrzusatz+"*"+plz+"*"+ort+"*"+lat+"*"+lng;

                      optionNr = document.getElementById('ResultList').selectedIndex; //Zwischenspeichern des aktuell ausgewählten Eintrags

                      //reload Entries of ResultList
                      showList(currentListId);
                      updateCounters();

                      //Anspingen des oberen Nachbars des zuvor ausgewählten Listeneintrags
                      if (document.getElementById('ResultList').options.length!=0) {         //Liste hat Einträge
                        if(document.getElementById('ResultList').options.length==1) {           //Liste hat 1 Eintrag
                          //alert("Liste hat 1 Eintrag");
                          document.getElementById('ResultList').selectedIndex=0;
                          enabledBtn();
                        }else{                                                                 //Liste hat mehrere Einträge
                          if(optionNr==document.getElementById('ResultList').options.length){    //Letzter Eintrag war selektiert
                            //alert("Letzter Eintrag war selektiert");
                            document.getElementById('ResultList').selectedIndex=optionNr-1;
                            enabledBtn();
                          }else{                                                                 //Erster oder ein mittlerer Eintrag war selktiert
                            //alert("Erster oder mittlerer Eintrag war selktiert");
                            document.getElementById('ResultList').selectedIndex=optionNr;
                            enabledBtn();
                          }
                        }
                      }
                    } //else
                } //if
              } // function
              request2.send(null);
              return false;
          } //else
        } //if
      } //if
    } //if
    } //function
  request.send(null);
  } //if
}

//********************************************************************************************************************************************************
// Marker wurde verschoben --> Update der DB
//********************************************************************************************************************************************************
function dragendMarker(oldlat, oldlng, html, marker){
  if (confirm("Wollen Sie den Standort der Adresse wirklich verschieben?")) {   // Bestätigungsanfrage, ja der Marker soll versetzt werden

    var markerpt = marker.getPoint();   //neue Koordinaten
    var lng = markerpt.lng();
    var lat = markerpt.lat();

    var splited = marker.title.split(", ");
    var str = splited[0];
    var hnr = splited[1];
    var adrzusatz = splited[2];
    var plz = splited[3];
    var ort = splited[4];

    var usr = document.getElementById("InputUSR2").value;
    if(usr=="") {
      alert("Für Datenänderungen muss der Benutzername eingetragen sein!");
      marker.setPoint(new GLatLng(oldlat, oldlng));
      return;
    }

    var getVars = "?lng=" + lng + "&lat=" + lat + "&str=" + str + "&hnr=" + hnr + "&adrzusatz=" + adrzusatz + "&plz=" + plz + "&ort=" + ort + "&typ=update" + "&oldlng=" + oldlng + "&oldlat=" + oldlat + "&usr=" + usr + "&browser=" + BrowserDetect.browser + "&version=" + BrowserDetect.version;
    var request = GXmlHttp.create();

    request.open('GET', 'updateBatchMarker.php' + getVars, true);
    request.onreadystatechange = function() {
    if (request.readyState == 4) {
      //the request in complete
      var xmlDoc = request.responseXML;
      //retrieve the root document element (response)
      var responseNode = xmlDoc.documentElement;
      //retrieve the type attribute of the node
      var type = responseNode.getAttribute("type");
      //retrieve the content of the responseNode
      var content = responseNode.firstChild.nodeValue;
      //check to see if it was an error or success
      if(type!='success') {
        alert(content);
      }
    }
    }
    request.send(null);
  }else{      // nein, der Marker soll nicht verschoben werden
    marker.setPoint(new GLatLng(oldlat, oldlng));
  }
}
//********************************************************************************************************************************************************

function dragendMobileMarker(oldlat, oldlng, html, marker){
    var markerpt = marker.getPoint();   //neue Koordinaten
    var lng = markerpt.lng();
    var lat = markerpt.lat();

    var splited = marker.title.split(", ");
    var str = splited[0];
    var hnr = splited[1];
    var adrzusatz = splited[2]
    var plz = splited[3];
    var ort = splited[4];

    var usr = document.getElementById("InputUSR2").value;
    if(usr=="") {
      alert("Für Datenänderungen muss der Benutzername eingetragen sein!");
      marker.setPoint(new GLatLng(oldlat, oldlng));
      return;
    }
    
    // Roter Marker löschen und durch blauen ersetzten
    map.removeOverlay(marker);
    var html = '<table bgcolor="#FFFFFF" id="gm_infowin" cellspacing="1" cellpadding="0"><tr><td><b>Strasse:</b></td><td>'
             + str
      	     + '</td></tr><tr><td><b>Hausnummer:</b></td><td>'
             + hnr
      	     + '</td></tr><tr><td><b>Adresszusatz:</b></td><td>'
             + adrzusatz
             + '</td></tr><tr><td><b>PLZ:</b></td><td>'
             + plz
             + '</td></tr><tr><td><b>Ort:</b></td><td>'
             + ort
             + '</td></tr></table>';
    marker = createBatchMarker(lat, lng, html, greenIcon, str+", "+hnr+", "+adrzusatz+", "+plz+", "+ort, false, marker.id);
    batchmap.addOverlay(marker);

    //DB-Eintrag
    var getVars = "?lng=" + lng + "&lat=" + lat + "&str=" + str + "&hnr=" + hnr + "&adrzusatz=" + adrzusatz + "&plz=" + plz + "&ort=" + ort + "&typ=update" + "&oldlng=" + oldlng + "&oldlat=" + oldlat + "&usr=" + usr + "&browser=" + BrowserDetect.browser + "&version=" + BrowserDetect.version;
    var request = GXmlHttp.create();

    request.open('GET', 'storeMobileMarker.php' + getVars, true);
    request.onreadystatechange = function() {
      if (request.readyState == 4) {
        //the request in complete
        var xmlDoc = request.responseXML;
        //retrieve the root document element (response)
        var responseNode = xmlDoc.documentElement;
        //retrieve the type attribute of the node
        var type = responseNode.getAttribute("type");
        //retrieve the content of the responseNode
        var content = responseNode.firstChild.nodeValue;
        //check to see if it was an error or success
        if(type!='success') {
          alert(content);
        }
      }
    }
    request.send(null);


    //Update geocodeQuerys
      var geocodeQuerysIndex = marker.id;
      var columns = geocodeQuerys[geocodeQuerysIndex].split("*");
      var currentListId = columns[0];
      geocodeQuerys[geocodeQuerysIndex] = "Finished"+"*"+str+"*"+hnr+"*"+adrzusatz+"*"+plz+"*"+ort+"*"+lat+"*"+lng+"*"+marker.id;

      optionNr = document.getElementById('ResultList').selectedIndex; //Zwischenspeichern des aktuell ausgewählten Eintrags

      //reload Entries of ResultList
      showList(currentListId);
      updateCounters();

      //Anspingen des oberen Nachbars des zuvor ausgewählten Listeneintrags
      if (document.getElementById('ResultList').options.length!=0) {         //Liste hat Einträge
        if(document.getElementById('ResultList').options.length==1) {           //Liste hat 1 Eintrag
          //alert("Liste hat 1 Eintrag");
          document.getElementById('ResultList').selectedIndex=0;
          enabledBtn();
        }else{                                                                 //Liste hat mehrere Einträge
          if(optionNr==document.getElementById('ResultList').options.length){    //Letzter Eintrag war selektiert
            //alert("Letzter Eintrag war selektiert");
            document.getElementById('ResultList').selectedIndex=optionNr-1;
            enabledBtn();
          }else{                                                                 //Erster oder ein mittlerer Eintrag war selktiert
            //alert("Erster oder mittlerer Eintrag war selktiert");
            document.getElementById('ResultList').selectedIndex=optionNr;
            enabledBtn();
          }
        }
      }
}

//********************************************************************************************************************************************************
// Zeige Beispieldateien
//********************************************************************************************************************************************************
function showExample(HTMLFile) {
     InfoWindow = window.open(HTMLFile, "Infowindow", "location=no,width=600,height=800,left=100,top=100");
     InfoWindow.focus();
}

function hideExample() {
  document.getElementById("Example").style.visibility = "hidden";
}