Index: trunk/info/info/alkisn/alkisfkt.php
===================================================================
--- trunk/info/info/alkisn/alkisfkt.php	(revision 398)
+++ trunk/info/info/alkisn/alkisfkt.php	(revision 402)
@@ -14,4 +14,8 @@
 	2017-11-03 neue function werteliste()
 	2017-12-20 Default Anzeigewert "EigentÃŒmer" im Link fÃŒr leere EigentÃŒmerart, JÃŒngste Adresse zur Person verwenden.
+	2018-04-23 Berechtigte Buchungen im FS-Nachw. verbessern. Neue Spalte statt Ãberschriften fÃŒr "EigentÃŒmer" und "Berechtigte Buchungen".
+
+++ ToDo:
+ ++ Parameter $lnkclass in eigentuemer() und $jfenster in buchung_anzg() vereinheitlichen
 */
 
@@ -21,5 +25,5 @@
 	// Den URL-Parameter "&showkey=j/n" umschalten lassen.
 	// $append wird angehaengt wenn gefuellt. Anwendung: &eig=j bei FS-NW, &ltyp=m/p/o bei Lage
-	global $gkz, $showkey, $hilfeurl, $auth;
+	global $gkz, $showkey, $hilfeurl, $auth, $debug;
 
 	// S c r e e n - Foot
@@ -38,9 +42,12 @@
 	echo "\n\t\t<td title='Konfiguration'>";
 		$mylink ="\n\t\t\t<a class='keyswitch' href='".$link."gkz=".$gkz."&amp;gmlid=".$gmlid.$append;
-
 		if ($showkey) { // Umschalten SchlÃŒssel ein/aus
 			echo $mylink."&amp;showkey=n' title='Verschl&uuml;sselungen ausblenden'>Schl&uuml;ssel aus</a>";
 		} else {
 			echo $mylink."&amp;showkey=j' title='Verschl&uuml;sselungen anzeigen'>Schl&uuml;ssel ein</a>";
+		}
+		// TemporÃ€r eine Ansicht ohne Entwicklungsumgebung
+		if ($debug > 0) {
+			echo "&nbsp;|&nbsp;".$mylink."&amp;nodebug=j' title='Debug-Ausgaben tempor&auml;r abschalten'>Ansicht ohne Testausgaben</a>";
 		}
 	echo "\n\t\t</td>";
@@ -57,94 +64,185 @@
 		echo "\n<p class='onlyprint'><i>Mapbender-Benutzer:&nbsp;".$customer."</i></p>";
 	}
-
 	return 0;
 }
 
-function ber_bs_hinw($gmls, $gmlf) {
-	// Berechtigte Buchungs-Stellen - Hinweis.
-	// Unter dem Grundbuch-Link den Hinweis auf "berechtigte Buchungssstellen" anzeigen und einen Umschalter.
-	global $gkz, $debug, $showkey, $berbu, $eig;
+function ber_bs_zaehl($gmls) {
+	// Berechtigte Buchungs-Stellen zaehlen.
 
 	// Buchungstelle dienend <(Recht)an< Buchungstelle herrschend
-	$sql ="SELECT count(sh.gml_id) AS anz, sh.buchungsart, a.v "
-	."FROM ax_buchungsstelle sd JOIN ax_buchungsstelle sh ON sd.gml_id=ANY(sh.an) " 
-	."LEFT JOIN alkis_wertearten a ON sh.buchungsart=cast(a.k AS integer) " 
-	."WHERE sd.gml_id= $1 AND sh.endet IS NULL AND sd.endet IS NULL AND a.element='ax_buchungsstelle' and a.bezeichnung='buchungsart' "
-	."GROUP BY sh.buchungsart, a.v;";
-
+	$sql ="SELECT count(sh.gml_id) AS anz FROM ax_buchungsstelle sd JOIN ax_buchungsstelle sh ON sd.gml_id=ANY(sh.an) " 
+	."WHERE sd.gml_id= $1 AND sh.endet IS NULL AND sd.endet IS NULL;";
 	$v = array($gmls); // GML dienende Buchungs-Stelle
 	$resan = pg_prepare("", $sql);
 	$resan = pg_execute("", $v);
-	if (!$resan) {
-		echo "\n<p class='err'>Fehler bei 'berechtigte Buchungsstellen'.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmls."'</p>";}
-	}
-	$zeile=0; // Vesrchiedene Arten
-	$cnt=0; // Summe der Buchugen
-	while($rowan = pg_fetch_array($resan)) {
-		$anz=$rowan["anz"];
-
-		// Einleitung
-		if ($zeile == 0) { // vor. 1. Zeile
-			// Diese Hinweise sollen mit gedruckt werden. Also KEIN "noprint"!
-			echo "\n\t\t<br>\n\t\t<p class='nwlink' title='Andere Grundst&uuml;cke mit Rechten an diesem.'>\n\t\t\tBerechtigte Buchungen ";
-			if ($berbu=="j") { // wechselndes Symbol
-				echo "<img src='ico/Grundbuch_zu.png' width='16' height='16' alt=''>";
-			} else {
-				echo "<img src='ico/Grundbuch.png' width='16' height='16' alt=''>";
-			}
-			echo "\n\t\t\t<b>";
-		}
-
-		// Eine Zeile je Buchungs-Typ
-		echo "<br>".$anz." ".htmlentities($rowan["v"], ENT_QUOTES, "UTF-8");
-		if ($showkey) {echo " <span class='key'>(".$rowan["buchungsart"].")</span>";}
-		$zeile++;
-		$cnt = $cnt + $anz;
-	} // Ende Result
+	if (!$resan) {echo "\n<p class='err'>Fehler bei 'berechtigte Buchungsstellen zaehlen'.</p>";}
+	$rowan = pg_fetch_assoc($resan);
+	$anz=$rowan["anz"];
 	pg_free_result($resan);
-
-	// Ergebnis
-	if ($zeile == 0) { // kein Schleifen-Durchlauf
-		echo "\n\t<p class='nwlink' title='Kein anderes Grundst&uuml;ck hat ein Recht an diesem.'>Keine berechtigte Buchung</p>";
-	} else { // Schleife wurde durchlaufen,
-		echo "</b>\n\t\t</p>";
-
-		// Umschalter nicht drucken
-		echo "\n\t\t<p class='nwlink noprint'>"
-		."\n\t\t\t<a href='".$_SERVER['PHP_SELF']."?gkz=".$gkz."&amp;gmlid=".$gmlf."&eig=".$eig; // GML FlurstÃŒck
-		if ($showkey) {echo "&amp;showkey=j";}
-		// Der FS-Nachweis ruft sich selbst mit geaendertem Parameter auf.
-		if ($berbu=="j") {
-			echo "&amp;berbu=n' title='ohne berechtigte Buchungen'>nicht Anzeigen"; // Position: Top
-		} else {
-			echo "&amp;berbu=j#berbu' title='mit berechtigten Buchungen'>Anzeigen"; // Positionierung auf Marke #berbu
-		}
-		echo "</a>\n\t\t</p>";
-	}
-	return $cnt; // Funktionswert = Anzahl der berechtigten Buchungen
-}
-
-function ber_bs_anz($gmls, $eig) {
-	// Berechtigte Buchungsstellen (+ BlÃ€tter, EigentÃŒmer) anzeigen innerhalb eines FS-Nachw.
-	// Im FS-Nachweis werden auch die berechtigten GrundbÃŒcher mit ihren EigentÃŒmern angezeigt.
-	// Also z.B. zu einem "fiktiven Blatt" auch die GrundbuÃŒcher mit dem "Wohnungs-/Teileigentum"
-	global $gkz, $debug, $showkey, $idanzeige;
-
-	// Herrschende (berechtigte) Buchungsstellen ausgeben - Beginn
-	// sd=Buchungstelle herrschend >(Recht)an> sd=Buchungstelle dienend >istBestandteilVon> BLATT -> Bezirk
-	$sql="SELECT sd.gml_id AS s_gml, "  // Buchungs-Stelle dienend
-	."sh.buchungsart, sh.laufendenummer as lfd, sh.zaehler, sh.nenner, sh.nummerimaufteilungsplan as nrpl, sh.beschreibungdessondereigentums as sond, " // Buchungs-Stelle herrschend
-	."b.gml_id AS g_gml, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung as blatt, b.blattart, z.bezeichnung, a.v AS bart, w.v AS blattartv "
-	."FROM ax_buchungsstelle sd "
-	."JOIN ax_buchungsstelle sh ON sd.gml_id=ANY(sh.an) "
+	return $anz; // Funktionswert = Anzahl der berechtigten Buchungen
+}
+
+function buchung_anzg($gmlbs, $eig, $jsfenster, $gml_fs) {
+	// In einem FS-Nachw. EINE Buchungsstelle anzeigen.
+	// Parameter:
+	//  $gmlbs: GML-ID der anzuzeigenden Buchungs-Stelle
+	//  $eig: EigentÃŒmer ausgeben j/n
+	//  $jsfenster: Javascript-Funktion zum Verlassen des Feature-Info-Fensters verwenden (bool)
+	//  $gml_fs: GML-ID des FlurstÃŒcke (nur bei erstem Aufruf in einem FS-Nachweis notwendig)
+	global $gkz, $debug, $showkey, $bartgrp, $barttypgrp, $stufe;
+
+	$sqlbs="SELECT sh.gml_id AS hgml, sh.buchungsart, sh.laufendenummer as lfd, sh.zaehler, sh.nenner, sh.nummerimaufteilungsplan as nrpl, sh.beschreibungdessondereigentums as sond, " // Buchungs-Stelle herrschend
+	."b.gml_id AS g_gml, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung as blatt, b.blattart, z.bezeichnung, a.v AS bart, a.d AS barttitle, w.v AS blattartv "
+	."FROM ax_buchungsstelle sh "
 	."JOIN ax_buchungsblatt b ON b.gml_id=sh.istbestandteilvon "
 	."LEFT JOIN ax_buchungsblattbezirk z ON z.land=b.land AND z.bezirk=b.bezirk "
-	."LEFT JOIN alkis_wertearten a ON sh.buchungsart=cast(a.k AS integer) AND a.element='ax_buchungsstelle' and a.bezeichnung='buchungsart' " // entschlÃŒsseln Buchungsart
-	."LEFT JOIN alkis_wertearten w ON b.blattart=w.k AND w.element='ax_buchungsblatt' and w.bezeichnung='blattart' " // entschlÃŒsseln Blatt-Art
-	."WHERE sd.gml_id= $1 AND sd.endet IS NULL AND sh.endet IS NULL AND b.endet IS NULL AND z.endet IS NULL "
-	."ORDER BY b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung;";
-
-	$v = array($gmls); // id dienende Buchungsstelle
+	."LEFT JOIN alkis_wertearten a ON sh.buchungsart=cast(a.k AS integer) AND a.element='ax_buchungsstelle' and a.bezeichnung='buchungsart' " // entschl. Buchungsart
+	."LEFT JOIN alkis_wertearten w ON b.blattart=w.k AND w.element='ax_buchungsblatt' and w.bezeichnung='blattart' " // entschl. Blatt-Art
+	."WHERE sh.gml_id= $1 AND sh.endet IS NULL AND b.endet IS NULL AND z.endet IS NULL;";
+
+	$v = array($gmlbs); // ID dienende Buchungs-Stelle
+	$resbs = pg_prepare("", $sqlbs);
+	$resbs = pg_execute("", $v);
+	if (!$resbs) {
+		echo "\n<p class='err'>Fehler bei 'Buchungsstelle ausgeben'.</p>";
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sqlbs, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlbs."'</p>";}
+	}
+	$gezeigt=false; // Funktionswert
+	if ($rowbs = pg_fetch_assoc($resbs)) { // ein Treffer
+		$blattkeyber=$rowbs["blattart"]; // Schluessel von Blatt-Art des GB
+		if ($blattkeyber != '5000' or $debug > 1) { // "Fiktives Blatt" nur bei Entwicklung anzeigen
+			$gezeigt=true; // Funktionswert
+			$hgml=$rowbs["hgml"]; // GML-ID der (herrschenden) BuchungsStelle
+			$bartkey=$rowbs["buchungsart"]; // Buchungsart SchlÃŒssel
+			$beznam=$rowbs["bezeichnung"]; // Bezirk
+			$blattartber=$rowbs["blattartv"]; // Wert von Blatt-Art des GB
+			$nrpl=$rowbs["nrpl"]; // Nr im Auft.plan
+			$sond=$rowbs["sond"]; // Beschr. d.Sondereigentums
+			$gbgml=$rowbs["g_gml"]; // GML-ID des Grundbuch-Blattes
+			$blatt=ltrim($rowbs["blatt"], "0");
+			$lfd=ltrim($rowbs["lfd"], "0");
+			if ($bartkey != $bartgrp) { // Wechsel der Buchungsart
+				$bart=$rowbs["bart"]; // Buchungsart Text
+				$barttitle=$rowbs["barttitle"]; // Buchungsart ErklÃ€rung
+				switch (true) { // Die Buchungsart einem Typ (Gruppierung) zuweisen
+					case ($bartkey <= 1999): $barttyp = "E"; break; // Eigentum/GrundstÃŒck
+					case ($bartkey >= 2000): $barttyp = "R"; break; // GrundstÃŒcksgleiches Recht, z.B. 2101 "Erbbaurecht"
+					default: $barttyp = "E"; break;
+				}
+				if ($barttypgrp != $barttyp) { // Wenn der Typ wechselt, neue Ãberschrift in Tabelle
+					switch ($barttyp) { // Text der Ãberschrift
+						case "E":
+							if ($eig == 'j') {$h3txt = "Buchung und Eigentum";} 
+							else {$h3txt = "Buchung";}
+						break;
+						case "R": $h3txt = "Grundst&uuml;cksgleiche Rechte"; break;
+					}
+					if ($barttypgrp == "" and $gml_fs != "") { // die erste Ãberschrift mit ID und Umschalter
+						echo "\n\t<tr>\n\t\t<td colspan='3'>\n\t\t\t<h3 id='gb'>".$h3txt."</h3>\n\t\t</td>"; // 1-3
+						echo "\n\t\t<td>\n\t\t\t<p class='nwlink noprint'>" // 4
+							."\n\t\t\t\t<a href='".$_SERVER['PHP_SELF']. "?gkz=".$gkz."&amp;gmlid=".$gml_fs;
+							if ($showkey) {echo "&amp;showkey=j";}
+							if ($eig=="j") { // Umschalter: FS-Nachweis ruft sich selbst mit geaendertem Parameter auf. Positionierung auf Marke "#gb"
+								echo "&amp;eig=n#gb' title='Umschalter: Flurst&uuml;cksnachweis'>ohne Eigent&uuml;mer</a>";
+							} else {
+								echo "&amp;eig=j#gb' title='Umschalter: Flurst&uuml;cks- und Eigent&uuml;mernachweis'>mit Eigent&uuml;mer "
+								."<img src='ico/EigentuemerGBzeile.png' width='16' height='16' alt=''></a>";
+							}
+						echo "\n\t\t\t</p>\n\t\t</td>";
+					} else {
+						echo "\n\t<tr>\n\t\t<td colspan='3'>\n\t\t\t<h3>".$h3txt."</h3>\n\t\t</td>\n\t\t<td>&nbsp;</td>"; // 1-4
+					}
+					echo "\n\t</tr>";
+					$barttypgrp = $barttyp;
+				}
+
+				// +++ mehr Abstand oben zur Zeile in .css, oder farbig hinterlegen?
+				echo "\n\t<tr>" // Buchungsart als Zwischenzeile
+					."\n\t\t<td class='ll'><img src='ico/Grundbuch.png' width='16' height='16' alt=''> Buchungsart:</td>" // 1
+					."\n\t\t<td colspan='2' title='".$barttitle."'>"; // 2-3
+						if ($showkey) {echo "<span class='key'>(".$bartkey.")</span> ";}
+						echo "<span class='wichtig'>".$bart."</span>"
+					."</td>"
+					."\n\t\t<td></td>" // 4
+				."\n\t</tr>";
+				$bartgrp=$bartkey; // Gruppe merken
+			} // Ende Wechsel der Buchungsart
+
+			echo "\n\t<tr>" // Tabelle mit 4 Spalten fÃŒr Buchung und EigentÃŒmer
+				."\n\t\t<td class='ll'><img src='ico/Grundbuch_zu.png' width='16' height='16' alt=''> Buchung:"; // 1
+			if ($showkey and $debug > 2) {echo "<br><span class='key'>Stufe ".$stufe."<br>".$hgml."</span> ";}
+			echo "</td>\n\t\t<td colspan='2'>"; // 2-3
+
+					// innere Tabelle: Rahmen mit GB-Kennz.
+					if ($blattkeyber == 1000) {
+						echo "\n\t\t\t<table class='kennzgb' title='Bestandskennzeichen'>";
+					} else {
+						echo "\n\t\t\t<table class='kennzgbf' title='Bestandskennzeichen'>"; // dotted
+					}
+					echo "\n\t\t\t<tr>"
+						."\n\t\t\t\t<td class='head'>Bezirk</td>"
+						."\n\t\t\t\t<td class='head'>";
+						if ($showkey) {echo "<span class='key'>".$blattkeyber."</span> ";}
+						echo $blattartber."</td>"
+						."\n\t\t\t\t<td class='head'>Lfd-Nr</td>"
+					."\n\t\t\t</tr>";
+					echo "\n\t\t\t<tr>"
+						."\n\t\t\t\t<td title='Grundbuchbezirk'>";
+						if ($showkey) {echo "<span class='key'>".$rowbs["bezirk"]."</span><br>";}
+						echo $beznam."</td>"
+						."\n\t\t\t\t<td title='Grundbuch-Blatt'><span class='wichtig'>".$blatt."</span></td>"
+						."\n\t\t\t\t<td title='Bestandsverzeichnis-Nummer (BVNR, Grundst&uuml;ck)'>".$lfd."</td>"
+					."\n\t\t\t</tr>"
+					."\n\t\t\t</table>";
+
+					if ($rowbs["zaehler"] <> "") {
+						echo "\n\t\t\t<p class='ant'>".$rowbs["zaehler"]."/".$rowbs["nenner"]."&nbsp;Anteil am Flurst&uuml;ck</p>";
+					}
+					if ($nrpl != "") {
+						echo "\n\t\t\t<p class='nrap' title='Nummer im Aufteilungsplan'>Nummer <span class='wichtig'>".$nrpl."</span> im Aufteilungsplan.</p>";
+					}
+					if ($sond != "") {
+						echo "\n\t\t\t<p class='sond' title='Sondereigentum'>Verbunden mit dem Sondereigentum: ".$sond."</p>";
+					}
+				echo "\n\t\t</td>"; // 2-3
+
+				echo "\n\t\t<td>"; // 4
+					echo "\n\t\t\t<p class='nwlink noprint'>";
+						if ($showkey) {echo "<span class='key'>".$blattkeyber."</span> ";}
+						$url="alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$gbgml;
+						if ($showkey) {$url.="&amp;showkey=j";}
+						if ($jsfenster) {$url="javascript:imFenster(\"".$url."\")";} // Sonderfall "Inlay" aus Feature-Info
+						echo "\n\t\t\t\t<a href='".$url."' title='Grundbuchnachweis mit Eigent&uuml;merangabe'>".$blattartber
+							." <img src='ico/GBBlatt_link.png' width='16' height='16' alt=''>"
+						."</a>";
+					//	if ($showkey and $debug > 2) {echo "<br><span class='key'>GML-ID = ".$gbgml."</span> ";}
+					echo "\n\t\t\t</p>"
+				."\n\t\t</td>" // 4
+			."\n\t</tr>";
+			if ($eig == "j") {
+				if ($jsfenster) {$lnkclass = "imFenster";} else {$lnkclass = "";} 
+				$n = eigentuemer($gbgml, true, $lnkclass); // mit Adresse
+			}
+		}
+	}
+	pg_free_result($resbs);
+	return $gezeigt; // true wenn eine Buchung ausgegeben wurde
+}
+
+function ber_bs_anzg($gmls, $eig, $gml_fs) {
+	// In einem FS-Nachw. die berechtigten (herrschenden) Buchungsstellen anzeigen z.B. "Wohnungs-/Teileigentum".
+	// Parameter: 
+	//  $gmls: GML-ID der dienenden Buchungs-Stelle. Im ersten Durchlauf also, die BS auf der das FS gebucht ist.
+	//  $eig: EigentÃŒmer ausgeben j/n
+	global $debug, $stufe;
+
+	// sh=Buchungstelle herrschend >(Recht)an> sd=Buchungstelle dienend >istBestandteilVon> BLATT -> Bezirk
+	$sql="SELECT sh.gml_id AS hgml, sh.buchungsart, sh.laufendenummer as lfd, sh.zaehler, sh.nenner, sh.nummerimaufteilungsplan as nrpl, sh.beschreibungdessondereigentums as sond, "
+	."b.gml_id AS g_gml, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung as blatt, b.blattart "
+	."FROM ax_buchungsstelle sh JOIN ax_buchungsblatt b ON b.gml_id=sh.istbestandteilvon "
+	."WHERE $1 = ANY(sh.an) AND sh.endet IS NULL AND b.endet IS NULL "
+	."ORDER BY b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung, sh.laufendenummer;";
+
+	$v = array($gmls); // ID dienende BuchungsStelle
 	$resber = pg_prepare("", $sql);
 	$resber = pg_execute("", $v);
@@ -153,87 +251,26 @@
 		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmls."'</p>";}
 	}
-
 	$an=0;
-	while($rowan = pg_fetch_array($resber)) {
-		$beznam=$rowan["bezeichnung"];
-		$bart=$rowan["bart"]; // Buchungsart
-		$blattkeyber=$rowan["blattart"];  // Schluessel von Blatt-Art des berechtigten GB
-		$blattartber=$rowan["blattartv"]; // Wert von Blatt-Art des berechtigten GB
-		$nrpl=$rowan["nrpl"]; // Nummer im Aufteilungsplan
-		$sond=$rowan["sond"]; // Beschreibung des Sondereigentums
-
-		echo "\n<table class='outer'>" // \n<hr>
-		."\n<tr>" // 1 row only
-			."\n<td>"; // outer linke Spalte - Daten
-				// Rahmen mit Kennzeichen GB
-				if ($blattkeyber == 1000) {
-					echo "\n\t<table class='kennzgb' title='Bestandskennzeichen'>";
-				} else {
-					echo "\n\t<table class='kennzgbf' title='Bestandskennzeichen'>"; // dotted
-				}
-				echo "\n\t<tr>"
-					."\n\t\t<td class='head'>Bezirk</td>"
-					."\n\t\t<td class='head'>".$blattartber."</td>"
-					."\n\t\t<td class='head'>Lfd-Nr,</td>"
-					."\n\t\t<td class='head'>Buchungsart</td>"
-				."\n\t</tr>";
-				echo "\n\t<tr>"
-					."\n\t\t<td title='Grundbuchbezirk'>";
-					if ($showkey) {echo "<span class='key'>".$rowan["bezirk"]."</span><br>";}
-					echo $beznam."</td>"
-					."\n\t\t<td title='Grundbuch-Blatt'><span class='wichtig'>".$rowan["blatt"]."</span></td>"
-					."\n\t\t<td title='Bestandsverzeichnis-Nummer (BVNR, Grundst&uuml;ck)'>".$rowan["lfd"]."</td>"
-					."\n\t\t<td title='Buchungsart'>";
-						if ($showkey) {echo "<span class='key'>".$rowan["buchungsart"]."</span><br>";}
-						echo $rowan["bart"]
-					."</td>"
-				."\n\t</tr>"
-				."\n\t</table>";
-				if ($rowan["zaehler"] <> "") {
-					echo "\n\t<p class='ant'>".$rowan["zaehler"]."/".$rowan["nenner"]."&nbsp;Anteil am Flurst&uuml;ck</p>";
-				}
-			echo "\n</td>";
-
-			echo "\n<td>"; // outer rechte Spalte
-				if ($idanzeige) {
-					linkgml($gkz, $rowan["s_gml"], "Buchungsstelle", "ax_buchungsstelle");
-					echo "<br>";
-					linkgml($gkz, $rowan["g_gml"], "Buchungsblatt", "");
-				}
-				echo "\n\t<br>"
-				."\n\t<p class='nwlink noprint'>";
-					if ($showkey) {echo "<span class='key'>".$blattkeyber."</span> ";}
-					echo "\n\t\t<a href='alkisbestnw.php?gkz=".$gkz."&amp;gmlid=".$rowan["g_gml"];
-						if ($idanzeige) {echo "&amp;id=j";}
-						if ($showkey)   {echo "&amp;showkey=j";}
-						echo "' title='Grundbuchnachweis mit Eigent&uuml;merangabe'>".$blattartber
-						." <img src='ico/GBBlatt_link.png' width='16' height='16' alt=''>"
-					."</a>";
-				echo "\n\t</p>"
-			."\n\t</td>"
-		."\n</tr>"
-		."\n</table>";
-
-		if ($blattkeyber != 1000) {
-			echo "\n<p>Blattart: ".$blattartber." (".$blattkeyber.").<br>"; 
-		}
-
-		if ($nrpl != "") {
-			echo "\n<p class='nrap' title='Nummer im Aufteilungsplan'>Nummer <span class='wichtig'>".$nrpl."</span> im Aufteilungsplan.</p>";
-		}
-
-		if ($sond != "") {
-			echo "\n<p class='sond' title='Sondereigentum'>Verbunden mit dem Sondereigentum<br>".$sond."</p>";
-		}
-
-		if ($eig == "j") {
-			$n = eigentuemer($rowan["g_gml"], true, ""); // mit Adresse
-		}
-		$an++;	
+	$verfolg=array(); // Ein (zunÃ€chst leeres) Array fÃŒr weitere GML-IDs anlegen
+	while($rowan = pg_fetch_assoc($resber)) { // Loop durch Result von berechtigte BS
+		$hgml=$rowan["hgml"]; // GML-ID der berechtigten Buchungs-Stelle
+		$gezeigt = buchung_anzg($hgml, $eig, false, $gml_fs); // Die herrschende Buchung anzeigen wenn nicht fiktiv
+		$an++;
+
+		$weitere=ber_bs_zaehl($hgml); 
+		if ($weitere > 0) { // gibt es WEITERE berechtigte Buchungen dazu?
+		//	if ($debug > 2) {echo "<p class='dbg'>Weitere ".$weitere." zu verfolgende Buchungen gefunden. F&uuml;ge an:<br>Vorher ".count($verfolg)."</p>";}
+
+			$verfolg[] = $hgml; // neuen Wert fÃŒr weitere Verfolgung in Array anfÃŒgen
+
+		//	if ($debug > 2) {echo "<p class='dbg'>Nachher ".count($verfolg)."</p>";}
+
+	//	} else {
+	//		if ($debug > 2) {echo "<p class='dbg'>Auf Stufe ".$stufe." untersucht. Keine weitere abhÃ€ngigen Buchungen zu ".$hgml.".</p>";}
+		}
 	}
 	pg_free_result($resber);
-	return;
-}
-
+	return $verfolg; // weitere zu verfolgende GML-ID zurÃŒck geben
+}
 
 function kurz_namnr($lang) {
@@ -241,6 +278,6 @@
 	$kurz=str_replace(".00","",$lang); // leere Stufen (nur am Ende)
 	$kurz=str_replace("0000","",$kurz); // ganz leer (am Anfang)
-	$kurz=ltrim($kurz, "0"); // fuehrende Nullen am Anfang
-	$kurz=str_replace(".0",".",$kurz); // fuehrende Null jeder Stufe
+	$kurz=ltrim($kurz, "0"); // fuehr. Nullen
+	$kurz=str_replace(".0",".",$kurz); // fuehr. Null jeder Stufe
 	$kurz=rtrim($kurz); // Leerzeichen hinten
 	// echo "/n<p class='dbg'> lang='".$lang."'</p>/n<p class='dbg'> kurz='".$kurz."'</p>";
@@ -279,6 +316,7 @@
 	$altbvnr="";
 	$j=0;
-	while($rowf = pg_fetch_array($resf)) {
-		$flur=str_pad($rowf["flurnummer"], 3, "0", STR_PAD_LEFT);
+	while($rowf = pg_fetch_assoc($resf)) {
+	//	$flur=str_pad($rowf["flurnummer"], 3, "0", STR_PAD_LEFT);
+		$flur= $rowf["flurnummer"];
 		$fskenn=$rowf["zaehler"];
 		if ($rowf["nenner"] != "") { // Bruch
@@ -334,5 +372,5 @@
 function eigentuemer($gmlid, $mitadresse, $lnkclass) {
 	// Tabelle mit Eigentuemerdaten zu einem Grundbuchblatt ausgeben
-	// Sp.1 = Namennummer, Sp. 2 = Name / Adresse, Sp. 3 = Link
+	//  Sp.1="EigentÃŒmer" Sp.2=NamNr, Sp.3=Name/Adresse, Sp.4=Link
 	// Parameter:
 	//	$gmlid = ID GB-Blattes
@@ -344,12 +382,11 @@
 	global $debug, $gkz, $showkey;
 
-	// Link ÃŒber Java-Class? (Ja in alkisinlayausk.php, sonst normal)
 	if ($lnkclass == "") {
 		$lnkvor = "";
 		$lnknach = "";
-	} else {
+	} else { // Link ÃŒber Java-Class "imFenster" aus alkisinlayausk.php
 		$lnkvor  = "javascript:".$lnkclass."(\"";
 		$lnknach = "\")";
-	} // Beispiel-Link href='javascript:imFenster(\"alkislage.php?gkz= ... ."\")'>xxx ";
+	}
 
 	$sqln="SELECT n.gml_id, n.laufendenummernachdin1421 AS lfd, n.zaehler, n.nenner, n.artderrechtsgemeinschaft AS adr, n.beschriebderrechtsgemeinschaft as beschr, n.eigentuemerart, n.anlass, n.benennt, wn.v AS adrv, we.v AS eiartv "
@@ -358,51 +395,52 @@
 	."LEFT JOIN alkis_wertearten we ON cast(n.eigentuemerart AS character varying)=we.k AND we.element='ax_namensnummer' AND we.bezeichnung='eigentuemerart' "
 	."WHERE n.istbestandteilvon= $1 AND n.endet IS NULL ORDER BY n.laufendenummernachdin1421;";
-
-	$v = array($gmlid); // 16 Stellen bei Relationen
+	// +++	LEFT JOIN bis ax_Person statt Person als Schleife zu holen, 
+	//		VerknÃŒpfungsfeld "benennt" ist leer bei "Beschrieb der Rechtsgemeinschaft".
+
+	$v = array($gmlid); // GB-Blatt
 	$resn = pg_prepare("", $sqln);
 	$resn = pg_execute("", $v);
 
 	if (!$resn) {
-		echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>";
-		// kein Fehler bei Blattarten > 1000
+		echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>"; // kein Fehler bei Blattarten > 1000
 		//if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqln."<br>$1=gml= '".$gmlid."'</p>";}
 	}
 
 	$n=0; // Z.NamNum.
-	while($rown = pg_fetch_array($resn)) {
-		if($n == 0) { // Die Ãberschrift nur, wenn auch ein Inhalt folgt
-			echo "\n\n<h3><img src='ico/Eigentuemer_2.png' width='16' height='16' alt=''> Angaben zum Eigentum</h3>"
-			."\n<table class='eig'>";
-		}
+	while($rown = pg_fetch_assoc($resn)) {
 		$gmlnn=$rown["gml_id"];
 		$namnum=kurz_namnr($rown["lfd"]);
 		$rechtsg=$rown["adr"];
-		echo "\n<tr>"
-			."\n\t<td class='nanu' title='Namens-Nummer'>\n\t\t<p>" // Sp. 1
-				.$namnum."&nbsp;" // VOR die Tabelle: "EigentÃŒmer"
-			."</p>\n\t</td>"
-			. "\n\t<td>"; // Sp. 2
-			if ($rechtsg != "" ) {
+		echo "\n\t<tr>";
+			if($n == 0) { // erste EigentÃŒmer-Zeile zu einer Buchung
+				echo "\n\t\t<td class='ll'><img src='ico/Eigentuemer_2.png' width='16' height='16' alt=''> Eigent&uuml;mer:</td>"; // 1
+			} else { // Folgezeile
+				echo "\n\t\t<td class='ll'>&nbsp;</td>"; // 1
+			}
+
+			if ($rechtsg != "" ) { // Erbengemeinschaft usw.
+				echo "\n\t\t<td colspan='2'>"; // 2-3
 				if ($rechtsg == 9999) { // sonstiges
-					echo "\n\t\t<p class='zus' title='Beschrieb der Rechtsgemeinschaft'>".htmlentities($rown["beschr"], ENT_QUOTES, "UTF-8")."</p>";
+					echo "\n\t\t\t<p class='zus' title='Beschrieb der Rechtsgemeinschaft'>".htmlentities($rown["beschr"], ENT_QUOTES, "UTF-8")."</p>";
 				} else {
-					echo "\n\t\t<p class='zus' title='Art der Rechtsgemeinschaft'>".htmlentities($rown["adrv"], ENT_QUOTES, "UTF-8")."</p>";
+					echo "\n\t\t\t<p class='zus' title='Art der Rechtsgemeinschaft'>".htmlentities($rown["adrv"], ENT_QUOTES, "UTF-8")."</p>";
 				}
-			}
-			//if ($rown["anlass"] > 0 ) {echo "<p>Anlass=".$rown["anlass"]."</p>";} // TEST:
-
-			// Schleife Ebene 2: andere Namensnummern
-			// Beziehung   ax_namensnummer >bestehtAusRechtsverhaeltnissenZu>  ax_namensnummer 
-
-			// Die Relation 'Namensnummer' besteht aus RechtsverhÃ€ltnissen zu 'Namensnummer' sagt aus, 
-			// dass mehrere Namensnummern zu einer Rechtsgemeinschaft gehÃ¶ren kÃ¶nnen. 
-			// Die Rechtsgemeinschaft selbst steht unter einer eigenen AX_Namensnummer, 
-			// die zu allen Namensnummern der Rechtsgemeinschaft eine Relation besitzt.
+			} else { // Namensnummer
+				echo "\n\t\t<td class='nanu' title='Namens-Nummer'>\n\t\t\t<p>".$namnum."&nbsp;</p>\n\t\t</td>" // 2
+				. "\n\t\t<td>"; // 3
+
+			}
+			//if ($rown["anlass"] > 0 ) {echo "<p>Anlass=".$rown["anlass"]."</p>";}
+
+			// Andere Namensnummern?  Relation:  ax_namensnummer >bestehtAusRechtsverhaeltnissenZu>  ax_namensnummer 
+			// Die Relation 'Namensnummer' besteht aus RechtsverhÃ€ltnissen zu 'Namensnummer' sagt aus, dass mehrere Namensnummern zu einer Rechtsgemeinschaft gehÃ¶ren kÃ¶nnen. 
+			// Die Rechtsgemeinschaft selbst steht unter einer eigenen AX_Namensnummer, die zu allen Namensnummern der Rechtsgemeinschaft eine Relation besitzt.
 
 		// Schleife 2: P e r s o n
+		// +++ bei SQL Namensnummer oben gleich mit JOIN dazu holen, statt dieser Schleife
 		// Beziehung: ax_person  <benennt<  ax_namensnummer
-		$sqlp="SELECT gml_id, nachnameoderfirma, vorname, geburtsname, to_char(cast(geburtsdatum AS date),'DD.MM.YYYY') AS geburtsdatum, namensbestandteil, akademischergrad "
+		$sqlp="SELECT nachnameoderfirma, vorname, geburtsname, to_char(cast(geburtsdatum AS date),'DD.MM.YYYY') AS geburtsdatum, namensbestandteil, akademischergrad "
 		."FROM ax_person WHERE gml_id= $1 AND endet IS NULL;";
-		$gmlpers=$rown["benennt"];
+		$gmlpers=$rown["benennt"]; // leer bei RechtsverhÃ€ltnis
 		$v = array($gmlpers); // gml_id von ax_person
 		$resp = pg_prepare("", $sqlp);
@@ -414,5 +452,5 @@
 
 		$i=0; // cnt Person
-		while($rowp = pg_fetch_array($resp)) { // Schleife weglassen? nn >benennt> Person ist KEIN Array!
+		while($rowp = pg_fetch_assoc($resp)) { // Schleife weglassen: "benennt" ist KEIN Array!
 			$diePerson=""; //++ Anrede?
 			if ($rowp["akademischergrad"] <> "") {$diePerson=$rowp["akademischergrad"]." ";}
@@ -423,40 +461,31 @@
 			if ($rowp["geburtsname"] <> "") {$diePerson.=", geb. ".$rowp["geburtsname"];}
 			$diePerson=htmlentities($diePerson, ENT_QUOTES, "UTF-8"); // Umlaute
-
-			if ($i > 0) { // Spalte 1 enthÃ€lt die Namensnummer, nur in Zeile 0
-				echo "\n<tr>\n\t<td>&nbsp;</td>\n\t<td>";
-			}
-			// Spalte 2 = Angaben
 			$eiartkey=$rown["eigentuemerart"]; // Key
 			$eiart=$rown["eiartv"]; // Value
-			echo "\n\t\t<p class='geig' title='Eigent&uuml;merart: ".$eiart."'>".$diePerson."</p>\n\t</td>";
-
-			// Spalte 3 = Link
-			echo "\n\t<td>\n\t\t<p class='nwlink noprint'>";
-				if ($showkey AND $eiartkey != '') { // oft leer
-					echo "<span class='key' title='Eigent&uuml;merart'>".$eiartkey."</span> ";
-				}
-				echo "\n\t\t\t<a href='".$lnkvor."alkisnamstruk.php?gkz=".$gkz."&amp;gmlid=".$rowp[0];
+
+			echo "\n\t\t\t<p class='geig' title='Eigent&uuml;merart: ".$eiart."'>".$diePerson."</p>\n\t\t</td>"; // 3 - Person in Sp.3 hinter NamNum (Sp.2)
+			echo "\n\t\t<td>\n\t\t\t<p class='nwlink noprint'>"; // 4
+				if ($showkey AND $eiartkey != '') {echo "<span class='key' title='Eigent&uuml;merart'>".$eiartkey."</span> ";}
+				echo "\n\t\t\t\t<a href='".$lnkvor."alkisnamstruk.php?gkz=".$gkz."&amp;gmlid=".$gmlpers;
 				if ($showkey) {echo "&amp;showkey=j";}
 				if ($eiartkey == "") {$eiart="Eigent&uuml;mer" ;} // Default. Ersatz-Text, wenn nicht gefÃŒllt
 				echo $lnknach."' title='vollst&auml;ndiger Name und Adresse eines Eigent&uuml;mers'>".$eiart
-				." <img src='ico/Eigentuemer.png' width='16' height='16' alt=''></a>\n\t\t</p>"
-			."\n\t</td>\n</tr>";
+				." <img src='ico/Eigentuemer.png' width='16' height='16' alt=''></a>\n\t\t\t</p>"
+			."\n\t\t</td>" // 4
+			."\n\t</tr>";
 
 			if ($mitadresse) {
-				// Schleife 3:  A d r e s s e  (OPTIONAL)
+				// Schleife 3: optional  A d r e s s e  zur Person
 				$sqla ="SELECT a.gml_id, a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer, a.bestimmungsland "
 				."FROM ax_anschrift a JOIN ax_person p ON a.gml_id=ANY(p.hat) WHERE p.gml_id= $1 AND a.endet IS NULL AND p.endet IS NULL ORDER BY a.beginnt DESC LIMIT 2;";
-				$gmlp=$rowp["gml_id"]; // Person
-				$v = array($gmlp);
+				$v = array($gmlpers);
 				$resa = pg_prepare("", $sqla);
 				$resa = pg_execute("", $v);
-
 				if (!$resa) {
 					echo "\n\t<p class='err'>Fehler bei Adressen</p>";
-					if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqla."<br>$1=gml= '".$gmlp."'</p>";}
+					if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqla."<br>$1=gml= '".$gmlpers."'</p>";}
 				}
 				$j=0;
-				while($rowa = pg_fetch_array($resa)) {
+				while($rowa = pg_fetch_assoc($resa)) {
 					$j++;
 					if ($j == 1) { // erste ("jÃŒngste") Adresse anzeigen
@@ -473,15 +502,21 @@
 						$land=htmlentities($rowa["bestimmungsland"], ENT_QUOTES, "UTF-8");
 
-						echo "\n<tr>\n\t<td>&nbsp;</td>"; //Sp. 1
-						echo "\n\t<td><p class='gadr'>"; //Sp. 2
-						if ($str.$hsnr != "") {echo $str." ".$hsnr."<br>";}
-						if ($plz.$ort != "") {echo $plz." ".$ort;}
-						if ($land != "" and $land != "DEUTSCHLAND") {echo ", ".$land;}
-						echo "</p></td>\n\t<td>"; // Sp. 3
-						echo "&nbsp;</td>\n</tr>";
+						echo "\n\t<tr>"
+							."\n\t\t<td class='ll'>&nbsp;</td>" // 1
+							."\n\t\t<td>&nbsp;</td>" // 2
+							."\n\t\t<td><p class='gadr'>"; // 3
+							if ($str.$hsnr != "") {echo $str." ".$hsnr."<br>";}
+							if ($plz.$ort != "") {echo $plz." ".$ort;}
+							if ($land != "" and $land != "DEUTSCHLAND") {echo ", ".$land;}
+						echo "</p></td>" // 3
+							."\n\t\t<td>&nbsp;</td>\n\t</tr>"; // 4
 					} else { // manchmal doppelte Angaben
-						echo "\n<tr>\n\t<td>&nbsp;</td>\n\t<td><p class='dbg' title='Siehe Auskunft zur Person'>weitere Adresse</p></td>\n\t<td>&nbsp;</td>\n</tr>";
-					}
-				}
+						echo "\n\t<tr>"
+							."\n\t\t<td class='ll'>&nbsp;</td>" // 1
+							."\n\t\t<td>&nbsp;</td>" // 2
+							."\n\t\t<td><p class='dbg' title='Siehe Auskunft zur Person'>weitere Adresse</p></td>" // 3
+							."\n\t\t<td>&nbsp;</td>\n\t</tr>"; // 4
+					}
+				} // Ende Loop Adresse zur Person
 				pg_free_result($resa);
 			}
@@ -489,35 +524,29 @@
 			$i++; // cnt Person
 
-			// Anteil als eigene Tab-Zeile:
 			$zaehler=$rown["zaehler"];
-			if ($zaehler != "") {
+			if ($zaehler != "") { // Anteil als eigene Tab-Zeile
 				$zaehler=str_replace(".", ",", $zaehler); // Dezimal-KOMMA wenn dem Notar der Bruch nicht reicht
 				$nenner=str_replace(".", ",", $rown["nenner"]);
 				$comnt="Anteil der Berechtigten in Bruchteilen (Par. 47 GBO) an einem gemeinschaftlichen Eigentum (Grundst&uuml;ck oder Recht).";
-				echo "\n<tr>\n\t<td>&nbsp;</td>" // Sp. 1
-				."\n\t<td><p class='avh' title='".$comnt."'>".$zaehler."/".$nenner." Anteil</p></td>"
-				."\n\t<td>&nbsp;</td>\n</tr>"; // Sp. 3
+				echo "\n\t<tr>"
+				."\n\t\t<td class='ll'>&nbsp;</td>" // 1
+				."\n\t\t<td>&nbsp;</td>" // 2
+				."\n\t\t<td><p class='avh' title='".$comnt."'>".$zaehler."/".$nenner." Anteil</p></td>" // 3
+				."\n\t\t<td>&nbsp;</td>\n\t</tr>"; // 4
 			}
 		} // End Loop Person
-		if ($i == 0) { // Keine Person. Das kommt vor hinter der Zeile "Erbengemeinschaft" und ist dann KEIN Fehler
-			if ($rechtsg != 9999) {
+		pg_free_result($resp);
+
+		if ($i == 0) { // KEINE Person. benennt ist leer. Das kommt vor hinter der Zeile "Erbengemeinschaft" und ist dann KEIN Fehler
+			if ($rechtsg == 9999) {
+				if ($debug > 1) {echo "\n\t\t\t<p class='dbg'>Rechtsgemeinschaft = '".$rechtsg."'</p>";}
+			} else {
 				echo "\n<p class='err'>(Die Person mit der ID '".$gmlpers."' fehlt im Datenbestand)</p>";
-			} else {
-				if ($debug > 1) { // nur bei Entwicklung
-					echo "\n\t\t<p class='dbg'>Rechtsgemeinschaft = '".$rechtsg."'</p>";
-				}
-			}
-			echo "</td>\n\t<td>&nbsp;</td>\n</tr>";
+			}
+			echo "</td>\n\t\t<td>&nbsp;</td>\n\t</tr>";
 		}
 		$n++; // cnt NamNum
 	} // End Loop NamNum
-	if($n > 0) {
-		echo "\n</table>";
-	} else { // $n == 0, bei "Fiktives Blatt" KEIN Fehler 
-		if ($debug > 1) {
-			echo "\n<p class='dbg'>keine Namensnummern zum Blatt</p>";
-			//if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqln."<br>$1=gml(Blatt)= '".$gmlid."'</p>";}
-		}
-	}
+
 	pg_free_result($resn);
 	return $n; 
@@ -539,5 +568,5 @@
 	}
 	$i=0;
-	while($row = pg_fetch_array($res)) {
+	while($row = pg_fetch_assoc($res)) {
 		echo " ".$row["v"];
 		$i++;	
