/**
 * Skript fuer den Aufruf des GeoServlets (Suche nach PLZ) bzw. des OrtGeoServlets (Suche nach Ort). Danach
 * erfolgt der Aufruf des MainServlets mit den gelieferten Koordinaten als Parameter. Ggf. muss bei
 * der Ortssuche  ein Auswahl getroffen werden.
 */

/* 
 * globale Variablen 
 */
var fehlermeldung = "";

//Wird nach einem MultiResponse auf true gesetzt,
//damit nicht wieder die erste option des selected-Feldes geloescht wird
//und so falsche Ergebnisse geliefert werden
var multiresponse = false;

/* 
 * Array fuer die geparsten Adressen 
 */
var arrAdressen = new Array();

/* 
 * Adressen Objekt  (ohne Strasse und HausNr)
 */
function Adresse(){
	this.land="";
	this.plz="";
	this.ort="";
	this.xpos=0.0;
	this.ypos=0.0;
	this.lccx=0.0;
	this.lccy=0.0;
}

/*
 * Setzt in Abhaengigkeit der Checkbox den Slider aktiv bzw. passiv.
 */
function changeCheckbox(chkbox){
	if (chkbox.checked) { 
		$('#slider1').slider('enable');
	} else { 
		$('#slider1').slider('moveTo', 0); 
		$('#slider1').slider('disable');
	}
}

/* 
 * Beim Submit des Formulars wird ueberprueft, ob die Umkreissuche durchgefuehrt werden soll.
 * Falls ja, dann wird das Plz-Ort-Feld validiert und ein Service fuer die Ermittlung der Koordinaten aufgerufen.
 * 
 */
function checkUmkreissuche(formular,Land,origPlzText,meldung) {
	// fuer standardkonforme HTML-Ausgabe benoetigt ein selected immer eine option
	// option wird ausgegeben, da sie stoert, hier wieder geloescht
	if(multiresponse == false) {
		document.getElementById("selAdresseUmkreis").removeChild(document.getElementById("selAdresseUmkreis")[0]);
	}
    
	fehlermeldung = meldung;
	// Wert des Sliders in die Checkbox setzen
	formular.umkreis.value = $('#slider1').slider('value', 0);
		
	if (formular.umkreis.checked == true && formular.umkreis.value > 0) {
	  var suchbegriff = formular.plzort.value;
	  var PLZerlaubt = "0123456789";
	  var plzlength = "";
	  var weitereFilter = "";
	  var mycount = 0;
	  if (Land == "DE") {
	    plzlength = 5;
	  } else  { // AT und CH haben nur 4-stellige PLZ
	    plzlength = 4;
	  }
	  if (formular.plzort.value == origPlzText || formular.plzort.value == "") {
		  // es wurde nichts in das PlzOrt-Feld eingetragen
		  return true;
	  }
	  var adrAuswahl = document.getElementById("selAdresseUmkreis");
	  if (adrAuswahl.length > 0) {
		  // Ort ausgewaehlt und Umkreis gesetzt
		  var index = adrAuswahl.selectedIndex < 0 ? 0 : adrAuswahl.selectedIndex;
		  if (parseSingleResponse(adrAuswahl[index].value)) {
			  document.filter.submit();
		  }
		  return false;
	  }

	  // Koordinaten noch unbekannt
	  for (var i = 0; i < formular.plzort.value.length; i++) {
		if (PLZerlaubt.indexOf(formular.plzort.value.charAt(i)) < 0) { // keine Zahl eingegeben
        	/* startet die Ortssuche */
        	httpReq = this.getXmlHttpRequest();
      	  	var uri = encodeURI("/sse/ortgeo?land="+Land+"&suchbegriff="+suchbegriff);
        	httpReq.open("GET", uri, true);
        	httpReq.onreadystatechange= stateCheckerOrt;
        	httpReq.send(null);
        	return false; 
        } else { // PLZ eingegeben
        	mycount++;
        	if (mycount == plzlength) {
        		if (PLZerlaubt.indexOf(formular.plzort.value.charAt(i + 1)) > 0) {
        			//alert("PLZ zu lang");
        			document.filter.plzort.value = fehlermeldung;
        		} else {  
        			var thelast = i + 1;
        			var theplz = formular.plzort.value.substring(0,thelast);
        			formular.plzort.value = theplz;
        			httpReq = this.getXmlHttpRequest();
        			var uri = encodeURI("/sse/GeoServlet?land="+Land+"&plz="+suchbegriff);
        			httpReq.open("GET", uri, true);
        			httpReq.onreadystatechange= stateCheckerPLZ;
        			httpReq.send(null);
        			return false;
        		}  
        	}
        } 
    }  // Ende for
    //alert("Eingabe fehlerhaft");
    document.filter.plzort.value = fehlermeldung;
	//formular.umkreis.value = 0;
	return false;
  }
}

/* ****************************** */
/* Fuer die Umkreissuche nach Ort */

/* wenn der Response geliefert wurde (readyState==4), dann den Response parsen */
function stateCheckerOrt() {
	if (httpReq.readyState==4) {
		parseResponseOrt(httpReq.responseText);
	}
}

/* 
 * parst den uebermittelten String
 */
function parseResponseOrt(res){
  var theEintraege = res.split("\\");
  var AnzahlEintraege = theEintraege.length-1;
  resStatus = theEintraege[0];
  if (resStatus == "NoHit") { // kein Treffer
	document.filter.plzort.value = fehlermeldung;
  }  
  if (resStatus == "Response") { // exakt ein Treffer
	  //alert("single Response: " + theEintraege[1]);
	  if (parseSingleResponse(theEintraege[1])) {
		  document.filter.submit();
	  }
  }  
  if (resStatus == "MultiResponse") { // mehrere Treffer
  	/* loescht eventl. vorhandene Knoten in der dynamischen Adressauswahlbox */
    var selElement = document.getElementById("selAdresseUmkreis");
  	var childElement = selElement[0];
	while(childElement){
	  selElement.removeChild(childElement);
	  childElement = selElement[0];
	}
	/* fuellt das Select-Element mit den SingleResponse */
	for(var i = 1; i < AnzahlEintraege; i++){
		  var SplitEintraege = theEintraege[i].split("\$$2");
		  var thePLZ = SplitEintraege[1];
		  var theOrt = SplitEintraege[2];

		  var opt = document.createElement("option");
		  var txt = document.createTextNode(thePLZ + " " + theOrt);
		  opt.appendChild(txt);
		  opt.value=theEintraege[i];
		  selElement.appendChild(opt);
	  }
	  document.getElementById("sucheUmkreisAuswahl").style.display = "block";
 	  multiresponse = true;
  }  

  
}

/* ****************************** */
/* Fuer die Umkreissuche nach PLZ */


/* wenn der Response geliefert wurde (readyState==4), dann den Response parsen */
function stateCheckerPLZ() {
	if (httpReq.readyState==4) {
		parseResponsePLZ(httpReq.responseText);
	}
}

/* parst den uebermittelten String */
function parseResponsePLZ(res){
  if(res.indexOf("NoHit")>-1) {
	document.filter.plzort.value = fehlermeldung;
  } else {  
    var theEintraege = res.split("\$$1");
    var theFirst = theEintraege[0];
    theFirst = theFirst.split("\$$0");
    theFirst = theFirst[1];
    theFirst = "Response$$0" + theFirst;
   	if (parseSingleResponse(theFirst)) {
   		document.filter.submit();
   	}
  }
}

/* 
 * Parst den "Single" Response vom GeoServlet - koennen Teilmengen des MultiResponse sein.
 */
function parseSingleResponse(res){
	//alert(res);
	arrAdressen = new Array();
	var arr = res.split("$$0");
	//wenn Adressen uebermittelt wurden
	if(arr[1]!='undefined' && arr[1]!=''){
		var arrB = arr[1].split("$$1");
		for(var i=0; i<arrB.length; i++){
			arrAdressen[i] = this.parseAdresse(arrB[i]);
		}
		if(arrAdressen.length==1){
			//wenn Adresse eindeutig, dann die Koordinaten ins Formular schreiben
			document.filter.xpos.value = arrAdressen[0].xpos;
			document.filter.ypos.value = arrAdressen[0].ypos;
			document.filter.lccx.value = arrAdressen[0].lccx;
			document.filter.lccy.value = arrAdressen[0].lccy;
			return true;
		} else if(arrAdressen.length > 1){
			// TODO Auswahl es Ortes
			alert("ort auswaehlen");
		}
	} else {
		if(arr[0]=='NoHit'){
			alert("no Hit");
			// TODO keine Treffer
		} else {
			alert("fehler");
			// TODO Fehler
		}
	}
	return false;
}

/* 
 * parst den durch den Delimiter "$$2" getrennten Adressstring und liefert ein AdressObjekt zurueck
 */
function parseAdresse(strAdresse){
	if(strAdresse!=null && strAdresse.length > 0){
		var AdressObj=new Adresse();
		var arr=strAdresse.split("$$2");
		for(var i=0; i<arr.length; i++){
			switch(i){
			  case 0 : AdressObj.land=arr[i]; break;	
			  case 1 : AdressObj.plz=arr[i]; break;
			  case 2 : AdressObj.ort=arr[i]; break;
			  case 5 : AdressObj.xpos=arr[i]; break;
			  case 6 : AdressObj.ypos=arr[i]; break;
			  case 7 : AdressObj.lccx=arr[i]; break;
			  case 8 : AdressObj.lccy=arr[i]; break;
			}
		}
		return AdressObj;
	}
	return null;
}

/* 
 * liefert in Abhaengigkeit vom verwendeten Browser das XmlHttpRequest 
 */
function getXmlHttpRequest(){
	var xmlhttp=false;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
	 	}
	 }
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
		} catch (e) {
			xmlhttp=false;
		}
	}
	if (!xmlhttp && window.createRequest) {
		try {
			xmlhttp = window.createRequest();
		} catch (e) {
			xmlhttp=false;
		}
	}
	return xmlhttp;
}