Index: trunk/mapbender/http/navn/alkisnav_adr.php
===================================================================
--- trunk/mapbender/http/navn/alkisnav_adr.php	(revision 360)
+++ trunk/mapbender/http/navn/alkisnav_adr.php	(revision 360)
@@ -0,0 +1,395 @@
+<?php
+/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil Adressen-Suche 
+	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
+
+Version vom 
+	2016-02-11	Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
+
+	ToDo:
+	-	Gruppierung (mit Zeile) der StraÃenliste nach Gemeinde
+	-	Eingabe aus "Balken" von Buchauskunft "Lage" zulassen: Numerisch: Gem-Str-Haus-lfd
+		-- lfd (NebengebÃ€ude) als Untergliederung der geklickten Haus-Nr anzeigen
+		Analog zur Zerlegung des FS-Kennz in _fls
+	-	Mouse-Over in StraÃenliste soll Position zeigen.
+		Dazu in der DB eine Tabelle mit Koordinate zum StraÃenschlÃŒssel aufbauen. 
+*/
+
+// Variable Initialisieren
+$str_schl="";
+$skey="";
+
+$cntget = extract($_GET);
+include("../../conf/alkisnav_conf.php");
+include("alkisnav_fkt.php"); // Funktionen
+$con_string = "host=".$host." port=".$port." dbname=".$dbname.$gkz." user=".$user." password=".$password;
+$con = pg_connect ($con_string) or die ("Fehler bei der Verbindung zur Datenbank ".$dbname.$gkz);
+
+echo <<<END
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+	<meta http-equiv="cache-control" content="no-cache">
+	<meta http-equiv="pragma" content="no-cache">
+	<meta http-equiv="expires" content="0">
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<title>ALKIS-Suche Adressen</title>
+	<link rel="stylesheet" type="text/css" href="alkisnav.css">
+	<script type='text/javascript'>
+		function transtitle (trans) { // Titel der letzten Transaktion anzeigen
+			document.getElementById('transaktiontitle').innerHTML = trans;
+		}
+		function imFenster(dieURL) {
+			var link = encodeURI(dieURL);
+			window.open(link,'','left=10,top=10,width=620,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
+		}
+	</script>
+</head>
+<body>
+<a href='javascript:history.back()'>
+	<img src="ico/zurueck.png" width="16" height="16" alt="&lt;&lt;" title="zur&uuml;ck">
+</a>&nbsp;
+<span title='zuletzt ausgef&uuml;hrte Aktion'>
+	<dfn class='title' id='transaktiontitle'></dfn>
+</span>
+
+END;
+
+function suchStrName() {
+	// Strassen nach Name(-nsanfang)
+	global $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
+	//if ($debug > 1) {echo "<p class='dbg'>function suchStrName()<p>";} // Ablauf-Verfolgung
+
+	$linelimit=120;  // -> in Conf?
+	$str_schl=""; // Loeschen vorh. Ergebnis
+	preg_match("/^(\D+)(\d*)(\D*)/",$street,$matches); # 4 matches name/nr/zusatz 
+	//echo "match: 1='".$matches[1]."', 2='".$matches[2]."', 3='".$matches[3]."'";
+	$matches[1] = preg_replace("/strasse/i","str", $matches[1]);
+	$matches[1] = preg_replace("/str\./i","str", $matches[1]); 
+
+	if(preg_match("/\*/",$matches[1])){
+		$match=trim(preg_replace("/\*/i","%", strtoupper($matches[1])));
+	} else {
+		$match=trim($matches[1])."%";
+	}
+
+	$sql ="SELECT g.gemeinde, g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage 
+	FROM ax_lagebezeichnungkatalogeintrag k 
+	JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde 
+	WHERE k.bezeichnung ILIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
+
+	switch ($gfilter) {
+		case 1: // Einzelwert
+			$sql.="AND k.gemeinde='".$gemeinde."' ";
+			break;
+		case 2: // Liste
+			$sql.="AND k.gemeinde in (".str_replace(",", "','", $gemeinde).") ";
+			break;
+		default: // kein Filter
+			break;
+	}
+	$sql.="ORDER BY g.bezeichnung, k.bezeichnung, k.lage LIMIT $2 ;";
+ 	$v=array($match,$linelimit);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Name</p>";
+		if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."'<p>";}
+		return;
+	}
+
+	$cnt = 0;
+	$gwgem="";
+	while($row = pg_fetch_array($res)) {
+		$gemname=$row["gemname"];
+		$gemnr=$row["gemeinde"] ;
+		if ($gwgem != $gemname) {
+			if ($gfilter != 1) {
+				zeile_gemeinde($gemnr, $gemname, false); // ToDo: aber ohne Link oder Link verarbeiten kÃ¶nnen
+			}
+			$gwgem=$gemname;
+		}
+		$gkey=$row["schluesselgesamt"]; // Land-RegBez-Kreis-Gem-Strasse - fÃŒr weitere Suche
+		$skey=$row["lage"]; // Nur Str.-schl. daraus
+		$kgml=$row["gml_id"]; // ID von Katalog
+		$sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8");
+		zeile_strasse ($gkey, $skey, $sname, $kgml, $gemname);
+		$cnt++;
+	}
+
+	if($cnt == 0) {
+		echo "<pclass='anz'>Keine Stra&szlig;e</p>";
+		if ($debug > 2) {echo "<p class='err'>SQL = '".$sql."'<br>$1 = '".$match."'<p>";} // ++ Nur Entw.
+	} elseif($cnt == 1) { // Eindeutig
+		$str_schl=$gkey; // dann gleich weiter
+	} elseif($cnt >= $linelimit) {
+		echo "<p class='anz'>".$cnt." Stra&szlig;en ... und weitere</p>";			
+	} elseif ($cnt > 1) {
+		echo "\n<p class='anz'>".$cnt." Stra&szlig;en</p>";	
+	}
+	return;
+}
+
+function suchStrKey() { // Strassen nach num. Schluessel
+	global $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
+	//if ($debug > 1) {echo "<p class='dbg'>function suchStrKey()<p>";} // Ablauf-Verfolgung
+	$linelimit=60;
+	if(preg_match("/\*/",$street)) {
+		$match=trim(preg_replace("/\*/i","%",$street));
+		// fuehrende Nullen eingeben oder fuehrende Wildcard
+	} else {
+		$match=str_pad($street, 5, "0", STR_PAD_LEFT); // "Wie eine Zahl" verarbeiten 
+	}
+	$sql ="SELECT g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage 
+	FROM ax_lagebezeichnungkatalogeintrag as k 
+	JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde 
+	WHERE k.lage LIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
+	switch ($gfilter) {
+		case 1: // Einzelwert
+			$sql.="AND k.gemeinde='".$gemeinde."' ";
+			break;
+		case 2: // Liste
+			$sql.="AND k.gemeinde in ('".str_replace(",", "','", $gemeinde)."') ";
+			break;
+	}
+	$sql.="ORDER BY k.lage, k.bezeichnung LIMIT $2 ;";
+
+ 	$v=array($match,$linelimit);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Schl&uuml;ssel</p>";
+		return;
+	}
+	$cnt = 0;
+	while($row = pg_fetch_array($res)) {
+		$sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8");		
+		$gkey=$row["schluesselgesamt"];
+		$gemname=htmlentities($row["gemname"], ENT_QUOTES, "UTF-8");
+		$skey=$row["lage"];
+		$kgml=$row["gml_id"]; // ID von Katalog	
+		zeile_strasse ($gkey, $skey, $sname, $kgml, $gemname);
+		$cnt++;
+	}
+	if($cnt == 0) {
+		echo "\n<p class='anz'>Keine Stra&szlig;e mit Schl&uuml;ssel ".$match."</p>";
+	} elseif($cnt == 1) { // Eindeutig
+		$str_schl=$gkey; // dann gleich weiter
+	} elseif ($cnt >= $linelimit) {
+		echo "\n<p>".$cnt." Stra&szlig;en ... und weitere</p>";			
+	} elseif ($cnt > 1) {
+		echo "\n<p class='anz'>".$cnt." Stra&szlig;en</p>";	
+	}	
+	return;
+}
+
+function suchHausZurStr($showParent) { // Haeuser zu einer Strasse
+	global $str_schl, $gkz, $scalestr, $scalehs, $epsg, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
+	//if ($debug > 1) {echo "<p class='dbg'>function suchHausZurStr()<p>";} // Ablauf-Verfolgung
+
+	// Head
+	// Strasse zum Strassenschluessel
+	$sql ="SELECT g.bezeichnung AS gemname, k.gml_id AS kgml, k.bezeichnung, k.land, k.regierungsbezirk, k.kreis, k.gemeinde, k.lage 
+	FROM ax_lagebezeichnungkatalogeintrag as k 
+	JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde 
+	WHERE k.schluesselgesamt = $1 AND k.endet IS NULL AND g.endet IS NULL LIMIT 1"; 
+
+  	$v=array($str_schl);	// Schluessel-Gesamt ..
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Name zum Stra&szlig;enschl&uuml;ssel</p>";
+		if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."'<p>";}
+		return;
+	}
+
+	if($row = pg_fetch_array($res)) { // .. gefunden
+		$kgml=$row["kgml"]; // ID aus Katalog
+		$sname=$row["bezeichnung"];
+		$land =$row["land"];	// Einzel-Felder fÃŒr JOIN _lagebezeichnung_
+		$regb =$row["regierungsbezirk"];
+		$kreis=$row["kreis"];
+		$gemnd=$row["gemeinde"];
+		$nr=$row["lage"];
+		$gemname=htmlentities($row["gemname"], ENT_QUOTES, "UTF-8");
+		if ($showParent) {
+			// EINE Koordinate zur Strasse besorgen
+			// ax_Flurstueck >zeigtAuf> ax_LagebezeichnungOhneHausnummer
+			$sqlko ="SELECT ";
+			if($epsg == "25832") { // Transform nicht notwendig
+				$sqlko.="st_x(st_Centroid(f.wkb_geometry)) AS x, ";
+				$sqlko.="st_y(st_Centroid(f.wkb_geometry)) AS y ";
+			} else {
+				$sqlko.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
+				$sqlko.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";
+			}
+			$sqlko.="FROM ax_lagebezeichnungohnehausnummer o ";
+			$sqlko.="JOIN ax_flurstueck f ON o.gml_id=ANY(f.zeigtauf) ";
+			$sqlko.="WHERE o.land= $1 AND o.regierungsbezirk= $2 AND o.kreis= $3 AND o.gemeinde= $4 AND o.lage= $5 ";	
+			$sqlko.="LIMIT 1;"; // die erstbeste Koordinate
+
+			$v=array($land,$regb,$kreis,$gemnd,$nr);
+			$resko=pg_prepare("", $sqlko);
+			$resko=pg_execute("", $v);
+			if ($resko) {
+				$rowko=pg_fetch_array($resko); 
+				$x=$rowko["x"];
+				$y=$rowko["y"];
+			} else {		
+				echo "\n<p class='err'>Fehler bei Koordinate zur Stra&szlig;e</p>";
+			}
+
+			// "function zeile_strasse()" hier nicht verwendbar. ZusÃ€tzlicher Map-Link mit Koordinate 
+			// Icon -> Buchnachweis
+			echo "\n\t<br><a href='javascript:imFenster(\"".$auskpath."alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml."\")'>";
+				echo "\n\t\t<img class='nwlink' src='ico/Lage_mit_Haus.png' width='16' height='16' alt='STR' title='Buchauskunft zur Stra&szlig;e'>";
+			echo "\n\t</a>";
+
+			if ($x > 0) { // Koord. bekommen?
+				echo "\n\t<a title='Positionieren 1:".$scalestr."' href='javascript:"; // mit Link
+						echo "transtitle(\"auf Stra&szlig;e positioniert\"); ";
+						echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalestr."); ";
+						echo "parent.parent.showHighlight(".$x.",".$y."); ";
+					//	echo "document.location.href=\"".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$str_schl."\"";
+					echo "' "; // end href
+					echo "\n\t\tonmouseover='parent.parent.showHighlight(" .$x. "," .$y. ")' ";
+					echo "\n\t\tonmouseout='parent.parent.hideHighlight()'";
+				echo ">\n\t\t".$sname." (".$nr.")\n\t</a>";
+			} else { // keine Koord. gefunden
+				echo $sname." (".$nr.")"; // nur Anzeige, ohne Link
+			}
+			switch ($gfilter) {
+				case 0: // Kein Filter
+					echo " in ".$gemname;
+					break;
+				case 2: // Liste
+					echo " in ".$gemname;
+					break;
+			}			
+		}
+		echo "\n<hr>";
+
+		// Body
+		// Haeuser zum Strassenschluessel
+		$sql="SELECT min(replace(h.hausnummer,' ','')) AS hsnr, ";
+		if($epsg == "25832") { // Transform nicht notwendig
+			$sql.="avg (st_x(p.wkb_geometry)) AS x, ";
+			$sql.="avg (st_y(p.wkb_geometry)) AS y ";		
+		} else {  
+			$sql.="avg (st_x(st_transform(p.wkb_geometry,".$epsg."))) AS x, ";
+			$sql.="avg (st_y(st_transform(p.wkb_geometry,".$epsg."))) AS y ";		
+		}
+		$sql.="FROM ap_pto p JOIN ax_lagebezeichnungmithausnummer h ON h.gml_id=ANY(p.dientzurdarstellungvon) 
+		WHERE p.art='HNR' AND h.land= $1 AND h.regierungsbezirk= $2 AND h.kreis= $3 AND h.gemeinde= $4 AND h.lage= $5 
+		AND p.endet IS NULL AND h.endet IS NULL
+		GROUP BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2) 
+		ORDER BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2);";
+		// Problem: In der Datenbank gibt es mehrere hausnummern-Koordinaten fÃŒr verschiedene 
+		// MaÃstÃ€be der Kartendarstellung
+		// Diese sollten nicht mehrfach gelistet werden. FÃŒr die Positionierung "irgendeine" nehmen.
+		// LÃ¶sung: ÃŒber GROUP BY in SQL. Alternative LÃ¶sungen wÃ€ren: 
+		//  1. Gruppenwechsel bei Abarbeitung des Result
+		//  2. Subquery mit LIMIT 1 statt JOIN
+		//  3. Koordinate aus dem Mittelpunkt der GebÃ€ude-Geometrie verwenden statt aus dem PrÃ€sentationsobjekt der Hausnummer
+
+ 		$v=array($land,$regb,$kreis,$gemnd,$nr);
+		$resh=pg_prepare("", $sql);
+		$resh=pg_execute("", $v);
+		if (!$resh) {
+			echo "\n<p class='err'>Fehler bei H&auml;user zum Stra&szlig;enschl&uuml;ssel</p>";
+			if ($debug > 2) {echo "<p class='dbg'>SQL='".$sql."'<br>Array=".$v."</p>";}
+			return;
+		}
+
+		$cnt=0;
+		$count=0;
+		echo "\n<table>";
+		while($rowh = pg_fetch_array($resh)) { // mehrere HsNr je Zeile
+			if($count == 0) {echo "\n<tr>";}	
+			$hsnr=$rowh["hsnr"];
+			$x=$rowh["x"];
+			$y=$rowh["y"];
+			echo "\n\t<td class='hsnr'>";
+				echo "<a href='";
+					echo "javascript:";
+					echo "transtitle(\"auf Haus ".$hsnr." positioniert\"); ";
+					echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalehs."); ";
+					echo "parent.parent.showHighlight(".$x.",".$y.");' ";
+				echo "onmouseover='parent.parent.showHighlight(".$x.",".$y.")' ";
+				echo "onmouseout='parent.parent.hideHighlight()";
+				echo "'>".$hsnr."</a>";
+			echo "</td>";
+			$cnt++;
+			$count++;
+			if($count == 7) { // Max. Hausnummern je Zeile (Test: 3stellige HsNr mit Zusatz)
+				echo "\n</tr>";
+				$count = 0;
+			}
+		}
+		if($count > 0) {echo "\n</tr>";}
+		echo "\n</table>";
+		if ($cnt > 1) {
+			echo "\n<p class='anz'>".$cnt." Hausnummern</p>";
+		}
+	} else {
+		echo "\n<p class='anz'>Keine Stra&szlig;e</p>";
+	}
+	return;
+}
+// ===========
+// Start hier!
+// ===========
+if(isset($epsg)) {
+	$epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);	
+} else {
+	$epsg=$gui_epsg; // aus Conf
+}
+
+// Filter auf Zustaendigkeit z.B. ein Stadtgebiet
+if ($gemeinde == "") {
+	$gfilter = 0; // ungefiltert
+} elseif(strpos($gemeinde, ",") === false) {
+	$gfilter = 1; // Einzelwert
+} else {
+	$gfilter = 2; // Liste
+}
+// ax_lagebezeichnungkatalogeintrag.gemeinde: z.B. Classic='40' / NorBit  = '040'
+// Im Mapbender mit fuehrenden Nullen eingeben: gazetteer_alkis.SRC
+// alkisnav.htm?..&gemeinde=040&..
+
+// +++Zerlegung Eingabe aus "Balken" von Buchauskunft "Lage": Numerisch: Gem-Str-Haus-lfd
+
+if ($str_schl != "") { // Wert kommt aus aus Link
+	$trans="Hausnummern zur Stra&szlig;e";
+	suchHausZurStr(true);
+// Wert aus Eingabe in Formular
+} elseif($street != "") { 
+	if (trim($street, "*,0..9, ") == "") { // Zahl, ggf. mit Wildcard
+		$trans="Suche Stra&szlig;enschl&uuml;ssel \"".$street."\"";
+		suchStrKey();
+	} else { // Name suchen
+		$trans="Suche Stra&szlig;enname \"".$street."*\"";
+		suchStrName();
+	}
+	if($str_schl != "") { // EINdeutiges Ergebnis
+		$trans="1 Stra&szlig;e gefunden, Hausnummern";
+		suchHausZurStr(false);
+	}
+} else {
+	$trans="keine Eingabe";
+}
+
+// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion 
+//  im Kopf des Ergebnisrahmens anzeigen.
+// Dazu die im HTML-Header definierte Javascript-Function benutzen.
+// Alternativ wird auch aus dem Javascript "positionieren Karte" dieser Titel gesetzt.
+echo "
+<script type='text/javascript'>
+	transtitle ('".$trans."') ; 
+</script>";
+
+?>
+
+</body>
+</html>
Index: trunk/mapbender/http/navn/alkisnav_grd.php
===================================================================
--- trunk/mapbender/http/navn/alkisnav_grd.php	(revision 360)
+++ trunk/mapbender/http/navn/alkisnav_grd.php	(revision 360)
@@ -0,0 +1,589 @@
+<?php
+/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil Grundbuch-Suche 
+	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
+
+Version vom
+	2016-02-11	Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
+*/
+
+// Variable initialisieren
+$ag="";
+$gbkennz="";
+$buchunggml="";
+$blattgml="";
+
+$cntget = extract($_GET);
+include("../../conf/alkisnav_conf.php"); // Konfigurations-Einstellungen
+include("alkisnav_fkt.php"); // Funktionen
+
+$con_string = "host=".$host." port=".$port." dbname=".$dbname.$gkz." user=".$user." password=".$password;
+$con = pg_connect ($con_string) or die ("Fehler bei der Verbindung zur Datenbank ".$dbname.$gkz);
+
+echo <<<END
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+	<meta http-equiv="cache-control" content="no-cache">
+	<meta http-equiv="pragma" content="no-cache">
+	<meta http-equiv="expires" content="0">
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<title>ALKIS-Suche Grundbuch</title>
+	<link rel="stylesheet" type="text/css" href="alkisnav.css">
+	<script type="text/javascript">
+		function imFenster(dieURL) {
+			var link = encodeURI(dieURL);
+			window.open(link,'','left=10,top=10,width=680,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
+		}
+		function transtitle(trans) {
+			document.getElementById('transaktiontitle').innerHTML = trans;
+		}
+		function formular_belegung(suchMich) {
+			parent.GrdGazetteerFrame.gbkennz.value=suchMich;
+		}
+	</script>
+</head>
+<body>
+<a href='javascript:history.back()'>
+	<img src="ico/zurueck.png" width="16" height="16" alt="&lt;&lt;" title="zur&uuml;ck">
+</a>&nbsp;
+<span title='zuletzt ausgef&uuml;hrte Aktion'>
+	<dfn class='title' id='transaktiontitle'></dfn>
+</span>
+
+END;
+
+function ListAG($liste_ag, $aktuell) {
+	// Amtsgerichte (Grundbuchamt) auflisten, dazu als Filter die AG-Liste aus Conf-Datei verwenden.
+	global $debug;
+	$linelimit=40;
+
+	$sql ="SELECT stelle, bezeichnung AS ag FROM ax_dienststelle 
+	WHERE stelle IN (".$liste_ag.") AND stellenart = 1000 AND endet IS NULL 
+	ORDER BY bezeichnung LIMIT $1 ;";
+	$res = pg_prepare("", $sql);
+	$res = pg_execute("", array($linelimit));
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Amtsgerichte</p>";
+		if ($debug >= 3) {echo "\n<p class='err'>".$sql."</p>";}
+		return 0;
+	}
+	$cnt = 0;
+	while($row = pg_fetch_array($res)) { // Loop AG 
+		$anr=$row["stelle"];
+		$ag=$row["ag"];		
+		zeile_ag ($ag, $anr, $aktuell);
+		$cnt++;
+	}
+	// Foot
+	if($cnt == 0){
+		echo "\n<p class='anz'>Kein Amtsgericht aus Liste ".$$liste_ag.".</p>";
+	} elseif ($cnt >= $linelimit) {
+		echo "\n<p title='Bitte eindeutiger qualifizieren'>".$cnt." Amtsgerichte ... und weitere</p>";
+	} elseif ($cnt > 1) {
+		echo "\n<p class='anz'>".$cnt." Amtsgerichte</p>";
+	}
+	return 0;
+}
+
+function ListGBBez($agkey) {
+	// Grundbuch-Bezirke zu einem Amtsgericht auflisten.
+	// Auch wenn BlÃ€tter vorhanden sind, kann es eine "Sackgasse" sein.
+	// Manchmal haben die BlÃ€tter keine FlurstÃŒcke im Filter-Bereich (Gemeinde).
+	global $debug;
+	$linelimit=100; // Bezirke/AG
+
+	// Head
+	ListAG("'".$agkey."'", true); // hier nur fÃŒr 1
+
+	// Body
+	// Die Subquery stellt sicher, dass nur Bezirke aufgelistet werden, die auch BlÃ€tter enthalten
+	$sql ="SELECT g.bezirk, g.bezeichnung FROM ax_buchungsblattbezirk g 
+	JOIN ax_dienststelle a ON g.stelle=a.stelle 
+	WHERE a.stelle = $1 AND a.stellenart = 1000 AND a.endet IS NULL AND g.endet IS NULL 
+	AND NOT (SELECT gml_id FROM ax_buchungsblatt b WHERE b.land=g.land AND b.bezirk=g.bezirk AND b.endet IS NULL LIMIT 1) IS NULL 
+	ORDER BY g.bezeichnung LIMIT $2 ;";
+
+	$v = array($agkey, $linelimit);
+	$res = pg_prepare("", $sql);
+	$res = pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Grundbuch-Bezirk</p>";
+		#if ($debug >= 3) {echo "\n<p class='err'>".$sql."</p>";}
+		return 0;
+	}
+	$cnt = 0;
+	while($row = pg_fetch_array($res)) { // Loop BEZIRK
+		$gnam=$row["bezeichnung"];
+		$gnr=$row["bezirk"];
+		zeile_gbbez($gnam, $gnr, false);
+		$cnt++;
+	}
+	// Foot
+	if($cnt == 0){
+		echo "\n<p class='anz'>Kein Bezirk mit Bl&auml;ttern.</p>";
+	} elseif ($cnt >= $linelimit) {
+		echo "\n<p class='anz' title='Bitte Name des Bezirks suchen lassen'>".$cnt." Bezirke ... und weitere</p>";
+	} elseif($cnt > 1) {
+		echo "\n<p class='anz'>".$cnt." Bezirke</p>"; // im Limit	
+	}
+	return;
+}
+
+function ag_bez_head($gbbez, $bezaktuell) {
+	// Zu einem Grundbuchbezirks-SchlÃŒssel die Zeilen "AG" und "Bezirk" ausgeben
+	// Parameter = SchlÃŒssel des Bezirks
+	#global $debug;
+	$sql ="SELECT a.stelle, a.bezeichnung AS ag, g.bezeichnung FROM ax_buchungsblattbezirk g 
+	JOIN ax_dienststelle a ON g.stelle=a.stelle WHERE g.bezirk= $1 AND g.endet IS NULL AND a.endet IS NULL LIMIT 1;";
+	$v=array($gbbez);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Amtsgericht und Grundbuchbezirk.</p>";
+		#if ($debug >= 3) {echo "\n<p class='err'>".$sql."</p>";}
+	}
+	$row = pg_fetch_array($res);
+	if ($row) {
+		$gnam=$row["bezeichnung"]; // GB-Bezirk Bezeichnung
+		$ag=$row["ag"]; // AG Bezeichnung
+		$anr=$row["stelle"]; // AG Key
+		zeile_ag($ag, $anr, false); // Amtsgericht
+		zeile_gbbez($gnam, $gbbez, $bezaktuell); // Bezirk
+	} else {
+  		echo "\n<div class='gk' title='Grundbuchbezirk'>";
+			echo "\n\t\t<p class='err'><img class='nwlink' src='ico/GB-Bezirk.png' width='16' height='16' alt='Bez.'>";
+				echo  " Bezirk '".$gbbez."' ist unbekannt.</p>";
+		echo "\n</div>";
+		return;
+	}
+	return;
+}
+
+function SuchGBBezName() {
+	// Grundbuch-Bezirk suchen nach Name(-nsanfang)
+	global $gkz, $gemeinde, $debug, $gbkennz;
+	$linelimit=80;
+
+	$sql ="SELECT a.stelle, a.bezeichnung AS ag, g.bezirk, g.bezeichnung FROM ax_buchungsblattbezirk g 
+	JOIN ax_dienststelle a ON g.stelle=a.stelle 
+	WHERE g.bezeichnung ILIKE $1 AND g.endet IS NULL AND a.endet IS NULL 
+	ORDER BY a.bezeichnung, g.bezeichnung LIMIT $2 ;";// "AND a.stellenart=1000 " Amtsgericht
+	if ( $gbkennz == "") {
+		$match = "%";
+	} else {	
+		if(preg_match("/\*/",$gbkennz)){
+			$match = trim(preg_replace("/\*/i","%", strtoupper($gbkennz)));
+		} else {
+			$match = trim($gbkennz)."%";
+		}	
+	}
+	$v = array($match, $linelimit);
+	$res = pg_prepare("", $sql);
+	$res = pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Grundbuch-Bezirk</p>";
+		return 1;
+	}
+	$cnt=0;
+	$gwag="";
+	while($row = pg_fetch_array($res)) { // Loop BEZIRK
+		$anr=$row["stelle"]; // Gruppierung AG
+		if ($gwag != $anr) {
+			$gwag = $anr;
+			$ag=$row["ag"];
+			zeile_ag($ag, $anr, false);
+		}
+		$gnam=$row["bezeichnung"];
+		$gnr=$row["bezirk"];
+		zeile_gbbez ($gnam, $gnr, false);
+		$cnt++;
+	}
+	// Foot
+	if($cnt == 0){ 
+		echo "\n<p class='anz'>Kein Grundbuchbezirk.</p>";
+	} elseif ($cnt >= $linelimit) {
+		echo "\n<p title='Bitte eindeutiger qualifizieren'>".$cnt." Bezirke ... und weitere</p>";
+	} elseif ($cnt == 1) {
+		return $gnr; // Wenn eindeutig, gleich weiter
+	} elseif ($cnt > 1) {
+		echo "\n<p class='anz'>".$cnt." Bezirke</p>"; // im Limit	
+	}
+	return;
+}
+ 
+function EinBezirk($showParent) {
+	// Kennzeichen bestehend nur aus GB-Bezirk-SchlÃŒssel wurde eingegeben
+	global $gemeinde, $debug, $zgbbez, $auskpath;
+	$linelimit=300; // max. Blatt je Bezirk
+	// Dies Limit ist nicht ausreichend fÃŒr alle BlÃ€tter eines Bezirks, aber ...
+	// Wenn man die Blatt-Nr nicht kennt, kommt man hier sowieso nicht weiter.
+	// Es nutzt also nichts, hier tausende Nummern aufzulisten.
+	// +++ BlÃ€tter-Funktion einfÃŒhren analog Modul _eig
+
+	// Head
+	if ($showParent) {
+		ag_bez_head($zgbbez, true); // AG und BEZ ausgeben
+	}
+	// Body
+	$sql ="SELECT b.gml_id, b.buchungsblattnummermitbuchstabenerweiterung AS blatt FROM ax_buchungsblatt b 
+	WHERE b.bezirk= $1 AND b.endet IS NULL ORDER BY b.buchungsblattnummermitbuchstabenerweiterung LIMIT $2 ;";
+	$v=array($zgbbez, $linelimit);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Bezirk.</p>";
+		#if ($debug >= 3) {echo "\n<p class='err'>".$sql."</p>";}
+	}
+	$cntbl=0; // Counter Blatt/Bezirk
+	while($row = pg_fetch_array($res)) { // Loop BLATT	
+		$blatt=$row["blatt"];
+		$blattgml=$row["gml_id"];
+		zeile_blatt($zgbbez, "", $blattgml, $blatt, false, "", false);
+		$cntbl++;
+	}
+	// Foot
+	if($cntbl == 0) { 
+		echo "\n<p class='anz'>Kein Blatt im Bezirk.</p>";
+	} elseif($cntbl >= $linelimit) {
+		echo "\n<p class='anz'>".$cntbl." Bl&auml;tter ... und weitere</p>";
+		// +++ Hier oft ÃŒberschritten! BlÃ€tter-Funktion einfÃŒhren
+		echo "\n<p>Geben sie ein: '".$zgbbez."-999A'<br>wobei '999A' = gesuchtes GB-Blatt</p>";
+		// Vorbelegen des Eingabefeldes fÃŒr neue Suche
+		echo "<script type='text/javascript'>parent.GrdGazetteerFrame.gbkennz.value='".$zgbbez."-?';</script>";
+	} elseif ($cntbl > 1) {
+		echo "\n<p class='anz'>".$cntbl." Bl&auml;tter</p>"; // im Limit	
+	}
+	return;
+}
+
+function gml_blatt() {
+	// Kennzeichen "Bezirk + Blatt" eingegeben. Dazu die gml_id des Blattes ermitteln.
+	global $debug, $zgbbez, $zblatt, $zblattn, $zblattz;
+	$sql ="SELECT b.gml_id, b.buchungsblattnummermitbuchstabenerweiterung AS blatt FROM ax_buchungsblatt b 
+	WHERE b.bezirk= $1 AND b.endet IS NULL AND b.buchungsblattnummermitbuchstabenerweiterung ";
+
+	if ($zblattz == "") { // Ohne Buchstabenerweiterung: Formate '123','000123 ','0000123'
+		$sql.="IN ('".$zblattn."','".str_pad($zblattn, 6, "0", STR_PAD_LEFT)." ','".str_pad($zblattn, 7, "0", STR_PAD_LEFT)."');";
+	} else { // Mit Buchstabenerweiterung: '000123A'
+		$sql.="='".str_pad($zblattn, 6, "0", STR_PAD_LEFT).$zblattz."';";
+	}
+	$v=array($zgbbez);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Blatt (Kennzeichen).</p>";
+		return;
+	}
+	$cntbl=0; // Counter Blatt
+	while($row = pg_fetch_array($res)) {	
+		$bl_gml=$row["gml_id"];
+		$zblatt=$row["blatt"]; // das tatsaechliche Format (mit/ohne fuehrende 0)
+		$cntbl++;
+	}
+	if($cntbl == 0) { 
+		echo "\n<p class='err'>Grundbuchblatt '".$zgbbez."-".$zblatt."' nicht gefunden.</p>";
+	} elseif ($cntbl == 1) {
+		return $bl_gml;
+	}
+	return;
+}
+
+function EinBlatt($showParent) {
+	// Kennzeichen Bezirk + Blatt wurde eingegeben oder verlinkt
+	global $debug, $gemeinde, $zgbbez, $zblatt, $blattgml, $gbbeznam;
+	// Head
+	if ($showParent) {
+		ag_bez_head($zgbbez, false); // AG + BEZ
+		zeile_blatt ($zgbbez, "", $blattgml, $zblatt, false, "", true);
+	}
+	// Body
+	GB_Buchung_FS(1000, $zgbbez."-".$zblatt); // Blatt -> Buchung -> Flurstueck (Limitiert)
+	// ++ besser Limit runter und "BlÃ€ttern"-Funktion einfÃŒhren
+	return; 
+}
+
+function gml_buchungsstelle() {
+	// Kennzeichen "Bezirk + Blatt + BVNR" wurde eingegeben.
+	// Dazu die gml_id der Buchungsstelle ermitteln, um "function EinGrundstueck" benutzen zu kÃ¶nnen.
+	global $debug, $zgbbez, $zblatt, $zblattn, $zblattz, $zbvnr;
+
+	// Blatt ->  B u c h u n g s s t e l l e
+	$sql ="SELECT s.gml_id FROM ax_buchungsstelle s 
+	JOIN ax_buchungsblatt b ON s.istbestandteilvon=b.gml_id
+	WHERE b.bezirk= $1 AND s.endet IS NULL AND b.endet IS NULL AND b.buchungsblattnummermitbuchstabenerweiterung ";
+
+	if ($zblattz == "") { // Ohne Buchstabenerweiterung
+		//Formate '123','000123 ','0000123'
+		$sql.="IN ('".$zblattn."','".str_pad($zblattn, 6, "0", STR_PAD_LEFT)." ','".str_pad($zblattn, 7, "0", STR_PAD_LEFT)."')";
+	} else { // Mit Buchstabenerweiterung: '000123A'
+		$sql.="='".str_pad($zblattn, 6, "0", STR_PAD_LEFT).$zblattz."'";
+	}
+	$sql.=" AND s.laufendenummer= $2 ;";
+
+	$v=array($zgbbez, $zbvnr);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Buchungsstelle (Kennzeichen).</p>";
+		return;
+	}
+	$zbs=0;
+	while($row = pg_fetch_array($res)) {	
+		$bs_gml=$row["gml_id"];
+		$zbs++;
+	}
+	if($zbs == 0) { 
+		echo "\n<p class='err'>Buchung ".$zgbbez."-".$zblattn.$zblattz."-".$zbvnr." nicht gefunden.</p>";
+		return;
+	} else {
+		return $bs_gml;
+	}
+}
+
+function EinGrundstueck($showParent) {
+	// Die gml_id der Buchungsstelle (BVNR, GrundstÃŒck) ist bekannt = $buchunggml
+	// Die gebuchten FlurstÃŒcke und dienende/herrschenden Buchungen werden ausgegeben.
+	global $debug, $gemeinde, $epsg, $buchunggml, $zgbbez, $zblatt, $zblattn, $zblattz, $zbvnr, $gfilter;
+	// NoLimit?
+
+	// Head
+	if ($showParent) { // wenn Kennzeichen bekannt ist, dann auch Blatt ausgeben
+		if ($zgbbez.$zblatt != "") {
+			ag_bez_head($zgbbez, false); // AG + BEZ
+			zeile_blatt ($zgbbez, "", "", $zblatt, false, "", false);
+			// Parameter 2 ($gnam) leer lassen Knoten "Bezirk" steht drÃŒber
+		} else {
+			echo "<p class='err'>Kennzeichen Bezirk und Blatt nicht gesetzt</p>";
+		} // ++ suchen!
+		zeile_buchung($buchunggml, $zbvnr, $zgbbez."-".$zblattn.$zblattz, false, true);
+	}
+
+// dienend $1 gml_id von
+//         Buchungsstelle  <an<  Buchungsstelle sh
+//         (dienend)                (herrschend)
+
+// direkt  $1 gml_id von 
+//         Buchungsstelle                           <istGebucht< FlurstÃŒck >> Gemarkung
+
+// Recht   $1 gml_id von 
+//         Buchungsstelle  >an>  Buchungsstelle sd  <istGebucht< FlurstÃŒck >> Gemarkung
+//         (herrschend)             (dienend)   sd  >istBestandteilVon> bd >> gd
+
+	// Body
+	// Anfang (Select-Liste) gleich 
+	$sqlanf ="SELECT g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, ";
+	if($epsg == "25832") { // Transform nicht notwendig
+		$sqlanf.="st_x(st_Centroid(f.wkb_geometry)) AS x, ";
+		$sqlanf.="st_y(st_Centroid(f.wkb_geometry)) AS y ";
+	} else {  
+		$sqlanf.="st_x(st_transform(st_Centroid(f.wkb_geometry),".$epsg.")) AS x, ";
+		$sqlanf.="st_y(st_transform(st_Centroid(f.wkb_geometry),".$epsg.")) AS y ";			
+	}
+	// Filter gleich
+	$sqlfilter="";
+	switch ($gfilter) { // Filter Gemeinde
+		case 1: // Einzel
+			$sqlfitler="AND f.gemeinde='".$gemeinde."' "; break;
+		case 2: // Liste
+			$sqlfilter="AND f.gemeinde in ('".str_replace(",", "','", $gemeinde)."') "; break;
+	}
+
+	// Direkte Buchungen (Flurst.)
+	$sql =$sqlanf."FROM ax_flurstueck f JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ";
+	$sql.="WHERE f.istgebucht = $1 AND f.endet IS NULL ".$sqlfilter."ORDER BY f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;";
+
+	$v=array($buchunggml);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Buchungsstelle (gml, direkt).</p>";
+		if ($debug >= 3) {
+			echo "\n<p class='err'>'".$sql."'<br>\nmit $1 ='".$buchunggml."'</p>";
+		}
+	}
+	$zfs1=0;
+	while($row = pg_fetch_array($res)) {	
+		$fs_gml=$row["gml_id"];
+		$gmkg=$row["bezeichnung"];
+		$flur=$row["flurnummer"];
+		$fskenn=$row["zaehler"];
+		if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];} // BruchNr
+		zeile_flurstueck ($fs_gml, $fskenn, $row["x"], $row["y"], $gmkg, $flur, false);
+		$zfs1++;
+	}
+	// Zwischen-Foot
+	if($zfs1 == 0) {
+		echo "\n<p class='anz'>Kein Flurst&uuml;ck zu dieser Buchung</p>";
+	} elseif($zfs1 > 1) {
+		echo "\n<p class='anz'>".$zfs1." Flurst&uuml;cke</p>";
+	}
+	if($zfs1 > 0) { // wenn's was zu trennen gibt
+		echo "<hr>"; // Trennen
+	}
+
+	// Recht "an" (dienende Buchungen und ihre Flurst.)
+
+$sql =$sqlanf.", sd.gml_id AS diengml, sd.laufendenummer AS dienlfd, 
+bd.gml_id AS dienbltgml, bd.buchungsblattnummermitbuchstabenerweiterung AS dienblatt, 
+gd.stelle, gd.gml_id AS dienbezgml, gd.bezirk, gd.bezeichnung AS diengbbez 
+FROM ax_buchungsstelle sh 
+JOIN ax_buchungsstelle sd ON sd.gml_id=ANY(sh.an) 
+JOIN ax_flurstueck f ON f.istgebucht=sd.gml_id 
+JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
+JOIN ax_buchungsblatt bd ON sd.istbestandteilvon=bd.gml_id 
+JOIN ax_buchungsblattbezirk gd ON bd.land=gd.land AND bd.bezirk=gd.bezirk 
+WHERE sh.gml_id = $1 AND sh.endet IS NULL AND sd.endet IS NULL AND f.endet IS NULL AND bd.endet IS NULL AND gd.endet IS NULL "
+
+.$sqlfilter."ORDER BY gd.bezeichnung, bd.buchungsblattnummermitbuchstabenerweiterung, cast(sd.laufendenummer AS integer), f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;";
+
+	$v=array($buchunggml);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Buchungsstelle (gml, Recht an).</p>";
+		if ($debug >= 3) {
+			echo "\n<p class='err'>'".$sql."'<br>\nmit $1 ='".$buchunggml."'</p>";
+		}
+	}
+	$zfs2=0;
+	$gwblatt="";
+	while($row = pg_fetch_array($res)) {
+		$dienstelle=$row["stelle"];	// Stelle (AG) des dien. Grdst.
+		$dienbezgml=$row["dienbezgml"];	// Bezirk des dien. GS: gml, Nr. und Bezeichnung
+		$diengbbez=$row["diengbbez"];	// Bezeichnung
+		$dienbezirk=$row["bezirk"];	// Key
+		$dienbltgml=$row["dienbltgml"];	// dien. Blatt, gml und Nr
+		$dienblatt=$row["dienblatt"];
+		$diengml=$row["diengml"];	// gml_id des dien. Grdst.
+		$dienlfd=$row["dienlfd"];	// BVNR (laufendNr) des dien. GS
+		if ($gwblatt != $dienblatt) { // Grupp. Blatt - dien.
+			if ($gwblatt == "") { // der erste "dienende": Einleitungs-Zeile
+				$aber="";
+				if($zfs1 == 0) {$aber="Aber ein ";} 
+				echo "\n<p class='anz' title='Die oben genannte Buchung hat ein Recht an den folgenden Buchungen'>".$aber."Recht an ..</p>";
+			}
+			$gwblatt = $dienblatt; // Steuerg GW Blatt
+			zeile_blatt($dienbezirk, $diengbbez, $dienbltgml, $dienblatt, true, "", false);
+			$gwbvnr="";
+		}
+		if ($gwbvnr != $dienlfd) { // Gruppierung Buchung (BVNR) - dienend
+			$gwbvnr = $dienlfd; // Steuerg GW BVNR
+			zeile_buchung($diengml, $dienlfd, $dienbezirk."-".$dienblatt, true, false);
+		} // ++ Buchungsart? Welches Recht?
+		$fs_gml=$row["gml_id"];
+		$gmkg=$row["bezeichnung"];
+		$flur=$row["flurnummer"];
+		$fskenn=$row["zaehler"];
+		if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];} // BruchNr
+		zeile_flurstueck ($fs_gml, $fskenn, $row["x"],$row["y"], $gmkg, $flur, false);
+		$zfs2++;
+	}
+
+// Teil 3 - noch nicht umgesetzt
+// ToDo: Wenn nur 1 GrundstÃŒck untersucht wird, dann dazu auch die berechtigten (herrschenden) GrundbÃŒcher anzeigen und verlinken (ohne FS)
+
+	// Foot
+	if($zfs2 == 0 AND $zfs1 == 0) {
+		echo "\n<p class='anz'>Kein Recht an Flst.</p>";
+	} elseif($zfs2 > 1) {
+		echo "\n<p class='anz'>".$zfs2." Rechte an Flurst.</p>";
+	}
+	return;
+}
+
+// ===========
+// Start hier!
+// ===========
+if(isset($epsg)) {
+	$epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);	
+} else {
+	$epsg=$gui_epsg; // aus Conf
+}
+
+// Filter aus Conf-Datei
+if ($gemeinde == "") {
+	$gfilter = 0; // ungefiltert
+} elseif(strpos($gemeinde, ",") === false) {
+	$gfilter = 1; // Einzelwert
+} else {
+	$gfilter = 2; // Liste
+//	$gemeinde = "'".str_replace(",", "','", $gemeinde)."'"; // Jedes Element in ''
+}
+
+// Das eingegebene Kennzeichen fÃŒr "Anzeige" und "weitere Links" zerlegen,
+// auch wenn ÃŒber einen ein Self-Link mit gml_id aufgerufen.
+$kennztyp=ZerlegungGBKennz($gbkennz);
+
+// Wurde eine gml_id (internes Kennzeichen) aus einem Self-Link verwendet?
+// Dann hat DAS PrioritÃ€t, dann also *nicht* nach $gbkennz suchen.
+if ($buchunggml != "") { // gml der Buchungsstelle
+	$trans="Flurst&uuml;cke zur Buchungsstelle"; // Link
+	EinGrundstueck(true);
+
+} elseif($blattgml != "") { // gml des GB-Blattes
+	$trans="GB-Blatt mit Buchungen und Flst.";
+	EinBlatt(true);
+
+} elseif($ag != "") { // Key des Amtsgerichtes
+	$trans="GB-Bezirke zum Amtsgericht";
+	ListGBBez($ag);
+
+} else { // kein Self-Link sondern manuelle Eingabe im Formular
+	switch ($kennztyp) { // wurde oben bereits analysiert und zerlegt
+		case 0: // keine Eingabe
+			$trans="Liste der Amtsgerichte";
+			ListAG($ag_liste, false);
+			break;
+		case 1: // Eingabe Bezirk-Name (-Teil) -> gefilterte Liste der Bezirke
+			$trans="Bezirke suchen \"".$gbkennz."\"";
+			$beznr=SuchGBBezName();
+			if ($beznr > 0) {  // wenn der Suchbegriff eindeutig war, ..
+				$zgbbez=$beznr;
+				$trans="Bezirk gefunden, Bl&auml;tter dazu";
+				EinBezirk(false); // .. dann gleich weiter
+			};
+			break;
+		case 2: // Eingabe Bezirk-Nummer -> Liste der BlÃ€tter im Bezirk
+			$trans="Bl&auml;tter im GB-Bezirk";
+			EinBezirk(true);
+			break;
+		case 3: // Eingabe GB-Blatt -> Liste der Buchungen auf dem Blatt
+			$trans="Buchungen auf GB-Blatt";
+			$blattgml=gml_blatt(); // gml_id zum Blatt suchen
+			if ($blattgml != "") { // gefunden		
+				if (EinBlatt(true) == 1) { // wenn darauf genau eine Buchung ist
+					$trans="GB-Blatt und 1 Buchung"; // dann gleich tiefer rein
+					$buchunggml=gml_buchungsstelle(); // gml_id der Buchung
+					EinGrundstueck(false);
+				}
+			}
+			break;
+		case 4: // Eingabe Buchung (GrundstÃŒck) -> Liste der FlurstÃŒcke
+			$buchunggml=gml_buchungsstelle(); // gml_id zum Kennzeichen
+			if ($buchunggml != "") { 		// .. wurde geliefert 
+				$trans="Flurst&uuml;cke zur Buchungsstelle"; // Eingabe
+				EinGrundstueck(true);	// mit Backlink
+			} else{
+				$trans="Suche Buchungsstelle";
+			}
+			break;
+		case 9: // Fehler
+			$trans="fehlerhafte Eingabe";
+			echo "\n<p class='err'>Bitte ein g&uuml;ltiges Grundbuchkennzeichen eingegeben, Format 'gggg-999999A-llll</p>";
+			break;
+	}
+}
+
+// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion 
+//  im Kopf des Ergebnisrahmens anzeigen.
+// Dazu die im HTML-Header definierte Javascript-Function benutzen.
+// Alternativ wird auch aus dem Javascript "positionieren Karte" dieser Titel gesetzt.
+echo "
+<script type='text/javascript'>
+	transtitle('".$trans."'); 
+</script>";
+
+?>
+
+</body>
+</html>
Index: trunk/mapbender/http/navn/alkisnav_eig.php
===================================================================
--- trunk/mapbender/http/navn/alkisnav_eig.php	(revision 360)
+++ trunk/mapbender/http/navn/alkisnav_eig.php	(revision 360)
@@ -0,0 +1,669 @@
+<?php
+/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil EigentÃŒmer-Suche 
+	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
+
+ Version vom
+	2016-02-11	Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
+*/
+
+// Variable initialisieren
+$gbkennz="";
+$blattgml="";
+$person ="";
+
+$cntget = extract($_GET);
+include("../../conf/alkisnav_conf.php"); // Konfigurations-Einstellungen
+include("alkisnav_fkt.php"); // Funktionen
+$con_string = "host=".$host." port=".$port." dbname=".$dbname.$gkz." user=".$user." password=".$password;
+$con = pg_connect ($con_string) or die ("<p class='err'>Fehler bei der Verbindung zur Datenbank</p>".$dbname.$gkz);
+
+echo <<<END
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+	<meta http-equiv="cache-control" content="no-cache">
+	<meta http-equiv="pragma" content="no-cache">
+	<meta http-equiv="expires" content="0">
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<title>ALKIS-Suche Eigent&uuml;mer</title>
+	<link rel="stylesheet" type="text/css" href="alkisnav.css">
+	<script type="text/javascript">
+		function imFenster(dieURL) {
+			var link = encodeURI(dieURL);
+			window.open(link,'','left=10,top=10,width=620,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
+		}
+		function transtitle(trans) {
+			document.getElementById('transaktiontitle').innerHTML = trans;
+		}
+	</script>
+</head>
+<body>
+<a href='javascript:history.back()'>
+	<img src="ico/zurueck.png" width="16" height="16" alt="&lt;&lt;" title="zur&uuml;ck">
+</a>&nbsp;
+<span title='zuletzt ausgef&uuml;hrte Aktion'>
+	<dfn class='title' id='transaktiontitle'></dfn>
+</span>
+
+END;
+
+function familiensuche() {
+	// Einen Link generieren, um nach anderen Personen mit gleichem Familiennamen (Nachnamen) zu suchen.
+	// Bei versehendlich falschem Vornamen muss nicht von vorn begonnen werden.
+	global $gkz, $gemeinde, $epsg, $name;
+	if(isset($name)) { // Familiensuche
+		echo "\n<div class='back' title='Andere Personen mit diesem Nachnamen'>";
+			echo "\n\t\t<img class='nwlink' src='ico/Eigentuemer_2.png' width='16' height='16' alt='FAM' title='Andere Personen mit diesem Nachnamen'> ";
+			echo "\n<a class='back' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;name=".$name."'>\"".$name."\"</a>";
+		echo "\n</div>\n<br>";	
+	}
+	return;
+}
+
+function personendaten() { 
+	// Adresse und Geburtsdatum der aktuellen Person ausgeben
+	global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $auskpath; // $debug
+
+	$sql ="SELECT p.nachnameoderfirma, p.vorname, p.geburtsdatum, p.namensbestandteil, 
+	a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer 
+	FROM ax_person p LEFT JOIN ax_anschrift a ON a.gml_id=ANY(p.hat) 
+	WHERE p.gml_id= $1 AND p.endet IS NULL AND a.endet IS NULL LIMIT 1;";	
+	// Es wird nur EINE Zeile ausgewertet
+
+	$v=array($person);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {echo "\n<p class='err'>Fehler bei Name</p>\n";}
+	$row = pg_fetch_array($res);
+	$zeil1=$row["nachnameoderfirma"].", ".$row["vorname"];
+	$gebdat=$row["geburtsdatum"];
+	if ($gebdat != "") {$zeil1.= ", geb. ".$gebdat;}
+	$best=$row["namensbestandteil"];
+	if ($best != "") {$zeil1.= ", ".$best;}
+	$zeil1=htmlentities($zeil1, ENT_QUOTES, "UTF-8");
+
+	$zeil2=trim($row["plz"]." ".$row["ort_post"]);
+	if ($zeil2 != "") {
+		$zeil2="\n\t<br>".htmlentities($zeil2, ENT_QUOTES, "UTF-8");
+	}
+
+	$zeil3= trim($row["strasse"]." ".$row["hausnummer"]);
+	if ($zeil3 != "") {
+		$zeil3= "\n\t<br>".htmlentities($zeil3, ENT_QUOTES, "UTF-8");
+	}
+
+// Tabelle: Sp.1=Icon, Link zur Auskunft Person, Sp.2=Rahmen
+	echo "
+<div class='pe aktuell'>
+<table>
+<tr>
+	<td valign='top'>
+		<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisnamstruk.php?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;gmlid=".$person."\")'>
+			<img class='nwlink' src='ico/Eigentuemer.png' width='16' height='16' alt='EIG' title='Nachweis'>
+		</a>
+	</td>
+	<td>
+		<p class='nam'>".$zeil1.$zeil2.$zeil3."</p>
+	</td>
+</tr>
+</table>
+</div>";
+	return;
+}
+
+function getEigByName() {
+	// 1 // Eigentuemer nach Name(-nsanfang)
+	global $gkz, $debug, $gemeinde, $epsg, $name, $person, $gfilter;
+	$linelimit=150;
+	$arr = explode(",", $name);
+	$name0 = trim($arr[0]);	// Nachname
+	if (count($arr) > 1) {
+		$name1=trim($arr[1]);	// Vorname
+	} else {
+		$name1="";
+	}
+	if(preg_match("/\*/",$name0)){
+		$match = trim(preg_replace("/\*/i","%", strtoupper($name0)));
+	} else {
+		$match = trim($name0)."%";
+	}	
+	if(preg_match("/\*/",$name1)){
+		$match1 = trim(preg_replace("/\*/i","%", strtoupper($name1)));
+	} else {
+		$match1 = trim($name1)."%";
+	}
+	
+	$sql ="SELECT p.nachnameoderfirma, p.vorname, p.gml_id FROM ax_person p ";
+
+// Der Filter auf "Gemeinde" bleibt hier zunÃ€chst unberÃŒcksichtigt, bis im NorGIS-ALKIS-Importer ein Ersatz
+// geschaffen wurde fÃŒr die Tabelle "gemeinde_person" aus dem Post-Processing der "klassischen" Datenstruktur.
+// Es kÃ¶nnen somit Personen gefunden werden, die kein GrundstÃŒck im berechtigten Bereich haben.
+// Wenn eine Gemeinde-DB aus eigenem NBA geladen wurde, ist das unkritisch.
+// Wenn eine Gemeinde aus einer kreisweiten DB beauskunftet wird, ist das so noch nicht einsetzbar. 
+
+/*	if ($gfilter > 0) {
+		$sql.="JOIN gemeinde_person g ON p.gml_id=g.person WHERE p.endet IS NULL AND ";
+		switch ($gfilter) {
+			case 1: // Einzel
+				$sql.="g.gemeinde='".$gemeinde."' AND "; break;
+			case 2: // Liste
+				$sql.="g.gemeinde in ('".str_replace(",", "','", $gemeinde)."') AND "; break;
+		}
+	} else { */
+		$sql.="WHERE p.endet IS NULL AND ";
+//	}
+
+	if($match1 != '%'){
+		$sql.="nachnameoderfirma ILIKE $1 AND p.vorname ILIKE $2 ";		
+		$sql.="ORDER BY p.nachnameoderfirma, p.vorname LIMIT $3 ;";
+		$v=array($match, $match1, $linelimit);
+	}else{
+		$sql.="nachnameoderfirma ILIKE $1 ";		
+		$sql.="ORDER BY p.nachnameoderfirma, p.vorname LIMIT $2 ;";
+		$v=array($match, $linelimit);
+	} 
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>";
+		if ($debug > 2) {echo "<p class='dbg'>SQL=<br>".$sql."<br>$1='".$match."'</p>";}
+		return;
+	}
+	$cnt = 0;
+	while($row = pg_fetch_array($res)) {
+		$nachname=$row["nachnameoderfirma"];
+		$vorname=$row["vorname"];
+		$persongml=$row["gml_id"];
+		zeile_person($persongml, $nachname, $vorname);
+		$cnt++;
+	}
+	if($cnt == 0){ 
+		echo "\n<p class='anz'>Kein Eigent&uuml;mer gefunden.</p>";
+	} elseif($cnt >= $linelimit) { // das Limit war zu knapp
+		echo "\n<p class='anz' title='Bitte den Namen eindeutiger qualifizieren'>... und weitere</p>";
+	} elseif($cnt == 1){ // Eindeutig!
+		$person = $persongml;
+	} else {
+		echo "\n<p class='anz'>".$cnt." Eigent&uuml;mer mit '".$name."'</p>";	// im Limit
+	}
+	return;
+}
+
+function getGBbyPerson() {
+	// 2 // GrundbÃŒcher zur gewÃ€hlten Person
+// Es wird in dieser Function nicht geprÃŒft, ob die gefundenen GrundbÃŒcher auch FlurstÃŒcke
+// haben, die im gefilterten Bereich (Gemeinde) liegen. Es kÃ¶nnen daher "Sackgassen" entstehen,
+// also GrundbÃŒcher, die in der nÃ€chsten Stufe bei Filterung nicht zu Treffern fÃŒhren.
+// Das Joinen bis zum FS unter BerÃŒcksichtigung von speziellen Buchungen ist aber zu aufwÃ€ndig.
+// Dann kann entweder das FS gleich mit ausgegeben werden -> getGBuFSbyPerson.
+// Alternativ wÃŒrde eine Hilfstabelle benÃ¶tigt, in der im PostProcessing 
+// das GB-zu-Gemeinde-VerhÃ€ltnis vorbereitet wird.
+	global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $debug, $bltbez, $bltblatt, $bltseite, $kennztyp, $zgbbez;
+	$linelimit=150;
+
+	// Head
+	familiensuche();
+	personendaten();
+
+	// Body
+	// Suche nach GrundbÃŒchern der Person
+	$sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam 
+	FROM ax_namensnummer n JOIN ax_buchungsblatt gb ON n.istbestandteilvon=gb.gml_id 
+	JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk 
+	WHERE n.bennennt = $1 AND n.endet IS NULL AND gb.endet IS NULL AND b.endet IS NULL;";
+
+	// Parameter $gbkennz, z.B. nach Klick auf Zeile "Bezirk"
+	if ($kennztyp > 1) { // 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
+		#if ($debug > 0) {echo "<p class='dbg'>Filter Bezirk '".$zgbbez."'<p>";}
+		$sql.="AND b.bezirk='".$zgbbez."' ";
+		$bezirkaktuell = true;
+	} else {
+		$bezirkaktuell = false;
+	}
+
+	if ($bltbez.$bltblatt != "") { // BlÃ€ttern, Fortsetzen bei ...
+		$sql.="AND ((b.bezeichnung > '".$bltbez."') ";
+		$sql.="OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung > '".$bltblatt."')) ";
+	}
+
+	$sql.="ORDER BY b.bezeichnung, gb.buchungsblattnummermitbuchstabenerweiterung LIMIT $2 ;";
+
+	if ($bltseite == "") { // Seite 1
+		$bltseite = 1;
+	} else { // Folgeseite
+		echo "\n<p class='ein'>Teil ".$bltseite;
+	}
+	$v=array($person, $linelimit);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Grundbuch</p>";
+		return;
+	}
+	$cnt = 0;
+	$gwbez="";
+	while($row = pg_fetch_array($res)) {
+		$beznr=$row["bezirk"];
+		if ($gwbez != $beznr) { // Gruppenwechsel Bezirk
+			$beznam=$row["beznam"];
+			$gwbez=$beznr;
+			zeile_gbbez ($beznam, $beznr, $bezirkaktuell);
+		}
+		$gml=$row["gml_g"];
+		$blatt=$row["blatt"];
+		zeile_blatt($zgbbez, "", $gml, $blatt, false, $person, false);
+		$cnt++;
+	}
+/*	if ($cnt == 0) { // Nur Entwicklg.
+		if ($debug > 1) {echo "\n<p class='err'>keine Buchung</p>";}
+		if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."',<br>$1 = '".$person."'<p>";}
+	} */
+
+	// Foot
+	if($cnt == 0) { 
+		echo "\n<p class='anz'>Kein Grundbuch zum Eigent&uuml;mer</p>";
+	} elseif($cnt >= $linelimit) {
+		echo "\n<p class='blt'>".$cnt." Grundb. zum Eigent.";
+
+		// BlÃ€ttern
+		$nxtbltbez=urlencode($beznam);
+		$nxtbltblatt=urlencode($blatt);
+		$nxtbltseite=$bltseite + 1;
+		echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltseite=".$nxtbltseite."' ";
+		echo "title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt."'>weitere</a>";
+		echo "</p>";
+	} elseif($cnt == 1) { // Eindeutig!
+		$blattgml=$gml; // dann Stufe 3 gleich nachschieben
+	} else {
+		echo "\n<p class='anz'>".$cnt." Grundb&uuml;cher zum Eigent&uuml;mer</p>";
+	}
+	return;
+}
+
+function getFSbyGB($backlink) {
+	// 3 // FlurstÃŒcke zum Grundbuch
+// Zu einem Grundbuch (gml_id als Parameter) werden alle darauf gebuchten FlurstÃŒcke gesucht.
+// Im ersten Schritt sind das direkt gebuchten FlurstÃŒcke.
+// Im zweiten Schritt wird gesucht nach Rechten einer Buchungstelle des durchsuchten Blattes an anderen
+// Buchungstellen.
+	global $gkz, $gemeinde, $name, $person, $blattgml, $epsg, $gfilter, $debug;
+	if($backlink) { // Erneuter Ansatz bei Person oder GB mÃ¶glich.
+
+		// Namen ermitteln
+		$sql ="SELECT nachnameoderfirma, vorname FROM ax_person WHERE gml_id = $1 AND endet IS NULL;";
+		$v=array($person);
+	 	$res=pg_prepare("", $sql);
+		$res=pg_execute("", $v);
+		if (!$res) {echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>";}
+		$row = pg_fetch_array($res); // nur eine Zeile
+		zeile_person($person, $row["nachnameoderfirma"], $row["vorname"]);
+
+		// Grundbuch-Daten ermitteln
+		$sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam ";
+		$sql.="FROM ax_buchungsblatt gb JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk ";
+		$sql.="WHERE gb.gml_id= $1 AND gb.endet IS NULL and b.endet IS NULL LIMIT 1 ;";
+		$v=array($blattgml);
+		$res=pg_prepare("", $sql);
+		$res=pg_execute("", $v);
+		if (!$res) {echo "\n<p class='err'>Fehler bei Grundbuch</p>";}
+		$row = pg_fetch_array($res); // eine Zeile
+		$gml=$row["gml_g"];
+		$bezirk=$row["bezirk"];
+		$beznam=$row["beznam"];
+		$blatt=$row["blatt"];
+		zeile_gbbez ($beznam, $bezirk, false);
+		zeile_blatt($bezirk, "", $blattgml, $blatt, false, $person, true);	
+	}
+	GB_Buchung_FS(250, ""); // Blatt > Grundst. > FS, max. 250, ohne Link "Buchung"
+	return;
+}
+
+function getGBuFSbyPerson() {
+	// 2 + 3 // GrundbÃŒcher UND FlurstÃŒcke zur gewÃ€hlten Person
+// Dies ist die Kombination von Stufe 2 (GrundbÃŒcher zur Person) und 3 (FlurstÃŒcke zum Grundbuch) 
+// in einem einzelnen Schritt. Wenn auf Gemeinde gefiltert wird, dann kÃ¶nnen in Stufe 2 (noch ohne Filter)
+// auch GrundbÃŒcher gefunden werden, die dann auf Stufe 3 (mit Filter) keine FS liefern ("Sackgasse"!).
+// Wenn aber per JOIN "GB -> FS -> Gemarkung -> Gemeinde" geprÃŒft wird, dann kÃ¶nnen 
+// die Daten ja auch gleich ausgegeben werden.
+// FÃŒr FÃ€lle in denen nicht nach Gemeinde gefiltert wird (z.B. ganzer Kreis) kann weiter 
+// Stufe 2 und 3 nacheinander verwendet werden. Dies ist wahrscheinlich ÃŒbersichtlicher, 
+// weil "ungefiltert" in "2+3" zu lange Listen entstehen wÃŒrden, die durchblÃ€ttert werden mÃŒssen. 
+
+	global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $gfilter, $debug, $bltbez, $bltblatt, $bltbvnr, $bltseite, $bltrecht, $kennztyp, $zgbbez;
+	$linelimit=80; // als Limit "Anzahl FlurstÃŒcke" in den beiden folgenden Abfragen
+	// darf nun etwas knapper sein, weil man jetzt blÃ€ttern kann
+	familiensuche();
+	personendaten();
+
+	// Wenn das Limit ÃŒberschritten wurde: zusÃ€tzliche Parameter "blt"=BlÃ€ttern:
+	// - $bltbez   = Bezirk-Name  
+	// - $bltblatt = BlattMitBuchstabe
+	// - $bltbvnr  = lfd.Nr der Buchungsstelle
+	// - $bltseite = fortlaufende Seiten-Nr
+	// - $bltrecht = "nur"/"ohne" liefert nur den abgebrochene Teil der Auflistung 
+
+	// SQL-Bausteine vorbereiten
+	//  Direkte Buchungen suchen mit:  $sql1 + $sqla1 + $sql2
+	//  SonderfÃ€lle suchen mit:        $sql1 + $sqla2 + $sql2
+
+	// Baustein 1: SQL-Anfang fuer beide Varianten
+	$sql1 ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam, 
+	s1.gml_id as bsgml, s1.laufendenummer AS lfd, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.gemeinde, ot.gemashl, trim(trailing from ot.gemarkung) AS gemarkungsname, ";
+	if($epsg == "25832") { // Transform nicht notwendig
+		$sql1.="st_x(st_centroid(f.wkb_geometry)) AS x, ";
+		$sql1.="st_y(st_centroid(f.wkb_geometry)) AS y ";
+	} else {  
+		$sql1.="st_x(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
+		$sql1.="st_y(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS y ";			
+	}
+
+	// NamenNummer >istbestandteilvon> buchungsblatt <istbestandteilvon< buchungsstelle-1
+	$sql1.="FROM ax_namensnummer nn 
+	JOIN ax_buchungsblatt gb ON gb.gml_id=nn.istbestandteilvon 
+	JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk
+	JOIN ax_buchungsstelle s1 ON gb.gml_id=s1.istbestandteilvon ";
+
+	// Baustein A: Auswahl 1 oder 2
+	// buchungsstelle-1 <istGebucht< FS
+	$sqla1 ="JOIN ax_flurstueck f ON s1.gml_id=f.istgebucht ";
+
+	// buchungsStelle1 (herr.) >an> buchungsStelle2 (dien.) <istGebucht< FS
+	$sqla2 ="JOIN ax_buchungsstelle s2 ON s2.gml_id=ANY(s1.an) ";
+	$sqla2.="JOIN ax_flurstueck f ON s2.gml_id=f.istgebucht ";
+
+	// Baustein 2: SQL-Ende fuer beide Varianten
+	$sql2 ="JOIN gema_shl ot ON f.land || f.gemarkungsnummer = ot.gemashl  "; // Ortsteil
+	$sql2.="WHERE nn.benennt = $1 AND nn.endet IS NULL AND gb.endet IS NULL AND s1.endet IS NULL AND f.endet IS NULL ";
+	$sqlw2="AND s2.endet IS NULL ";
+
+	// Parameter $gbkennz nach Klick auf Zeile "Bezirk"
+	if ($kennztyp > 1) { // 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
+		#if ($debug > 0) {echo "<p class='dbg'>Filter Bezirk '".$zgbbez."'<p>";}
+		$sql2.="AND b.bezirk = '".$zgbbez."' ";
+		$bezirkaktuell = true;
+	} else {
+		$bezirkaktuell = false;
+	}
+
+	switch ($gfilter) { // Gemeinde-Filter
+		case 1: // Einzelwert
+			$sql2.="AND substring(ot.gemshl from 6 for 3)='".$gemeinde."' "; break;
+		case 2: // Liste
+			$sql2.="AND substring(ot.gemshl from 6 for 3) in ('".str_replace(",", "','", $gemeinde)."') "; break;
+	}
+
+	$sql3 ="ORDER BY b.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, cast(s1.laufendenummer AS integer), f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner LIMIT $2 ;";
+	// Sortier-Problem: laufendenummer in varchar linksbÃŒndig
+
+	// Die Bausteine in 2 Varianten kombinieren
+
+	// BlÃ€ttern mit folgenden Parametern: $bltbez, $bltblatt, $bltbvnr, $bltseite, $bltrecht
+	if ($bltbez.$bltblatt.$bltbvnr == "") {
+		$bltwhere ="";
+	} else { // BlÃ€ttern, Fortsetzen bei ...
+		$bltwhere ="AND ((b.bezeichnung > '".$bltbez."') ";
+		$bltwhere.="OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung > '".$bltblatt."') ";
+		$bltwhere.="OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung = '".$bltblatt."' AND cast(s1.laufendenummer AS integer) >= ".$bltbvnr." )) ";
+	} // FlurstÃŒcke in der angeblÃ€tterten BVNR werden ggf. wiederholt
+
+	if ($bltseite == "") { // auf Seite 1 beide Teile ausgegeben
+		$bltseite = 1;
+	} else { // Folgegeseite: nur Teil 1 *oder* 2
+		echo "\n<p class='ein'>Teil ".$bltseite." - ";
+		switch ($bltrecht) {
+			case "nur":
+				echo "nur Rechte an .. Buchungen</p>"; break;
+			case "ohne":
+				echo "nur direkte Buchungen</p>"; break;
+			default:
+				echo "</p>"; break;
+		}
+	}
+
+	// FÃ€lle ohne "Rechte an"
+	if ($bltrecht != "nur") { // "nur"/"ohne" liefert nur den abgebrochene Teil der Auflistung
+		// Blatt <istBestandteilVon<  Buchungsstelle <istGebucht< Flurstck.
+		$sql=$sql1.$sqla1.$sql2.$bltwhere.$sql3; // Direkte Buchungen
+
+		$v=array($person, $linelimit);
+		$res=pg_prepare("", $sql);
+		$res=pg_execute("", $v);
+		if (!$res) {
+			echo "\n<p class='err'>Fehler bei Buchung und Flurst&uuml;ck.</p>";
+			if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."', $1 = '".$person."'<p>";}
+			return;
+		}
+
+		$zfs1=0;
+		$gwbez="";
+		while($row = pg_fetch_array($res)) {
+			$bezirk=$row["bezirk"];
+			if ($gwbez != $bezirk) { // Gruppierung Bezirk
+				$gwbez=$bezirk;
+				$beznam=$row["beznam"];
+				$gwgb="";
+				zeile_gbbez($beznam, $gwbez, $bezirkaktuell);
+			}
+			$gb_gml=$row["gml_g"];
+			if ($gwgb != $gb_gml) { // Gruppierung Blatt (Grundbuch)
+				$blatt=$row["blatt"];
+			//	zeile_blatt($bezirk, $beznam, $gb_gml, $blatt, false, $person, false);
+				zeile_blatt($bezirk, "", $gb_gml, $blatt, false, $person, false);
+				$gwgb = $gb_gml;	// Steuerg GW GB
+				$gwbv = ""; 		// Steuerg GW BVNR
+			}
+			$bvnr=$row["lfd"];
+			if ($gwbv != $bvnr) { // Gruppierung Buchung (BVNR)
+				$gwbv = $bvnr;
+				$bsgml=$row["bsgml"];
+				zeile_buchung($bsgml, $bvnr, "", false, false); //ohne Link
+			}
+			$fs_gml=$row["gml_id"];
+			$gmkg=$row["gemarkungsname"];
+			$flur=$row["flurnummer"];
+			$fskenn=$row["zaehler"];
+			if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];} // BruchNr
+			zeile_flurstueck($fs_gml, $fskenn, $row["x"], $row["y"], $gmkg, $flur, false);
+			$zfs1++;
+		}
+
+		if($zfs1 == 0) {
+			if ($bltrecht == "ohne") {echo "\n<p class='anz'>Keine direkte Buchung gefunden.</p>";}
+			/* nur Entw. 
+			if ($debug > 1) {
+				echo "\n<p class='dbg'>Keine direkte Buchung gefunden.</p>";
+				if ($debug > 2) {echo "<p class='err'>SQL = '".$sql."', $1 = '".$person."'<p>";}
+			} */
+		} elseif($zfs1 >= $linelimit) { // das Limit war zu knapp
+			echo "\n<p class='blt'>";
+			if ($bltseite > 1) {echo "weitere ";}
+			echo $zfs1." Flurst&uuml;cke";
+
+			// B l Ã€ t t e r n  (eine Folgeseite anbieten)
+			$nxtbltbez=urlencode($beznam);
+			$nxtbltblatt=urlencode($blatt);
+			$nxtbltseite=$bltseite + 1;
+			echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person;
+			echo "&amp;gbkennz=".$zgbbez; // Filter Bezirk
+			echo "&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=ohne' ";
+			echo "title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>";
+			echo "</p>";
+		} elseif($zfs1 > 1) { // Meldung (Plural) ab 2, im Limit
+			echo "\n<p class='anz'>";
+			if ($bltseite > 1) {echo "weitere ";}
+			echo $zfs1;
+			if ($kennztyp > 1) {
+				echo " Flurst. zum Eigent. im GB-Bezirk</p>"; 
+			} else {
+				echo " Flurst&uuml;cke zum Eigent&uuml;mer</p>"; 
+			}
+		}
+	}
+
+	if ($bltrecht == "" and $zfs1 > 0) { // beides
+		echo "<hr>"; // dann Trenner
+	}
+
+	// FÃ€lle mit "Rechte an"
+	if ($bltrecht != "ohne") { // "nur"/"ohne" liefert nur den abgebrochene Teil der Auflistung 
+		// Zweite Abfrage (Variante) aus den Bausteinen zusammen bauen
+		// buchungsStelle2 <an< buchungsStelle1
+		$sql=$sql1.$sqla2.$sql2.$bltwhere.$sqlw2.$sql3; // Rechte an
+		$v=array($person, $linelimit);
+		$res=pg_prepare("", $sql);
+		$res=pg_execute("", $v);
+		if (!$res) {
+			echo "\n<p class='err'>Fehler bei Recht an Buchung.</p>";
+			return;
+		}
+		$zfs2=0;
+		$gwbez="";
+		while($row = pg_fetch_array($res)) {	
+			$bezirk=$row["bezirk"];
+			if ($gwbez != $bezirk) { // Gruppierung Bezirk
+				$gwbez=$bezirk;
+				$beznam=$row["beznam"];
+				$gwgb="";
+				zeile_gbbez($beznam, $gwbez, $bezirkaktuell);
+			}
+			$gb_gml=$row["gml_g"];
+			if ($gwgb != $gb_gml) {  // Gruppierung Blatt (Grundbuch)
+				$beznam=$row["beznam"];
+				$blatt=$row["blatt"];
+				zeile_blatt ($bezirk, "", $gb_gml, $blatt, false, $person, false);
+				$gwgb = $gb_gml;	// Steuerg GW GB
+				$gwbv = ""; 		// Steuerg GW BVNR
+			}
+			$bvnr=$row["lfd"];
+			if ($gwbv != $bvnr) { // Gruppierung Buchungs (BVNR)
+				$gwbv = $bvnr;
+				$bsgml=$row["bsgml"];
+				zeile_buchung($bsgml, $bvnr, "", true, false); // Recht an ... // ohne Link!
+			}
+			$fs_gml=$row["gml_id"];
+			$gmkg=$row["gemarkungsname"];
+			$flur=$row["flurnummer"];
+			$fskenn=$row["zaehler"];
+			if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];}
+			$x=$row["x"];
+			$y=$row["y"];
+			zeile_flurstueck ($fs_gml, $fskenn, $x, $y, $gmkg, $flur, false);
+			$zfs2++;
+		}
+		if($zfs2 == 0) {
+			if ($zfs1 == 0 or $bltrecht == "nur") { // keine Meldung wenn schon in Teil 1 eine Ausgabe
+				echo "\n<p class='anz'>Keine Rechte an Buchungen.</p>";
+			}
+		} elseif($zfs2 >= $linelimit) { // das Limit war zu knapp, das  B l Ã€ t t e r n  anbieten
+			echo "\n<p class='blt'>";
+			if ($bltseite > 1) {echo "weitere ";}
+			echo $zfs2." Rechte an Flurst.";
+			$nxtbltbez=urlencode($beznam);
+			$nxtbltblatt=urlencode($blatt);
+			$nxtbltseite=$bltseite + 1;
+			echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person;
+			echo "&amp;gbkennz=".$zgbbez; // Filter Bezirk
+			echo "&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=nur' ";
+			echo "title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>";
+			echo "</p>";
+		} elseif($zfs2 > 1) { // ab 2
+			echo "\n<p class='anz'>";
+			if ($bltseite > 1) {echo "weitere ";}
+			echo $zfs2." Rechte an Flurst.</p>"; // im Limit		
+		}
+	} // ENDE FÃ€lle mit "Rechte an"
+	return;
+}
+
+// ===========
+// Start hier!
+// ===========
+// Parameter:  
+// 1. name   = Suche nach Namensanfang oder -bestandteil.
+// 2. person = gml_id der Person      -> Suche nach GrundbÃŒchern
+// 3. gb     = gml_id des Grundbuches -> Suche nach FlurstÃŒcken
+
+if(isset($epsg)) {
+	$epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);	
+} else {
+	$epsg=$gui_epsg; // aus Conf
+}
+if ($gemeinde == "") {
+	$gfilter = 0; // Gemeinde ungefiltert
+} elseif(strpos($gemeinde, ",") === false) {
+	$gfilter = 1; // Gemeinde Einzelwert
+} else {
+	$gfilter = 2; // Gemeinde Filter-Liste
+}
+
+$kennztyp=ZerlegungGBKennz($gbkennz); // Grundbuch-Kennzeichen aus Parameter zerlegen: $z__ 
+// 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
+
+// Quo Vadis?
+if($blattgml != "") { // FlurstÃŒcke zum Grundbuch
+
+	// Das Programm hat sich selbst verlinkt aus einer Liste der GB zu einem EigentÃŒmer.
+	// Wenn Parameter mitgegeben wurden, kÃ¶nnen diese fÃŒr einen "Link zurÃŒck" verwendet werden.
+	$trans="Flurst&uuml;cke zum Grundbuch";
+	getFSbyGB(true); // mit BackLink
+
+} elseif($person != "") { // GrundbÃŒcher zur Person
+	// Das Programm hat sich selbst verlinkt aus einer Liste der Personen zu einer Suchmaske.
+	//if ($debug >= 2) {echo "\n<p class='dbg'>Gemeinde-Filter-Steuerung = '".$gfilter."'</p>";}
+
+	// Die Filtereinstellung beeinflusst die Such-Strategie:
+	if ($gfilter == 0) { // Keine Filterung auf "Gemeinde": groÃe Datenmenge
+		if ($kennztyp > 1) {
+			$trans = "Grundb&uuml;cher in ".$zgbbez." von .."; // Filter GB-Bez
+		} else {
+			$trans = "Grundb&uuml;cher von .."; // Name steht darunter
+		}
+		getGBbyPerson();
+		// Also schrittweise erst mal Stufe 2 = GrundbÃŒcher zur Person suchen.
+		if(isset($blattgml) ) {	// Es wurde nur EIN Grundbuch zu der Person gefunden.
+			$trans = "1 Blatt zum Eigent&uuml;mer";
+			getFSbyGB(false); 	// Dann dazu auch gleich die Stufe 3 hinterher, aber ohne Backlink.
+		}
+	} else { // mit Filter auf Gemeinde: weniger Daten?
+		if ($kennztyp > 1) {
+			$trans="Grdb. und Flst. von .. in .."; // Filter GB-Bez,
+			// darunter sind dann Name und Bezirk farblich markiert
+		} else {
+			$trans="Grundb. und Flurst. von .."; // der EigentÃŒmer steht darunter
+		}
+		getGBuFSbyPerson(); // Schritte 2+3 gleichzeitig, dabei Gemeinde-Filter auf Stufe 3
+	}
+
+} elseif(isset($name)) { // Suchbegriff aus Form: Suche nach Name
+
+	$trans="Namensuche \"".$name."\"";
+	getEigByName(); // Suchen nach Namensanfang
+
+	if($person != "") { // genau EIN Treffer zum Namen
+		if ($gfilter == 0) {
+			$trans="Grundb&uuml;cher zum Namen";
+			getGBbyPerson(); // Dann gleich das Grundbuch hinterher
+		} else {
+			$trans="Grdb. und Flst. zum Namen";
+			getGBuFSbyPerson();	// .. oder auch GB + FS
+		}
+	}
+
+} elseif ($debug >= 1) {
+	$trans="falscher Aufruf";
+	echo "\n<p class='dbg'>Parameter?</p>"; // sollte nicht vorkommen
+}
+
+// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion 
+//  im Kopf des Ergebnisrahmens anzeigen.
+// Dazu die im HTML-Header definierte Javascript-Function benutzen.
+// Alternativ wird auch aus dem Javascript "positionieren Karte" dieser Titel gesetzt.
+echo "
+<script type='text/javascript'>
+	transtitle('".$trans."'); 
+</script>";
+
+?>
+
+</body>
+</html>
Index: trunk/mapbender/http/navn/alkisnav_fkt.php
===================================================================
--- trunk/mapbender/http/navn/alkisnav_fkt.php	(revision 360)
+++ trunk/mapbender/http/navn/alkisnav_fkt.php	(revision 360)
@@ -0,0 +1,421 @@
+<?php
+/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil "Funktionen"
+	(Wird nicht direkt aufgerufen sonden in den anderen Modulen eingebunden).
+	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
+
+Version vom 
+	2016-02-11	Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
+*/
+
+function is_ne_zahl($wert) {
+	// PrÃŒft, ob ein Wert ausschlieÃlich aus den Zahlen 0 bis 9 besteht
+	if (trim($wert, "0..9") == "") {return true;} else {return false;}
+}
+
+function ZerlegungGBKennz($gbkennz) {
+	// Das eingegebene Grundbuch-Kennzeichen auseinander nehmen (gggg-999999z-BVNR)
+	// Return: 9=Fehler, 0=Listen alle Bezirke 1=Such Bezirk-Name
+	//  2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
+	global $zgbbez, $zblatt, $zblattn, $zblattz, $zbvnr;
+	$arr=explode("-", $gbkennz, 3);
+	$zgbbez=trim($arr[0]);
+	if (count($arr) > 1) {
+		$zblatt=trim($arr[1]);
+		if (count($arr) > 2) {
+			$zbvnr=trim($arr[2]);
+		} else {
+			$zbvnr="";
+		}
+	} else {
+		$zblatt="";
+		$zbvnr="";
+	}
+	if ($zgbbez == "") { // keine Eingabe
+		return 0; // Amtsgerichte oder Bezirke listen
+	} elseif ( ! is_ne_zahl($zgbbez)) { // Alphabetische Eingabe
+		return 1; // Such Bezirk-NAME
+	} elseif ($zblatt == "") {
+		return 2; // Such Bezirk-NUMMER
+	} else { // Format von BlattNr pruefen
+	//'19'      linksbÃŒndig
+	//'000019 ' gefÃŒllt 6 + blank
+	//'000019A' .. mit Zusatzbuchstabe
+	//'0300001' gefÃŒllt 7, bei Blattart 5000 "fiktives Blatt"
+		$len=strlen($zblatt);
+		if ($len > 0 AND $len < 8) {		
+			if (trim($zblatt, "0..9 ") == "") { // Normalfall: nur Zahlen (und Blank))
+				$zblattn= rtrim(ltrim($zblatt, "0"), " ");
+				$zblattz="";
+			} else { // Sonderfall: Zusatz-Buchstabe am Ende
+				$zblattn=substr($zblatt,0,$len-1);
+				$zblattz=strtoupper(substr($zblatt,$len-1,1)); 
+				if ((trim($zblattn, "0..9") == "") and (trim($zblattz, "A..Z") == "")) {
+					$zblattn= ltrim($zblattn, "0"); // ohne fuehrende Nullen
+				} else {
+					echo "<p class='err>Format 'Blatt': bis zu 6 Zahlen und ggf. ein Buchstabe</p>";	
+					return 9;
+				}
+			}
+			if ($zbvnr == "") {
+				return 3; // Such BLATT
+			} elseif (is_ne_zahl($zbvnr)) {		
+				// $zbvnr=ltrim($zbvnr,"0"); // DB-Format ist integer
+				// Vorsicht, Wert "0" ist moeglich und gueltig
+				return 4; // Such Grundstueck
+			} else {
+				echo "<p class='err>Die Buchungsstelle (BVNR) '".$zbvnr."' ist nicht numerisch</p>";
+				return 9;
+			}
+		} else {
+			echo "<p class='err>Das Grundbuch-Blatt '".$zblatt."' ist ung&uuml;ltig.</p>";
+			return 9;
+		}
+	}
+}
+
+function suchfeld($suchstring) {	// Suchstring Ausgeben UND das Eingabeformular damit belegen
+	$out="<a title='Dies als Suchbegriff setzen' href='javascript:formular_belegung(\"".$suchstring."-\")'>".$suchstring."</a>";
+	return $out;
+}
+
+// function Typ "zeile_**"  = Ausgabe eines Knotens
+// - Icon,  ggf. mit Link zur Buchauskunft
+// - Zeile, ggf. mit Link zur weiteren AuflÃ¶sung untergeordneter Knoten
+// Hierin die Encodierung fÃŒr url und HTML.
+
+function zeile_ag ($ag, $anr, $aktuell) {
+	// Zeile  A m t s g e r i c h t
+	global $gkz, $gemeinde, $epsg, $auskpath;
+	if ($ag == "") {
+		$agd=$anr; // Ersatz: Nummer statt Name. Besser: Name immer fÃŒllen
+	} else {
+		$agd=htmlentities($ag, ENT_QUOTES, "UTF-8");
+	}
+	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
+	echo "\n<div class='ga".$cls."' title='Amtsgericht'>";
+		echo "\n\t\t<img class='nwlink' src='ico/Gericht.png' width='16' height='16' alt='AG' title='Amtsgericht'> ";
+		echo "AG <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;ag=".$anr."'>";		
+		echo $agd."</a> (".$anr.")";
+	echo "\n</div>";
+	return;
+}
+
+function zeile_gbbez ($gnam, $zgbbez, $aktuell) {
+	// Zeile Grundbuch - B e z i r k
+	// Parameter: aktuell = Bool fÃŒr farbliche Markierung der Zeile als aktuell angeklicktes Obj.
+	global $gkz, $gemeinde, $epsg, $person;
+	$gnamd=htmlentities($gnam, ENT_QUOTES, "UTF-8");
+	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
+	echo "\n<div class='gk".$cls."' title='GB-Bezirk'>";
+	echo "\n\t\t<img class='nwlink' src='ico/GB-Bezirk.png' width='16' height='16' alt='Bez.' title='GB-Bezirk'> ";
+	echo "<a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;gbkennz=".$zgbbez;
+	echo "&amp;gbbeznam=".urlencode($gnam);
+	if ($person != "") { // EigentÃŒmer-Suche
+		echo "&amp;person=".$person."'>";
+		echo "Bezirk ".$gnamd."</a> (".$zgbbez.")";		
+	} else {  // Grundbuch-Suche
+		echo "'>";
+		echo "Bezirk ".$gnamd."</a> (".suchfeld($zgbbez).")";		
+	}
+	echo "\n</div>";
+	return;
+}
+
+function zeile_blatt ($bezirk, $beznam, $blattgml, $blatt, $dienend, $person, $aktuell) {
+	// Zeile Grundbuch - B l a t t
+	// Aufruf aus Teil "Grundbuch" und Teil "EigentÃŒmer"
+	// Parameter $beznam = Name des GB-Bezirks. Sollte nur gefÃŒllt sein, bei dienendem Blatt ("Recht an").
+	//		sonst steht der Bezirk als Header-Zeile darÃŒber.
+	global $gkz, $gemeinde, $epsg, $auskpath;
+
+	$blattd=ltrim($blatt, "0"); // Display-Version ohne fÃŒhrende Nullen
+	if ($dienend) {$dientxt="dienendes ";} else {$dientxt="";}
+	$blattlnk=urlencode($blatt); // trailing Blank
+	if ($beznam != "") {$nam = $beznam." ";} else {$nam="";}
+	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
+
+	echo "\n<div class='gb".$cls."' title='".$dientxt."GB-Blatt'>";
+
+	// Icon / Nachweis
+	if ($blattgml == "") { // Link zum Nachweis nur wenn GML bekannt
+		echo "\n\t<img class='nwlink' src='ico/GBBlatt_link.png' width='16' height='16' alt='Blatt' title='".$dientxt."GB-Blatt'>";
+	} else {
+		echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$blattgml."\")'>";
+			echo "\n\t\t<img class='nwlink' src='ico/GBBlatt_link.png' width='16' height='16' alt='Blatt' title='Nachweis'>";
+		echo "\n\t</a> ";
+	}
+
+	// Text, Self-Link
+	echo $nam." <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg;
+	echo "&amp;blattgml=".$blattgml."&amp;gbkennz=".$bezirk."-".$blattlnk;
+
+	echo "&amp;gbbeznam=".urlencode($beznam);
+
+	if ($person != "") {echo "&amp;person=".$person;} // nur fÃŒr EigentÃŒmer-Suche
+	echo "'>Blatt&nbsp;".$blattd."</a>\n</div>";
+	return;
+}
+
+function zeile_buchung($buchunggml, $bvnr, $blattkennz, $dienend, $aktuell) {
+	// Zeile  B u c h u n g s s t e l l e  -  GrundstÃŒck ausgeben
+	global $gkz, $gemeinde, $epsg, $auskpath, $debug;
+	//if ($debug > 1) {echo "<p class='dbg'>function zeile_buchung()<p>";} // Ablauf-Verfolgung
+
+	if ($bvnr == 0) { // Keine echten BVNR vergeben (z.B. Lippe)
+		$bvnra = "-"; // Fehlanzeige
+	} else {
+		$bvnra = str_pad($bvnr, 4, "0", STR_PAD_LEFT); // auf 4 Stellen
+	}
+	if ($dienend) {
+		$ti="dienendes&nbsp;";
+		$re="Recht an ";
+	} else {
+		$ti="";
+		$re="";
+	}
+	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
+	echo "\n<div class='gs".$cls."' title='".$ti."Grundst&uuml;ck'>";
+	echo "\n\t<img class='nwlink' src='ico/Grundstueck.png' width='16' height='16' alt='GS'  title='".$ti."Grundst&uuml;ck'> ".$re;
+	if ($blattkennz == "") { // ohne Link
+		echo "Buchung ".$bvnra;
+	} else {
+		$gbkennlnk=urlencode($blattkennz."-".$bvnr); // Trailing Blanks!
+		echo "<a href='".$_SERVER['SCRIPT_NAME']. "?gkz=". $gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;buchunggml=".$buchunggml;
+		echo "&amp;gbkennz=".$gbkennlnk."'>Buchung ".$bvnra."</a>";
+	}
+	echo "\n</div>";
+	return;
+}
+
+function zeile_gemeinde ($gmdnr, $gmdname, $aktuell) {
+	// Eine Kopf-Zeile zu Gemeinde ausgeben
+	global $gkz, $gemeinde, $epsg;
+	$stadt=htmlentities($gmdname, ENT_QUOTES, "UTF-8");
+	$bez=urlencode($gmdname);
+	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
+	echo "\n<div class='gm".$cls."' title='Gemeinde'>";
+		echo "\n\t\t<img class='nwlink' src='ico/Gemeinde.png' width='16' height='16' alt='Stadt'>";
+		echo " Gem. <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;gm=".$gmdnr."&amp;bez=".$bez."'>";		
+		echo  " ".$stadt."</a> (".substr($gmdnr, 5).")";
+	echo "\n</div>";
+	return;
+}
+
+function zeile_gemarkung($gkgnr, $gkgname, $aktuell) {
+	// Eine Kopf-Zeile zur Gemarkung ausgeben
+	global $con, $gkz, $gemeinde, $epsg, $gfilter;
+
+	if ($gkgname == "") { // Falls Gem.-Name fehlt, in DB nachschlagen
+		$sql ="SELECT bezeichnung FROM ax_gemarkung WHERE gemarkungsnummer = $1 LIMIT 1;";
+		$v=array($gnr);
+		$res=pg_prepare("", $sql);
+		$res=pg_execute("", $v);
+		if (!$res) {echo "\n<p class='err'>Fehler bei Gemarkungsname.</p>";}
+		$row = pg_fetch_array($res);
+		$gkgname=$row["bezeichnung"];
+	}
+
+	if ($gkgname == "") {$gkgname = "(unbekannt)";}
+	$gnam=htmlentities($gkgname, ENT_QUOTES, "UTF-8");
+	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
+
+	echo "\n<div class='gk".$cls."' title='Gemarkung'>";
+	echo "\n\t\t<img class='nwlink' src='ico/Gemarkung.png' width='16' height='16' alt='GKG' title='Gemarkung'>";
+	echo " OT <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$gkgnr."'>";		
+	echo  " ".$gnam."</a> (".substr($gkgnr, 2).")";
+	echo "\n</div>";
+	return;
+}
+
+function zeile_flurstueck ($fs_gml, $fskenn, $x, $y, $gmkg, $flur, $aktuell) {
+	// Zeile mit Icon (Link zum Buch-Nachweis) und Text (Link zum Positionieren)
+	global $gkz, $gemeinde, $epsg, $auskpath, $scalefs;
+
+	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
+	echo "\n<div class='fs".$cls."'>";
+	echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$fs_gml."\")'>";
+		echo "\n\t\t<img class='nwlink' src='ico/Flurstueck_Link.png' width='16' height='16' alt='FS' title='Nachweis'>";
+	echo "\n\t</a>\n\t";			
+
+	echo "&nbsp;<a title='Flurst&uuml;ck positionieren 1:".$scalefs."' href='";
+	echo "javascript:";
+		echo "transtitle(\"auf Flurst&uuml;ck positioniert\"); ";
+		echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalefs."); ";
+		echo "parent.parent.showHighlight(".$x.",".$y.");' ";
+	echo "onmouseover='parent.parent.showHighlight(".$x.",".$y.")' ";
+	echo "onmouseout='parent.parent.hideHighlight()'>";
+
+	if ($gmkg == "" ) {
+		echo "Flst. "; // Im FS-Teil: Gem+Flur als Knoten darÃŒber ($gmkg und $flur leer)
+	} else {
+		echo $gmkg." "; // Im GB-und Nam-Teil in der Zeile angezeigt
+	}
+	if ($flur != "" ) {echo $flur."-";}
+	echo $fskenn."</a>\n</div>";
+	return;
+}
+
+function zeile_person ($persongml, $nachname, $vorname) {
+	// Zeile  P e r s o n (oder Firma)
+	global $gkz, $gemeinde, $epsg, $auskpath;
+
+	$nnam=htmlentities($nachname, ENT_QUOTES, "UTF-8");
+	$namlnk=urlencode($nachname);
+	$vnam=htmlentities($vorname, ENT_QUOTES, "UTF-8");
+	// Link zur Auskunft Person ++ Icon differenzieren nach Eigentuemerart?
+
+echo "<div class='pe'>
+	<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisnamstruk.php?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;gmlid=".$persongml."\")'>
+		<img class='nwlink' src='ico/Eigentuemer.png' width='16' height='16' alt='EIG' title='Nachweis'>
+	</a> 		
+	<a title='Person' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$persongml."&amp;name=".$namlnk."'>".$nnam.", ".$vnam."</a>
+</div>";
+return;
+}
+
+function zeile_strasse ($gkey, $skey, $sname, $kgml, $gemname) {
+	// Listen-Zeile (nicht Kopfzeile) fÃŒr eine gefundenen StraÃe ausgeben.
+	// Die Kopfzeile ÃŒber den Hausnummern hat einen zusÃ€tzlichen Koordinaten-Map-Link, das ist in der Liste zu aufwÃ€ndig?
+	global $gkz, $gemeinde, $epsg, $auskpath, $gfilter, $debug;
+	//if ($debug > 1) {echo "<p class='dbg'>function zeile_strasse()<p>";} // Ablauf-Verfolgung
+
+	echo "\n\t<div class='stl' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
+
+	// Icon -> Buchnachweis
+	echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml."\")'>";
+		echo "\n\t\t<img class='nwlink' src='ico/Lage_mit_Haus.png' width='16' height='16' alt='STR' title='Auskunft Stra&szlig;e'>";
+	echo "\n\t</a>";
+	// Zeile -> Suche HsNr
+	echo " <a class='st' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$gkey."' title='in ".$gemname."'>".$sname;
+	echo "</a> (".$skey.")";
+
+	// Die Gemeinde dahinter falls mehrere mÃ¶glich
+	switch ($gfilter) {
+		case 0: // Kein Filter
+			echo " in ".$gemname; break;
+		case 2: // Liste
+			echo " in ".$gemname; break;
+	}
+	echo "</div>";
+	return;
+}
+
+function GB_Buchung_FS ($linelimit, $blattgbkenn) {
+	// Zu einem Grundbuch-Blatt (identifiziert ÃŒber seine gml_id) suchen der 
+	// Buchungen (Gruppenwechsel) und FlurstÃŒcke (Links)
+	global $gemeinde, $blattgml, $epsg, $gfilter, $debug;
+
+	// SQL-Bausteine
+	// vorne gleich
+	$sql1 ="SELECT s1.laufendenummer AS lfd, s1.gml_id AS bsgml, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.gemeinde, ";
+	if($epsg == "25832") { // Transform nicht notwendig
+		$sql1.="st_x(st_centroid(f.wkb_geometry)) AS x, ";
+		$sql1.="st_y(st_centroid(f.wkb_geometry)) AS y, ";
+	} else {  
+		$sql1.="st_x(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
+		$sql1.="st_y(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS y, ";			
+	}
+	$sql1.="g.bezeichnung FROM ax_buchungsstelle s1 "; 
+
+	// zwischen, Variante 1.
+    $sqlz1="JOIN ax_flurstueck f ON f.istgebucht=s1.gml_id ";
+
+	// zwischen, Variante 2. Nur an oder "an" und "zu"?
+	$sqlz2 ="JOIN ax_buchungsstelle s2 ON s2.gml_id=ANY(s1.an) 
+	JOIN ax_flurstueck f ON f.istgebucht=s2.gml_id ";
+
+	// hinten gleich
+	$sql2="JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
+	WHERE s1.istbestandteilvon = $1 AND f.endet IS NULL AND s1.endet IS NULL ";
+
+	switch ($gfilter) {
+		case 1: // Einzelwert
+			$sql2.="AND f.gemeinde='".$gemeinde."' "; break;
+		case 2: // Liste
+			$sql2.="AND f.gemeinde in ('".str_replace(",", "','", $gemeinde)."') "; break;
+	}
+
+	// WHERE-Zusatz bei 2
+	$sqlw2=" AND s2.endet IS NULL ";
+
+	$sqlord="ORDER BY cast(s1.laufendenummer AS integer), f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner LIMIT $2 ;";
+
+	// d i r e k t e  B u c h u n g e n
+	// Blatt <istBestandteilVon<  Buchungsstelle <istGebucht< FlurstÃŒck
+	$v=array($blattgml, $linelimit); // Rel. istBestandteilVon
+	$res=pg_prepare("", $sql1.$sqlz1.$sql2.$sqlord);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Buchung und Flurst&uuml;ck.</p>";
+		if ($debug >= 3) {echo "\n<p class='err'>SQL='".$sql1.$sqlz1.$sql2.$sqlord."'<br>$1 = '".$blattgml."'</p>";}
+		return;
+	}
+	$zfs1=0;
+	$gwbv="";
+	while($row = pg_fetch_array($res)) {	
+		$bvnr=$row["lfd"];
+		$bsgml=$row["bsgml"]; // Buchungsstelle gml_id
+		if ($gwbv != $bvnr) { // Gruppierung Buchungs-Stelle (BVNR)
+			$gwbv = $bvnr;
+			zeile_buchung($bsgml, $bvnr, $blattgbkenn, false, false);
+		}
+		$fs_gml=$row["gml_id"];
+		$gmkg=$row["bezeichnung"];
+		$flur=$row["flurnummer"];
+		$fskenn=$row["zaehler"];
+		if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];} // BruchNr
+		$x=$row["x"];
+		$y=$row["y"];
+		zeile_flurstueck ($fs_gml, $fskenn, $x, $y, $gmkg, $flur, false);
+		$zfs1++;
+	}
+	// "nichts gefunden" erst melden, wenn auch Teil 2 (Rechte an) nichts findet
+	if($zfs1 > 1) { // ab 2
+		echo "\n<p class='anz'>".$zfs1." Flurst&uuml;cke zum Grundbuch";
+		if($zfs1 >= $linelimit) {
+			echo "... und weitere"; //++ BlÃ€ttern einfÃŒhren?
+		}
+		echo "</p>";
+	}
+	if($zfs1 > 0) {echo "<hr>";} // Trennen
+
+	// Rechte "an"  (dienende  Buchungen)
+	$v=array($blattgml, $linelimit);
+	$res=pg_prepare("", $sql1.$sqlz2.$sql2.$sqlw2.$sqlord);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Recht an Buchung.</p>";
+		#if ($debug >= 3) {echo "\n<p class='dbg'>".$sql1.$sqlz2.$sql2.$sqlw2.$sqlord."</p>";}
+		return;
+	}
+	$zfs2=0;
+	$gwbv="";
+	while($row = pg_fetch_array($res)) {	
+		$bvnr=$row["lfd"];
+		$bsgml=$row["bsgml"]; // Buchungsstelle gml_id
+		if ($gwbv != $bvnr) { // Gruppierung Buchung (BVNR) - dienend
+			$gwbv = $bvnr;
+			zeile_buchung($bsgml, $bvnr, $blattgbkenn, true, false);
+		}
+		$fs_gml=$row["gml_id"];
+		$gmkg=$row["bezeichnung"];
+		$flur=$row["flurnummer"];
+		$fskenn=$row["zaehler"];
+		if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];} // Bruchnummer
+		zeile_flurstueck ($fs_gml, $fskenn, $row["x"], $row["y"], $gmkg, $flur, false);
+		$zfs2++;
+	}
+	// Foot
+	if($zfs1 + $zfs2 == 0) { 
+		echo "\n<p class='anz'>Kein Flurst&uuml;ck im berechtigten Bereich.</p>";
+	} elseif($zfs2 > 1) { // keine Meldung "nichts gefunden - Rechte an" wenn Treffer in Teil 1
+		echo "\n<p class='anz'>".$zfs2." Rechte an Flurst.";
+		if($zfs2 >= $linelimit) {
+			echo "... und weitere"; // BlÃ€ttern einfÃŒhren?
+		}
+		echo "</p>";
+	}
+	return;
+}
+
+?>
Index: trunk/mapbender/http/navn/alkisnav_fls.php
===================================================================
--- trunk/mapbender/http/navn/alkisnav_fls.php	(revision 360)
+++ trunk/mapbender/http/navn/alkisnav_fls.php	(revision 360)
@@ -0,0 +1,817 @@
+<?php
+/*	Navigation mit ALKIS-Daten im Mapbender 2.7 - Teil FlurstÃŒck-Suche 
+	Diese Version des Programms verwendet die Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
+
+Hinweis: In der Mapbender-Konfiguration muss die Gemeindenummer nun 3stellig mit fÃŒhrenden 0 angegeben sein. 
+
+Version vom
+	2016-02-11	Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
+*/
+
+// Variable initialisieren
+$hist="n";
+$gm="";
+
+$cntget = extract($_GET);
+include("../../conf/alkisnav_conf.php");
+include("alkisnav_fkt.php"); // Funktionen
+$con_string = "host=".$host." port=".$port." dbname=".$dbname.$gkz." user=".$user." password=".$password;
+$con = pg_connect ($con_string) or die ("Fehler bei der Verbindung zur Datenbank ".$dbname.$gkz);
+
+echo <<<END
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+	<meta http-equiv="cache-control" content="no-cache">
+	<meta http-equiv="pragma" content="no-cache">
+	<meta http-equiv="expires" content="0">
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<title>ALKIS-Suche Flurst&uuml;ck</title>
+	<link rel="stylesheet" type="text/css" href="alkisnav.css">
+	<script type="text/javascript">
+		function imFenster(dieURL) {
+			var link = encodeURI(dieURL);
+			window.open(link,'','left=10,top=10,width=620,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
+		}
+		function transtitle(trans) {
+			document.getElementById('transaktiontitle').innerHTML = trans;
+		}
+	</script>
+</head>
+<body>
+<a href='javascript:history.back()'>
+	<img src="ico/zurueck.png" width="16" height="16" alt="&lt;&lt;" title="zur&uuml;ck">
+</a>&nbsp;
+<span title='zuletzt ausgef&uuml;hrte Aktion'>
+	<dfn class='title' id='transaktiontitle'></dfn>
+</span>
+
+END;
+
+function h_hinten($zahl) {
+	// Testen: Wurde an eine Zahl ein "h" angehÃ€ngt?
+	// Wenn ja, dann Schalter setzen und nur den numerischen Teil zurÃŒck geben.
+	global $phist, $debug;
+	$zahl=trim($zahl);
+	$zlen=strlen($zahl) - 1;
+	if ($zlen > 0) {
+		$hinten = ucfirst(substr($zahl, $zlen, 1));
+		if ($hinten == "H" ) {
+			$vorn=trim(substr($zahl, 0, $zlen));
+			if (is_ne_zahl($vorn)) { // Zahl *und* "H"
+				$zahl = $vorn;
+				$phist = true;
+			}
+		}
+	}
+	return $zahl;
+}
+
+function ZerlegungFsKennz($fskennz) {
+	// Das eingegebene FlurstÃŒcks-Kennzeichen auseinander nehmen. Erwartet wird (ll)gggg-fff-zzzz/nnn
+	// Die Teile der *Z*erlegung werden ÃŒber die Global-Variablen "$z..." allen Functions bereit gestellt.
+	// Der Returncode dieser Function steuert die weitere Verarbeitung.
+	global $debug, $land, $zgemkg4, $zgemkg6, $zflur, $zzaehler, $znenner;	
+	$arr = explode("-", $fskennz, 4); // an den Trenn-Strichen aufteilen
+
+	// Gemarkung mit oder ohne Land davor? In der Eingabe soll beides zulÃ€ssig sein.
+	// Bei den SQL-Abfragen in der norGIS-ALKIS-Importer Datenbankstruktur werden abwechselnd beide
+	// Formate benÃ¶tigt: z.B. ax_gemarkungsteilflur.gemarkung -> 4stellig, gema_shl.gemashl -> 6stellig
+	// Also gleich beide Formate vorhalten.
+	$gemkg=trim($arr[0]);
+
+	if (count($arr) > 1) {
+		$zflur=h_hinten($arr[1]);
+		if (count($arr) > 2) {
+			$zfsnr=trim($arr[2]);
+		} else {
+			$zfsnr="";
+		}
+	} else {
+		$zflur="";
+		$zfsnr="";
+	}
+	if ($debug > 1) {echo "<p class='dbg'>Gemkg: '".$gemkg."' Flur: '".$zflur."' NR: '".$zfsnr."'</p>";}
+
+	if ($gemkg == "") {
+		return 0; // Gemeinden oder Gemarkungen listen
+	} elseif ( ! is_ne_zahl($gemkg)) {
+		return 1; // Such Name
+	}
+
+	// Gemarkungs-NUMMER wurde eingegeben. Mit oder ohne Land davor?
+	if (strlen($gemkg) == 4 ) { // Eingabe ohne Land
+		$zgemkg4=$gemkg;		// 4stellige Version ohne Land
+		$zgemkg6=$land.$gemkg;	// 6stellige Version mit  Land
+	} elseif (strlen($gemkg) == 6 ) { // Eingabe mit Land
+		$zgemkg4=substr($gemkg, 2);
+		$zgemkg6=$gemkg;
+		if (substr($gemkg, 0, 2) != $land) { // Passt Eingabe zu Conf?
+			echo "<p class='err'>Die 6-stellige Gemarkungsnummer '".$zgemkg6."' sollte mit Land '".$land."' beginnen.</p>";
+		}
+	} else { // weder noch
+		$zgemkg4=$gemkg; // kann eigentlich nicht funktionieren
+		$zgemkg6=$gemkg; // Nullen davor setzen?
+		echo "<p class='err'>Die Gemarkungsnummer kann 4- oder 6-stellig (mit Land '".$land."') eingegeben werden.</p>";
+	}
+
+	if ($zflur == "") { // keine Eingabe Flur-Nummer
+		return 2; // also nur Gemarkungs-Nr eingegeben
+	} elseif ( ! is_ne_zahl($zflur)) {
+		echo "<p class='err'>Die Flurnummer '".$zflur."' ist nicht numerisch</p>";
+		return 9;
+	} elseif ($zfsnr == "") { // Flur eingegeben, aber keine FlurstÃŒcksnummer mehr
+		return 3; // Flur				
+	} else {
+		$zn=explode("/", $zfsnr, 2); // Bruchnummer?
+		$zzaehler=h_hinten(trim($zn[0]));
+		if (count($zn) > 1) {$znenner=h_hinten(trim($zn[1]));} else {$znenner="";}
+		if ( ! is_ne_zahl($zzaehler)) {
+			echo "<p class='err'>FlurstÃŒcksnummer '".$zzaehler."' ist nicht numerisch</p>";
+			return 9;
+		} elseif ($znenner == "") {
+			return 4;
+		} elseif (is_ne_zahl($znenner)) {
+			return 5;								
+		} else {
+			echo "<p class='err'>FlurstÃŒcks-Nenner '".$znenner."' ist nicht numerisch</p>";
+			return 9;
+		}
+	}
+}
+
+function flurstueckskoordinaten($gml) {
+	// Die Koordinaten zu einem FlurstÃŒck aus der Datenbank liefern
+	// Parameter: gml_id des FlurstÃŒcke
+	// Return: Array(x,y)
+	global $epsg;
+	$sqlk ="SELECT ";
+	if($epsg == "25832") { // Transform nicht notwendig
+		$sqlk.="st_x(st_Centroid(wkb_geometry)) AS x, ";
+		$sqlk.="st_y(st_Centroid(wkb_geometry)) AS y ";
+	} else {  
+		$sqlk.="st_x(st_transform(st_Centroid(wkb_geometry), ".$epsg.")) AS x, ";
+		$sqlk.="st_y(st_transform(st_Centroid(wkb_geometry), ".$epsg.")) AS y ";			
+	}
+	$sqlk.="FROM ax_flurstueck WHERE gml_id= $1 AND endet IS NULL;";
+	$v=array($gml);
+	$resk=pg_prepare("", $sqlk);
+	$resk=pg_execute("", $v);
+	if (!$resk) {echo "\n<p class='err'>Fehler bei Koordinate.</p>";}
+	$rowk = pg_fetch_array($resk);
+	$koor=array("x" => $rowk["x"], "y" => $rowk["y"]);
+	return $koor;
+}
+
+function zeile_flur($gkgnr, $flurnr, $histlnk, $aktuell) { 
+	// Eine Kopf-Zeile zur Flur ausgeben
+	global $gkz, $gemeinde, $epsg;
+
+	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
+	echo "\n<div class='fl".$cls."' title='Flur'>";
+	echo "\n\t\t<img class='nwlink' src='ico/Flur.png' width='16' height='16' alt='FL' title='Flur'> ";
+	$url=$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$gkgnr."-".$flurnr;
+	echo "<a title='Aktuelle Flurst&uuml;cke suchen' href='".$url."'>Flur ".$flurnr." </a>"; 
+
+	if ($histlnk) { // Link zur Historie-Suche anbieten
+		echo " <a class='hislnk' title='Historische Flurst&uuml;cke der Flur suchen' href='".$url."&amp;hist=j'>Hist.</a>";
+	}
+	echo "\n</div>";	
+	return;
+}
+
+function zeile_hist_fs($fs_gml, $fskenn, $ftyp, $gknr, $flur, $aktuell) {
+	// Eine Zeile fÃŒr ein historisches FlurstÃŒck ausgeben 
+	global $gkz, $gemeinde, $epsg, $auskpath;
+	if ($ftyp == "h") {
+		$ico="Flurstueck_Historisch_Lnk.png";
+		$titl="Historisches Flurst&uuml;ck";
+	} else {
+		$ico="Flurstueck_Historisch_oR_Lnk.png";
+		$titl="Historisches Flurst&uuml;ck ohne Raumbezug";
+	}
+	if ($aktuell) {$cls=" aktuell";} else {$cls="";}
+	echo "\n<div class='hi".$cls."' title='".$titl."'>";
+
+	// Icon -> Buchnachweis
+	echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisfshist.php?gkz=".$gkz."&amp;gmlid=".$fs_gml."\")'>";
+		echo "\n\t\t<img class='nwlink' src='ico/".$ico."' width='16' height='16' alt='Hist' title='".$titl."'>";
+	echo "\n\t</a>";
+
+	// Zeile -> tiefer in die Historie
+	$flurl =$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;hist=j";
+	$flurl.="&amp;fskennz=".$gknr."-".$flur."-";
+	echo "\n\thist. Flst. <a href='".$flurl.$fskenn."'>".$fskenn."</a>";		
+
+	echo "\n</div>";
+	return;
+}
+
+function zeile_nachf_fs($gml, $gknr, $flur, $fskenn, $ftyp) {
+	// Eine Zeile fÃŒr ein Nachfolger-FlurstÃŒck eines hist. Fs. ausgeben
+	global $gkz, $gemeinde, $epsg, $auskpath;
+
+	$fs=$gknr."-".$flur."-".$fskenn;
+	switch ($ftyp) {
+	case "a": // eine FS-Zeile mit Link ausgeben (EinrÃŒckung css passt nicht)
+		$koor=flurstueckskoordinaten($gml);
+		zeile_flurstueck($gml, $fskenn, $koor["x"], $koor["y"], "", "", false);
+		return;
+		break;
+	case "h":
+		$ico="Flurstueck_Historisch_Lnk.png";
+		$titl="Historisches Flurst&uuml;ck";
+		$hisparm="&amp;hist=j";
+		$auskprog="alkisfshist";
+		break;
+	case "o":
+		$ico="Flurstueck_Historisch_oR_Lnk.png";
+		$titl="Historisches Flurst&uuml;ck ohne Raumbezug";
+		$hisparm="&amp;hist=j";
+		$auskprog="alkisfshist";
+		break;
+	}
+	// fÃŒr die Hist.-FÃ€lle:
+	echo "\n<div class='hn' title='Nachfolger: ".$titl."'>";			
+		echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath.$auskprog.".php?gkz=".$gkz."&amp;gmlid=".$gml."\")'>";
+			echo "\n\t\t<img class='nwlink' src='ico/".$ico."' width='16' height='16' alt='FS' title='Nachweis'>";
+		echo "\n\t</a> ";		
+		echo "Flst. <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$fs.$hisparm."'>".$fskenn."</a>";					
+	echo "\n</div>";
+	return;
+}
+
+function ListGemeinden() {
+	// Bei Leereingabe im Formular die berechtigte(n) Gemeinde(n) auflisten
+	global $con, $gkz, $gemeinde, $epsg, $debug, $gfilter;
+	$linelimit=60;
+
+	$sql ="SELECT trim(trailing from gemshl) as gemshl, gemname FROM gem_shl ";
+	switch ($gfilter) {
+		case 1: // Einzelwert
+			$sql.="WHERE substring(gemshl from 6 for 3) = '".$gemeinde."' "; break;
+		case 2: // Liste
+			$sql.="WHERE substring(gemshl from 6 for 3) in ('".str_replace(",", "','", $gemeinde)."') "; break;
+		default: break;
+	}
+	$sql.=" AND endet IS NULL ORDER BY gemname LIMIT $1 ;";
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", array($linelimit));
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Gemeinde</p>";
+		if ($debug >= 3) {echo "\n<p class='dbg'>".$sql."</p>";} // ++Nur Entw.
+		return 0;
+	}
+	$cnt = 0;
+	while($row = pg_fetch_array($res)) {
+		$gnr=$row["gemshl"];
+		$gemeindename=$row["gemname"];
+		zeile_gemeinde($gnr, $gemeindename);
+		$cnt++;
+	}
+	// Foot
+	if($cnt == 0) { 
+		echo "\n<p class='anz'>Keine Gemeinde.</p>";
+	} elseif($cnt >= $linelimit) {
+		echo "\n<p class='anz' title='Bitte eindeutiger qualifizieren'>".$cnt." Gemeinden ... und weitere</p>";
+	} elseif($cnt == 1) { // Eindeutig!
+		return $gnr; 
+	} else {
+		echo "\n<p class='anz'>".$cnt." Gemeinden</p>";
+	}
+	return;
+}
+
+function ListGmkgInGemeinde($gkey, $bez) {
+	// Die Gemarkungen zu einem Gemeinde-Key (aus Link) listen
+	global $con, $gkz, $gemeinde, $epsg, $debug, $gfilter;
+	$linelimit=70;
+
+	// Head
+	zeile_gemeinde($gkey, $bez, true);
+
+	// Body
+	$sql ="SELECT gemashl, trim(trailing from gemarkung) AS gemarkung FROM gema_shl WHERE substring(gemshl from 1 for 8) = $1 ORDER BY gemarkung LIMIT $2 ;";
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", array($gkey, $linelimit));
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Gemarkungen</p>";
+		return 1;
+	}
+	$cnt = 0;
+	while($row = pg_fetch_array($res)) {
+		$gnr=$row["gemashl"]; // 6stellig
+		$gnam=$row["gemarkung"];
+		zeile_gemarkung($gnr, $gnam, false);
+		$cnt++;
+	}
+	// Foot
+	if($cnt == 0){ 
+		echo "\n<p class='anz'>Keine Gemarkung.</p>";
+	} elseif($cnt >= $linelimit) {
+		echo "\n<p class='anz' title='Bitte eindeutiger qualifizieren'>".$cnt." Gemarkungen ... und weitere</p>";
+	} elseif($cnt == 1) { // Eindeutig!
+		return $gnr; 
+	} else {
+		echo "\n<p class='anz'>".$cnt." Gemarkungen</p>";
+	}
+	return;
+}
+
+function SuchGmkgName() {
+	// Gemarkung suchen nach Name(-nsanfang)
+	global $con, $gkz, $gemeinde, $epsg, $debug, $fskennz, $gfilter;
+	$linelimit=120;
+	if(preg_match("/\*/",$fskennz)){
+		$match = trim(preg_replace("/\*/i","%", strtoupper($fskennz)));
+	} else {
+		$match = trim($fskennz)."%";
+	}
+
+	// Pass auf! GemeindeschlÃŒssel ist in den beiden SchlÃŒsseltabellen linksbÃŒndig gefÃŒllt,
+	// aber unterschiedlich lang hinten mit Leerstellen aufgefÃŒllt.
+	$sql ="SELECT substring(g.gemshl from 1 for 8) AS gemshl, g.gemashl, trim(trailing from g.gemarkung) AS gemarkung, trim(trailing from s.gemname) AS gemname 
+	FROM gema_shl g JOIN gem_shl s ON substring(g.gemshl from 1 for 8) = substring(s.gemshl from 1 for 8) WHERE g.gemarkung ILIKE $1 ";
+
+	switch ($gfilter) {
+		case 1: // Einzelwert
+			$sql.="AND substring(g.gemshl from 6 for 3)='".$gemeinde."'"; break;
+		case 2: // Liste
+			$sql.="AND substring(g.gemshl from 6 for 3) in ("."'".str_replace(",", "','", $gemeinde)."'".") "; break;
+	}
+	$sql.=" ORDER BY s.gemname, g.gemarkung LIMIT $2 ;";
+
+	$v=array($match, $linelimit);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei Gemarkung</p>";
+		return;
+	}
+	$cnt = 0;
+	$gwgem="";
+	while($row = pg_fetch_array($res)) {
+		$gemeindename=$row["gemname"];
+		if ($gwgem != $gemeindename) { // Gruppierung Gemeinde
+			$gwgem = $gemeindename;
+			$skey=$row["gemshl"];
+			zeile_gemeinde($skey, $gemeindename, false);
+		}
+		$gnam=$row["gemarkung"];
+		$gnr=$row["gemashl"]; // 6stellig
+		zeile_gemarkung($gnr, $gnam, false); // wenn am Ende nur ein Treffer, dann aktuell=true
+		$cnt++;
+	}
+	// Foot
+	if($cnt == 0){ 
+		echo "\n<p class='anz'>Keine Gemarkung.</p>";
+		if ($debug > 1) {
+			// Nach Umstellung auf NorGIS-Struktur muss im Mapbender die Gemeinde 3stellig konfiguriert werden
+			if (strlen($gemeinde) < 3) {
+				echo "<p class='err'>URL-Parameter &gemeinde=nnn im Mapbender gazetteer_alkis.SRC muss 3stellig sein!<br>Ist aber '".$gemeinde."'.</p>";
+			}
+			if ($debug > 2) {echo "<p class='dbg'>SQL=<br>".$sql."<br>$1 = ".$match."</p>";}
+		}
+	} elseif($cnt >= $linelimit) {
+		echo "\n<p class='anz' title='Bitte eindeutiger qualifizieren'>".$cnt." Gemarkungen ... und weitere</p>";
+	} elseif($cnt == 1) { // Eindeutig!
+		return $gnr; // 6stellige Gemarkungsnummer!
+	} else {
+		echo "\n<p class='anz'>".$cnt." Gemarkungen</p>";
+	}
+	return;
+}
+
+function gg_head($gkgnr6, $gkgaktuell) {
+	// Gemeinde und Gemarkung (G+G) Kopf-Zeilen ausgeben
+	// Parameter: Gemarkungsnummer (6stellig), aktuell hervorzuhebende Zeile
+	// Return: true/false ob gefunden 
+
+	$sqlh ="SELECT g.gemarkung, substring(s.gemshl from 1 for 8) AS gemshl, trim(trailing from s.gemname) AS gemname 
+	FROM gema_shl g JOIN gem_shl s ON g.gemshl=s.gemshl WHERE g.gemashl = $1 ;";
+
+	$v=array($gkgnr6);
+	$resh=pg_prepare("", $sqlh);
+	$resh=pg_execute("", $v);
+
+	if (!$resh) {echo "\n<p class='err'>Fehler bei Gemeinde und Gemarkung.</p>";}
+
+	if ($rowh = pg_fetch_array($resh)) {
+		$gmkg=$rowh["gemarkung"];
+		$skey=$rowh["gemshl"];
+		$snam=$rowh["gemname"];
+		zeile_gemeinde($skey, $snam, false);
+		zeile_gemarkung($gkgnr6, $gmkg, $gkgaktuell);
+		return true;
+    } else {
+		echo "\n<div class='gk' title='Gemarkung'>";
+		echo "\n\t\t<img class='nwlink' src='ico/Gemarkung.png' width='16' height='16' alt='GKG' title='Gemarkung'>";
+		echo " Gemarkung ".$gkgnr6." nicht gefunden!\n</div>";
+		return false;
+	}
+}
+
+function EineGemarkung($AuchGemkZeile) {
+	// Kennzeichen bestehend nur aus Gemarkung-SchlÃŒssel wurde eingegeben
+	global $con, $gkz, $gemeinde, $epsg, $debug, $zgemkg4, $zgemkg6;
+	$linelimit=120; // max.Fluren/Gemkg
+
+	// Head
+	if ($AuchGemkZeile) { // Kopf davor ausgeben
+		if (! gg_head($zgemkg6, true)) {
+			if ($debug >= 1) {echo "\n<p class='dbg'>Gem.-Gemkg.-Kopf abgebrochen</p>";}	
+			return false;
+		} 
+	}
+
+	// Body
+	$sql ="SELECT gemarkungsteilflur AS flur FROM ax_gemarkungsteilflur f WHERE gemarkung= $1 ORDER BY gemarkungsteilflur LIMIT $2 ;";
+	$v=array($zgemkg4, $linelimit);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+
+	if (!$res) {echo "\n<p class='err'>Fehler bei Flur.</p>";}
+	$zfl=0;
+	while($row = pg_fetch_array($res)) {	
+		$zflur=$row["flur"];
+		zeile_flur($zgemkg4, $zflur, false, false);
+		$zfl++;
+	}
+
+	// Foot
+	if($zfl == 0) { 
+		echo "\n<p class='anz'>Keine Flur.</p>";
+	} elseif($zfl >= $linelimit) {
+		echo "\n<p class='anz'>".$zfl." Fluren ... und weitere</p>";
+	} elseif($zfl > 1) {
+		echo "\n<p class='anz'>".$zfl." Fluren</p>";
+	}
+	return true;
+}
+
+function EineFlur() {
+	// Kennzeichen aus Gemarkung und FlurNr wurde eingegeben, dazu aktuelle FlurstÃŒcke suchen
+	global $con, $gkz, $gemeinde, $epsg, $debug, $zgemkg4, $zgemkg6, $zflur;
+	$linelimit=900; // Wie groÃ kann eine Flur sein?
+
+	// Head
+	if (gg_head($zgemkg6, false)) {
+		zeile_flur($zgemkg4, $zflur, true, true);
+	} else {
+		return false;
+	}
+
+	// Body
+	$sql ="SELECT f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.gemeinde, ";
+	if($epsg == "25832") { // Transform nicht notwendig
+		$sql.="st_x(st_Centroid(f.wkb_geometry)) AS x, ";
+		$sql.="st_y(st_Centroid(f.wkb_geometry)) AS y ";
+	} else {  
+		$sql.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
+		$sql.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";			
+	}
+
+	$sql.="FROM ax_flurstueck f WHERE f.gemarkungsnummer= $1 AND f.flurnummer= $2 AND endet IS NULL 
+	ORDER BY f.zaehler, f.nenner LIMIT $3 ;";
+	$v=array($zgemkg4, $zflur, $linelimit);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {echo "\n<p class='err'>Fehler bei Flur.</p>";}
+	$zfs=0;
+	while($row = pg_fetch_array($res)) {	
+		$fs_gml=$row["gml_id"];
+		$flur=$row["flurnummer"];
+		$fskenn=$row["zaehler"];
+		if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];}
+		zeile_flurstueck($fs_gml, $fskenn, $row["x"], $row["y"], "", "", false);
+		$zfs++;
+	}
+
+	// Flur-Foot
+	if($zfs == 0) {
+		echo "\n<p class='anz'>Kein Flurst&uuml;ck.</p>";
+	} elseif($zfs >= $linelimit) {
+		echo "\n<p class='anz'>".$zfs." Flurst&uuml;cke... und weitere</p>";
+	} elseif($zfs > 1) {
+		echo "\n<p class='anz'>".$zfs." Flurst&uuml;cke</p>";
+	}
+	return true;
+}
+
+function HistFlur() {
+	// Kennzeichen aus Gemarkung und FlurNr wurde eingegeben, "h" dahinter.
+	// Die Flur nach historischen FlurstÃŒcken durchsuchen
+	global $con, $gkz, $gemeinde, $epsg, $debug, $scalefs, $auskpath, $land, $zgemkg4, $zgemkg6, $zflur;
+	$linelimit=500;
+
+	// Head	
+	if (gg_head($zgemkg6, false)) {
+		zeile_flur($zgemkg4, $zflur, true, true);
+	} else {
+		return false;
+	}
+
+	// Body
+	$whcl="WHERE flurstueckskennzeichen like $1 AND endet IS NULL ";
+
+	$sql ="SELECT 'h' AS ftyp, gml_id, cast(zaehler AS integer) AS zaehler, cast(nenner AS integer) AS nenner, nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueck ".$whcl;
+	$sql.="UNION SELECT 'o' AS ftyp, gml_id, cast(zaehler AS integer) AS zaehler, cast(nenner AS integer) AS nenner, nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueckohneraumbezug ".$whcl;
+	$sql.="ORDER BY zaehler, nenner LIMIT $2 ;"; 
+	// "zaehler" und "nenner" sind in der Classic-Datenbank Integer-Werte aber in der Struktur 
+	// des norGIS-ALKIS-Importers sind das Character-Strings, die linksbÃŒndig ohne fÃŒhrende Nullen gefÃŒllt sind.
+	// Der Anwender erwartet aber eine "numerische" Sortierung.
+
+	$fskzwhere=$zgemkg6.str_pad($zflur, 3, "0", STR_PAD_LEFT)."%";
+	$v=array($fskzwhere, $linelimit);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {echo "\n<p class='err'>Fehler bei Historie Flur.</p>";}
+	$zfs=0;
+	while($row = pg_fetch_array($res)) {	
+		$ftyp=$row["ftyp"];
+		$fs_gml=$row["gml_id"];	// fuer Buchausk.
+		$fskenn=$row["zaehler"];
+		if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];} // Bruchnummer
+		zeile_hist_fs($fs_gml, $fskenn, $ftyp, $zgemkg4, $zflur, false);
+		$zfs++;
+	}
+
+	// Foot
+	if($zfs == 0) { 
+		echo "\n<p class='anz'>Kein historisches Flurst&uuml;ck.</p>";
+		#if ($debug > 2) {echo "<p class='dbg'>SQL=<br>".$sql."<br>$1 = ".$fskzwhere."</p>";}
+	} elseif ($zfs >= $linelimit) {
+		echo "\n<p class='anz'>".$zfs." historische Flurst. ... und weitere</p>";
+	} elseif($zfs > 1) {
+		echo "\n<p class='anz'>".$zfs." historische Flurst&uuml;cke</p>";
+	}
+	return true;
+}
+
+function EinFlurstueck() {
+	// FlurstÃŒckskennzeichen wurde komplett bis zum Zaehler (oder Nenner) eingegeben
+	// Sonderfall: bei Bruchnummer, mehrere Nenner zum Zaehler suchen wenn kein Nenner eingegeben wurde.
+	global $con, $gkz, $debug, $epsg, $gemeinde, $fskennz, $zgemkg4, $zgemkg6, $zflur, $zzaehler, $znenner;
+
+	// Head
+	if (gg_head($zgemkg6, false)) { // Kopfzeilen: Gemeinde, Gemerkung, ..
+		zeile_flur($zgemkg4, $zflur, true, false); // .., Flur
+	} else {
+		return false;
+	}
+
+	// Body
+	$sql ="SELECT f.gml_id, f.flurnummer, f.zaehler, f.nenner, ";
+	if($epsg == "25832") { // Transform nicht notwendig
+		$sql.="st_x(st_Centroid(f.wkb_geometry)) AS x, ";
+		$sql.="st_y(st_Centroid(f.wkb_geometry)) AS y ";
+	} else {  
+		$sql.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
+		$sql.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";			
+	}
+	$sql.="FROM ax_flurstueck f WHERE f.gemarkungsnummer= $1 AND f.flurnummer= $2 AND f.zaehler= $3 ";
+	If ($znenner != "") {$sql.="AND f.nenner=".$znenner." ";} // wie prepared?
+	$sql.="AND endet IS NULL ORDER BY f.zaehler, f.nenner;";
+	$v=array($zgemkg4, $zflur, $zzaehler);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {echo "\n<p class='err'>Fehler bei Flurst&uuml;ck.</p>";}
+	$zfs=0;
+	while($row = pg_fetch_array($res)) {	
+		$fs_gml=$row["gml_id"];
+		$flur=$row["flurnummer"];
+		$fskenn=$row["zaehler"];
+		if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];}
+		zeile_flurstueck($fs_gml, $fskenn, $row["x"], $row["y"], "", "", true);
+		$zfs++;
+	}
+	// Foot
+	if($zfs == 0) {
+		echo "\n<p class='anz'>Kein aktuelles Flurst&uuml;ck.</p>";
+		echo "\n<div class='hi' title='in Historie suchen'>";
+			echo "\n\t\t<img class='nwlink' src='ico/Flurstueck_Historisch.png' width='16' height='16' alt='Historisches Flurst&uuml;ck'>&nbsp;";
+			echo "<a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$fskennz."&amp;hist=j'>";
+			echo $zgemkg4."-".$zflur."-".$zzaehler;
+			if ($znenner != "") {echo "/".$znenner;}
+			echo " h - suchen</a>";
+		echo "\n</div>";		
+	}
+	return true;
+}
+
+function HistFlurstueck() {
+	// Die Nachfolger-FS-Kennzeichen zu einem Historischen FS sollen recherchiert werden.
+	global $debug, $land, $zgemkg4, $zgemkg6, $zflur, $zzaehler, $znenner;
+
+	// Head
+	if (gg_head($zgemkg6, false)) {
+		zeile_flur($zgemkg4, $zflur, true, false);
+	} else {
+		return false;
+	}
+	echo "\n<hr>";
+
+	// Body
+	// Suche ueber das Flurstueckskennzeichen, gml unbekannt
+	$fskzwhere=$zgemkg6; // Flurst-Kennz. f. Where
+	$fskzwhere.=str_pad($zflur, 3, "0", STR_PAD_LEFT);
+	$fskzwhere.=str_pad($zzaehler, 5, "0", STR_PAD_LEFT);
+	if ($znenner == "") {	// Wenn kein Nenner angegeben wurde, 
+		//wird mit Wildcard und like nach allen Nennern gesucht.
+		$fskzwhere.="____\_\_";	// fÃŒr like
+		$whereop=" like ";
+		// Das Wildcard-Zeichen "_" ist mit Zeichen im Feldinhalt identisch
+		// "___" = hier kann auch ein Nenner stehen, "\_\_" hier mÃŒssen tatsÃ€chlich __ stehen.
+		// WARNUNG:  nicht standardkonforme Verwendung von Escape in Zeichenkettenkonstante
+		// z.B.: like '05265600400145____\_\_'
+	} else { // Ein Nenner wurde angegeben
+		$fskzwhere.=str_pad($znenner, 4, "0", STR_PAD_LEFT)."__";
+		$whereop=" = ";
+	}
+	$whcl="WHERE flurstueckskennzeichen ".$whereop." $1 AND endet IS NULL ";
+	$fldlist=" AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner, ";
+
+	// NICHT in aktuell suchen wenn explizit historisch gesucht wird
+	$sql ="SELECT 'h'".$fldlist."nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueck ".$whcl;
+	$sql.="UNION SELECT 'o'".$fldlist."nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueckohneraumbezug ".$whcl;
+
+	$v=array($fskzwhere);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {
+		echo "\n<p class='err'>Fehler bei historischem Flurst&uuml;ck.</p>";
+		if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."'<br>Parameter: ".$fskzwhere."<p>";}
+		return true;
+	}
+
+	$zfs=0;
+	while($row = pg_fetch_array($res)) { // Schleife Hist-FS
+		$ftyp=$row["ftyp"];
+		$fs_gml=$row["gml_id"];
+		$gknr=$land.$row["gemarkungsnummer"]; // Land davor
+		$flur=$row["flurnummer"];
+		$fskenn=$row["zaehler"];
+		$nachf=$row["nachf"];
+		if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];}
+
+		zeile_hist_fs($fs_gml, $fskenn, $ftyp, $gknr, $flur, true);
+
+		if ($nachf == "") {
+			echo "\n<p class='anz'>keine Nachfolger</p>";	
+		} else {
+			echo "\n<p class='hn'>Nachfolger-Flurst&uuml;cke:</p>";
+			// Direkte Nachfolger ermitteln. In $nachf steht ein Array von FS-Kennzeichen.
+			// Von den einzelnen Kennz. ist unbekannt, ob diese noch aktuell sind 
+			// oder auch schon wieder historisch.
+			// Nachfolger in DB suchen um den Status aktuell/historisch zu ermitteln
+			$stri=trim($nachf, "{}");
+			$stri="'".str_replace(",", "','", $stri)."'";
+
+			$nawhcl="WHERE flurstueckskennzeichen IN ( ".$stri." ) AND endet IS NULL ";
+
+			// Pass auf! Spalte zaehler hat unterschiedliches Format in den 3 Tabellen
+			$nasql ="SELECT 'a' AS ftyp, gml_id, gemarkungsnummer, flurnummer, cast(zaehler AS character varying), nenner FROM ax_flurstueck ".$nawhcl;
+			$nasql.="UNION SELECT 'h' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_historischesflurstueck ".$nawhcl;
+			$nasql.="UNION SELECT 'o' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_historischesflurstueckohneraumbezug ".$nawhcl;
+
+			$v=array();
+			$nares=pg_prepare("", $nasql);
+			$nares=pg_execute("", $v);
+			if (!$nares) {
+				echo "\n<p class='err'>Fehler bei Nachfolger.</p>";
+				if ($debug > 2) {echo "<p class='dbg'>SQL = '".$nasql."'<p>";}
+				return;
+			}
+
+			$zfsn=0;
+			// inner Body
+			while($narow = pg_fetch_array($nares)) {
+				$naftyp=$narow["ftyp"];
+				$nagml=$narow["gml_id"];
+				$nagknr=$land.$narow["gemarkungsnummer"]; // Land davor, 4 auf 6 Stellen
+				$naflur=$narow["flurnummer"];
+				$nafskenn=$narow["zaehler"];
+				if ($narow["nenner"] != "") {$nafskenn.="/".$narow["nenner"];}
+				zeile_nachf_fs ($nagml, $nagknr, $naflur, $nafskenn, $naftyp);
+				$zfsn++;
+			}
+			// inner Footer
+			if ($zfsn == 0) {
+				echo "\n<p class='anz'>keine Nachfolger</p>";
+			} elseif ($zfsn > 1) {
+				echo "\n<p class='anz'>".$zfsn." Nachfolger-Flst.</p>";
+			}
+			echo "\n<hr>";
+		}
+		$zfs++;
+	}
+	// Foot
+	if($zfs == 0) {
+		echo "\n<p class='anz'>Kein historisches Flurst&uuml;ck.</p>";
+		#if ($debug > 2) {echo  "\n<p class='dbg'> SQL= ".$sql."\n<br> $1 = FS-Kennz = '".$fskzwhere."'</p>";}
+	}
+	return;
+}
+
+// ===========
+// Start hier!
+// ===========
+if(isset($epsg)) {
+	$epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);	
+} else {
+	#if ($debug >= 1) {echo "\n<p class='dbg'>kein EPSG gesetzt</p>";}	
+	$epsg=$gui_epsg; // Conf
+}
+
+// Filter aus Mapbender-GUI-Einbindung
+if ($gemeinde == "") {
+	$gfilter = 0;
+} elseif(strpos($gemeinde, ",") === false) {
+	$gfilter = 1; // Einzelwert
+} else {
+	$gfilter = 2; // Liste
+}
+if ($hist == "j") {$phist = true;} else {$phist = false;}
+
+if($gm != "") { // Self-Link aus Gemeinde-Liste
+	$trans="Gemarkungen zur Gemeinde";
+	$gnr=ListGmkgInGemeinde($gm, $bez);
+	if ($gnr > 0) {
+		$zgemkg4=$gnr;
+		$zgemkg6=$land.$zgemkg4;
+		EineGemarkung(false);
+	}
+} else { // Die Formular-Eingabe interpretieren (kann auch ein Link sein)
+	$retzer=ZerlegungFsKennz($fskennz);
+	if ($debug >= 1) {echo "\n<p class='dbg'>Return Zerlegung: ".$retzer."</p>";}	
+	switch ($retzer) { // Returnwert der Zerlegung des FS-Kennz.
+	case 0: // leere Eingabe
+		if ($gfilter == 1) { // Die GUI ist bereits auf EINE Gemeinde gefiltert
+			$trans="Liste der Gemarkungen";
+			SuchGmkgName();
+		} else {
+			$trans="Liste der Gemeinden";
+			ListGemeinden();
+		}
+		break;
+	case 1:
+		$trans="Suche Gemarkungsname";
+		$gnr=SuchGmkgName();
+		if ($gnr > 0) {
+			$trans="1 Gemarkung, Fluren dazu";
+			$zgemkg6=$gnr;
+			$zgemkg4=substr($zgemkg6, 2);
+			EineGemarkung(false);
+		}
+		break;
+	case 2:
+		$trans="Fluren in Gemarkung";
+		EineGemarkung(true);
+		break;
+	case 3:
+		if ($phist)	{
+			$trans="historische Flurst. in Flur";
+			HistFlur();
+		} else {
+			$trans="Flurst&uuml;cke in Flur";
+			EineFlur();
+		}
+		break;
+	case 4:
+		if ($phist)	{
+			$trans="historisches Flurst&uuml;ck";
+			HistFlurstueck();
+		} else {
+			$trans="Flurst&uuml;ck";
+			EinFlurstueck();
+		}
+		break;
+	case 5:
+		if ($phist) {
+			$trans="historisches Flurst&uuml;ck";
+			HistFlurstueck();
+		} else {
+			$trans="Flurst&uuml;ck";
+			EinFlurstueck();
+		}	
+		break;
+	case 9:
+		$trans="falsche Eingabe";
+		echo "\n<p class='err'>Bitte ein Flurst&uuml;ckskennzeichen eingegeben, Format 'gggg-fff-zzzz/nnn</p>";
+		break;
+	}
+}
+
+// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion 
+// im Kopf des Ergebnisrahmens anzeigen.
+// Dazu die im HTML-Header definierte Javascript-Function benutzen.
+// Alternativ wird auch aus dem Javascript "positionieren Karte" dieser Titel gesetzt.
+echo "
+<script type='text/javascript'>
+	transtitle('".$trans."'); 
+</script>";
+
+?>
+
+</body>
+</html>
