Index: trunk/data/mapbender/http/nav/alkisnav_adr.php
===================================================================
--- trunk/data/mapbender/http/nav/alkisnav_adr.php	(revision 66)
+++ trunk/data/mapbender/http/nav/alkisnav_adr.php	(revision 68)
@@ -1,16 +1,8 @@
 <?php
-// Version vom 10.01.2011
-
-// ToDo: 
-//  Auswahl oder Sortierung "Gemeinde" if ($gemeinde == 0)
-//  Sortierung nach Nummer aus Hausnummer
-
-$gkz = urldecode($_REQUEST["gkz"]); // Mandant
+// Version vom 13.01.2011
+import_request_variables("PG");
 include("../../conf/alkisnav_conf.php");
-import_request_variables("PG");
-// Datenbank-Connection
 $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);
-
 ?>
 
@@ -26,10 +18,9 @@
 </head>
 <body>
-
 <?php
+
+
 function suchStrName() {
-// ============================
-// Straßen nach Name(-nsanfang)
-// ============================
+	// Straßen nach Name(-nsanfang)
 	global $con, $street, $scalestr, $str_schl, $gkz, $gemeinde, $debug;
 	$linelimit=120;  // -> in die Conf?
@@ -38,35 +29,33 @@
 	$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.bezeichnung AS gemname, k.bezeichnung, k.schluesselgesamt, k.lage  ";
+		$match=trim(preg_replace("/\*/i","%", strtoupper($matches[1])));
+	} else {
+		$match=trim($matches[1])."%";
+	}
+	$sql ="SELECT g.bezeichnung AS gemname, k.bezeichnung, k.schluesselgesamt, k.lage ";
 	$sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
-	$sql.="JOIN ax_gemeinde g ";
-	$sql.="ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde ";
-	$sql.="WHERE k.bezeichnung ILIKE ".$match." ";
+	$sql.="JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde ";
+	$sql.="WHERE k.bezeichnung ILIKE $1 ";
  	if($gemeinde > 0) { // Filter Gemeinde?
 		$sql.="AND k.gemeinde=".$gemeinde." ";
 	}
-	$sql.="ORDER BY k.bezeichnung, k.lage ";
-	// +++  if ($gemeinde == 0) ORDER Gemeinde, Straße?
-	$sql.="LIMIT ".$linelimit;
-	$res=pg_query($con, $sql);
-	if (!$res) {
-		return "\n<p class='err'>Fehler bei Name</p>";
-	}
+	$sql.="ORDER BY k.bezeichnung, k.lage LIMIT $2 ;";
+ 	$v=array($match,$linelimit);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {return "\n<p class='err'>Fehler bei Name</p>";}
 	$cnt = 0;
 	while($row = pg_fetch_array($res)) {
-		$sname=$row["bezeichnung"];
+		$sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8");		
 		$gkey=$row["schluesselgesamt"];
-		$gemname=$row["gemname"];
+		$gemname=htmlentities($row["gemname"], ENT_QUOTES, "UTF-8");
 		$skey=$row["lage"];
-		echo "\n\t<div class='st' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
-			echo "<a class='st' href='alkisnav_adr.php?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;str_schl=".$gkey."'>".$sname;
-			if ($gemeinde == 0) {
-				echo " - ".$gemname;
+		echo "\n\t<div class='stl' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
+			if (trim($skey, "0..9") == "") { // Integer
+				echo "<a class='stl' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;str_schl=".$gkey."'>".$sname."</a>";
+			} else { // Klassifizierung?
+				echo $sname; // nicht brauchbar fuer ax_lagebezeichnungmithausnummer.lage (Integer)
 			}
-			echo "</a><br>";
+			if (! isset($gemeinde)) {echo " in ".$gemname;}
 		echo "</div>";
 		$cnt++;
@@ -75,5 +64,5 @@
 		echo "<p>Keine Stra&szlig;e.</p>";
 	} elseif($cnt == 1) { // Eindeutig
-		$str_schl=$skey; // dann gleich weiter
+		$str_schl=$gkey; // dann gleich weiter
 	} elseif($cnt >= $linelimit) {
 		echo "<p>.. und weitere</p>";			
@@ -82,18 +71,61 @@
 }
 
+function suchStrKey() {
+	// Straßen nach Strassen-Schluessel
+	global $con, $street, $scalestr, $str_schl, $gkz, $gemeinde, $debug;
+	$linelimit=50;
+	if(preg_match("/\*/",$street)) {
+		$match=trim(preg_replace("/\*/i","%",$street));
+		// -> Anwender muss fuehrende Nullen eingeben oder fuehrende Wildcard
+	} else {
+		$match=str_pad($street, 5, "0", STR_PAD_LEFT); // "Wie eine Zahl" verarbeiten 
+	}
+   //if ($debug >= 2) {echo "<p>sql-Match='".$match."'</p>";}
+	$sql ="SELECT g.bezeichnung AS gemname, k.bezeichnung, k.schluesselgesamt, k.lage ";
+	$sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
+	$sql.="JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde ";
+	$sql.="WHERE k.lage LIKE $1 ";
+	if($gemeinde > 0) { // Filter Gemeinde?
+		$sql.="AND k.gemeinde=".$gemeinde." ";
+	}
+	$sql.="ORDER BY k.lage, k.bezeichnung LIMIT $2 ;";
+ 	$v=array($match,$linelimit);
+	$res=pg_prepare("", $sql);
+	$res=pg_execute("", $v);
+	if (!$res) {return "\n<p class='err'>Fehler bei Schl&uuml;ssel</p>";}
+	$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"];
+		echo "\n\t<div class='stl' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
+			echo $skey." <a class='st' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;str_schl=".$gkey."'>".$sname;
+			echo "</a>";
+			if (! isset($gemeinde)) {echo " in ".$gemname;}
+		echo "</div>";
+		$cnt++;
+	}
+	if($cnt == 0) {
+		echo "\n<p>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>.. und weitere</p>";			
+	} else {
+		echo "\n<p class='hilfe'>".$cnt." Stra&szlig;en</p>";	
+	}	
+	return;
+}
+
 function suchHausZurStr(){
-// =======================
-// Haeuser zu einer Straße
-// =======================
+	// Haeuser zu einer Straße
 	global $con, $str_schl, $gkz, $scalestr, $scalehs, $epsg, $gemeinde, $debug;
-	
 	// Strasse zum Strassenschluessel
 	$sql ="SELECT k.bezeichnung, k.land, k.regierungsbezirk, k.kreis, k.gemeinde, k.lage ";
-	$sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
-	$sql.="WHERE schluesselgesamt = $1 LIMIT 1"; 
+	$sql.="FROM ax_lagebezeichnungkatalogeintrag AS k WHERE schluesselgesamt = $1 LIMIT 1"; 
  	$v=array($str_schl);
 	$res=pg_prepare("", $sql);
 	$res=pg_execute("", $v);
-
 	if($row = pg_fetch_array($res)) { // Strassenschluessel gefunden
 		$sname=$row["bezeichnung"];
@@ -102,8 +134,6 @@
 		$kreis=$row["kreis"];
 		$gemnd=$row["gemeinde"];
-		//$lage=$row["lage"];
 		$nr=ltrim($row["lage"], "0");
-
-		// eine Koordinaten zur ausgewählten Strasse besorgen
+		// eine Koordinate zur Strasse besorgen
 		// ax_Flurstueck  >zeigtAuf>  ax_LagebezeichnungOhneHausnummer
 		$sqlko ="SELECT ";		
@@ -115,5 +145,4 @@
 		$sqlko.="WHERE o.land= $1 AND o.regierungsbezirk= $2 AND o.kreis= $3 AND o.gemeinde= $4 AND o.lage= $5 ";	
 		$sqlko.="AND v.beziehungsart='zeigtAuf' LIMIT 1;";  // die erstbeste beliebige Koordinate
-//		$resko=pg_query($con, $sqlko);
 		$v=array($land,$regb,$kreis,$gemnd,$nr);
 		$resko=pg_prepare("", $sqlko);
@@ -127,21 +156,20 @@
 		}
 		$sqlko.="";
-		//if ($debug >= 2) {echo "\n<p class='err'>Koord: '".$x."' '".$y."'</p>";}
-		echo "\n<div class='st'>";		
+		echo "\n<div class='stu'>";		
 		if ($x > 0) { // Koord. bekommen?
-			echo "<a title='Positionieren 1:".$scalestr."' href='"; // mit Link
+			echo "\n\t<a title='Positionieren 1:".$scalestr."' href='"; // mit Link
 				echo "javascript:parent.parent.hideHighlight();";
-				echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalestr.");";
-				echo " document.location.href=\"alkisnav_adr.php?gkz=".$gkz."&amp;str_schl=".$str_schl."\"' ";
-				echo "onmouseover='parent.parent.showHighlight(" .$x. "," .$y. ")' ";
-				echo "onmouseout='parent.parent.hideHighlight()'";
-			echo ">".$sname." (".$nr.")</a>";
+				echo "\n\t\tparent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalestr.");";
+				echo "\n\t\tdocument.location.href=\"".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;str_schl=".$str_schl."\"' ";
+				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. dazu gefunden
 			echo $sname." (".$nr.")"; // nur Anzeige, ohne Link
 		}
-		echo "\n</div><hr>";
+		echo "\n</div>\n<hr>";
 		
 		// Haeuser zum Strassenschluessel
-		$sql ="SELECT h.hausnummer, ";
+		$sql ="SELECT replace (h.hausnummer, ' ','') AS hsnr, ";
 		$sql.="x(st_transform(st_Centroid(g.wkb_geometry), ".$epsg.")) AS x, ";
 		$sql.="y(st_transform(st_Centroid(g.wkb_geometry), ".$epsg.")) AS y ";
@@ -149,24 +177,20 @@
 		$sql.="JOIN alkis_beziehungen v ON h.gml_id=v.beziehung_zu ";
 		$sql.="JOIN ax_gebaeude g ON v.beziehung_von=g.gml_id ";
-		$sql.="WHERE h.land=".$land." AND h.regierungsbezirk=".$regb." AND h.kreis=".$kreis." AND h.lage=".$nr." "; // integer
+		$sql.="WHERE h.land= $1 AND h.regierungsbezirk= $2 AND h.kreis= $3 AND h.lage= $4 "; // integer
 		$sql.="AND v.beziehungsart='zeigtAuf' ";
-		$sql.="ORDER BY hausnummer;";
-		// Sortierproblem: Hausnummer, numerischer Teil sollte numerisch sortiert sein.
-		//if ($debug >= 3) {echo "\n<p class='err'>".$sql."</p>";}
-		$resh=pg_query($con, $sql);
+		$sql.="ORDER BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2);";
+ 		$v=array($land,$regb,$kreis,$nr);
+		$resh=pg_prepare("", $sql);
+		$resh=pg_execute("", $v);
 		$cnt=0;
 		$count=0;
-		echo "<table>";
-
+		echo "\n<table>";
 		// mehrere Hausnummern je Zeile ausgeben
 		while($rowh = pg_fetch_array($resh)) {
-			if($count == 0){
-				echo "\n<tr>";
-			}
+			if($count == 0){echo "\n<tr>";}
 			$gml=$rowh["gml_id"];			
-			$nr=$rowh["hausnummer"];			
+			$nr=$rowh["hsnr"];			
 			$x=$rowh["x"];
 			$y=$rowh["y"];
-
 			echo "\n\t<td class='hsnr'>";
 				echo "<a href='";
@@ -176,5 +200,5 @@
 				echo "onmouseout='parent.parent.hideHighlight()";
 				echo "'>".$nr."</a>";
-			echo "\n\t</td>";
+			echo "</td>";
 			$cnt++;
 			$count++;
@@ -196,8 +220,8 @@
 // ===========
 if(isset($epsg)) {
-	if ($debug >= 2) {echo "<p>aktueller EPSG='".$epsg."'</p>";} // aus MB
+	if ($debug >= 2) {echo "\n<p>aktueller EPSG='".$epsg."'</p>";} // aus MB
 	If (substr($epsg, 0, 5) == "EPSG:") {$epsg=substr($epsg, 5);}
 } else {
-	if ($debug >= 2) {echo "<p class='err'>kein EPSG gesetzt</p>";}	
+	if ($debug >= 2) {echo "\n<p class='err'>kein EPSG gesetzt</p>";}	
 	$epsg=$gui_epsg; // aus Conf
 }
@@ -205,22 +229,21 @@
 if ($debug >= 2) {
 	if(isset($gemeinde)) {echo "<p>Filter Gemeinde = ".$gemeinde."</p>";
-	} else {echo "<p>Kein Filter Gemeinde</p>";}
-}
-
-if(isset($street)) {
-	// dies ist noch nicht möglich, es muesste der Gesamt-Keystring eingegeben werden	
-	if (is_numeric($street)) {
-		$str_schl = $street; // Schluessel (eindeutig) ist schon gesetzt
-	} else {
+	} else {echo "\n<p>Kein Filter Gemeinde</p>";}
+}
+
+if(isset($street)) { // Eingabe in Form
+	if (is_numeric(trim($street, "*"))) { // Zahl mit Wildcard
+		if ($debug >= 2) {echo "\n<p>Suche Key='".$street."'</p>";}
+		suchStrKey(); // Suche nach Schluessel
+	} else {
+		if ($debug >= 2) {echo "\n<p>Suche Name='".$street."'</p>";}
 		suchStrName(); // Suche nach Name
 	}
-} 
-// Strassenschluessel suchen
-// Verknuepfung zwischen "suchStrName" und "suchHausZurStr" uber Gesamt-Schluessel
-// Alternative für Eingabefeld (nur db-Feld "lage")?  
-// z.B. HIER trennen zwischen Eingabe-Key und Result-Key
-
-if(isset($str_schl)){
+}
+if(isset($str_schl)){ // Eindeutiges Ergebnis oder Link
+	if ($debug >= 2) {echo "\n<p>Suche Haus zu ='".$str_schl."'</p>";}
 	suchHausZurStr();
+} else {
+	if ($debug >= 2) {echo "\n<p>Keine Suche Haus</p>";}
 }
 ?>
