[Mapbender-commits] r6149 - in trunk/mapbender/http: classes php

svn_mapbender at osgeo.org svn_mapbender at osgeo.org
Mon May 10 08:32:30 EDT 2010


Author: armin11
Date: 2010-05-10 08:32:29 -0400 (Mon, 10 May 2010)
New Revision: 6149

Modified:
   trunk/mapbender/http/classes/class_connector.php
   trunk/mapbender/http/classes/class_metadata_new.php
   trunk/mapbender/http/classes/class_rss_factory.php
   trunk/mapbender/http/classes/class_rss_item.php
   trunk/mapbender/http/classes/class_wms.php
   trunk/mapbender/http/php/mod_callMetadata.php
   trunk/mapbender/http/php/mod_metadataWrite.php
Log:
adoptions for searchInterface and georss generator - give pubDate Tag

Modified: trunk/mapbender/http/classes/class_connector.php
===================================================================
--- trunk/mapbender/http/classes/class_connector.php	2010-05-10 12:04:26 UTC (rev 6148)
+++ trunk/mapbender/http/classes/class_connector.php	2010-05-10 12:32:29 UTC (rev 6149)
@@ -67,17 +67,21 @@
 			    if (func_num_args() == 2) {
             			$auth = func_get_arg(1);
 						if (isset($auth)) {
+							$e = new mb_notice("connector: curl auth");
 							$this->file = $this->getCURL($url,$auth);
 						}
 				}
 				else {
+				$e = new mb_notice("connector: curl without auth");
 					$this->file = $this->getCURL($url);
 				}
 				break;
 			case "http":
+			$e = new mb_notice("connector: http");
 				$this->file = $this->getHTTP($url);
 				break;
 			case "socket":
+			$e = new mb_notice("connector: socket");
 				$this->file = $this->getSOCKET($url);
 				break;
 		}
@@ -170,6 +174,7 @@
 		//allow https connections and handle certificates quite simply ;-)
 		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
 		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
+		$e = new mb_notice("connector: test1:");
 		//get hostname/ip out of url
 		//$host = parse_url($url,PHP_URL_HOST);
 		$arURL = parse_url($url);
@@ -181,6 +186,7 @@
 		$path = $arURL["path"];
 		
 		// fill array (HOSTs not for Proxy)
+		$e = new mb_notice("connector: NOT_PROXY_HOSTS:".NOT_PROXY_HOSTS);
  	    $NOT_PROXY_HOSTS_array = explode(",", NOT_PROXY_HOSTS);
 		if(CONNECTION_PROXY != "" AND (in_array($host, $NOT_PROXY_HOSTS_array)!= true)){
 			curl_setopt($ch, CURLOPT_PROXY,CONNECTION_PROXY.":".CONNECTION_PORT);	
@@ -212,7 +218,7 @@
 	           		 "Pragma: no-cache",
 	           		 "Content-length: ".strlen($this->httpPostData)
 			); 
-			$e = new mb_exception("connector: CURL POST: ".$this->httpPostData); 
+			$e = new mb_notice("connector: CURL POST: ".$this->httpPostData); 
 			#$e = new mb_exception("connector: CURL POST HEADER: ".print_r($headers));
 			curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 			curl_setopt($ch, CURLOPT_POST, 1);

Modified: trunk/mapbender/http/classes/class_metadata_new.php
===================================================================
--- trunk/mapbender/http/classes/class_metadata_new.php	2010-05-10 12:04:26 UTC (rev 6148)
+++ trunk/mapbender/http/classes/class_metadata_new.php	2010-05-10 12:32:29 UTC (rev 6149)
@@ -1,890 +1,1598 @@
 <?php
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchText=sozial&outputFormat=json&resultTarget=web&searchResources=wfs
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchText=sozial+schwanger&outputFormat=json&resultTarget=web&searchResources=wfs&registratingDepartments=72
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchText=sozial&outputFormat=json&resultTarget=web&searchResources=wms&
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchText=niedersachsen&outputFormat=json&resultTarget=web&searchResources=wms&maxResults=50
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchId=wal&searchText=wald&outputFormat=json&resultTarget=web&searchResources=wms&maxResults=10
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchId=test&searchText=e,w&outputFormat=json&registratingDepartments=44,33,29,30,31,35,40,61,101,87&languageCode=en&resultTarget=web&searchResources=wms&maxResults=10
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchId=45&searchText=e&outputFormat=json&registratingDepartments=44,33,29,30,31,35,40,61,101,87&languageCode=en&resultTarget=debug&searchResources=wms&maxResults=10&searchPages=1&isoCategories=10
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchId=45&searchText=e&outputFormat=json&registratingDepartments=44,33,29,30,31,35,40,61,101,87&languageCode=en&resultTarget=debug&searchResources=wms&maxResults=20&searchPages=1&isoCategories=10,5
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchId=wa&searchText=e&outputFormat=json&languageCode=de&resultTarget=debug&searchResources=wms&maxResults=10&isoCategories=10,5&registratingDepartments=44,31
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchId=wa&searchText=e&outputFormat=json&languageCode=de&resultTarget=debug&searchResources=wms&maxResults=5&registratingDepartments=44,31&inspireThemes=11&isoCategories=5,10
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchId=wa&searchText=e&outputFormat=json&languageCode=de&resultTarget=debug&searchResources=wms&maxResults=5&registratingDepartments=44,31&inspireThemes=11&isoCategories=5,10
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchId=wa&searchText=e&outputFormat=json&languageCode=de&resultTarget=debug&searchResources=wms&maxResults=5&registratingDepartments=44,31&inspireThemes=11&isoCategories=5,10&searchBbox=7,48,9,51
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchId=wa&searchText=e&outputFormat=json&languageCode=de&resultTarget=debug&searchResources=wms&maxResults=99&registratingDepartments=44,31,52&inspireThemes=11&isoCategories=5,10&searchBbox=7,48,9,51&regTimeBegin=2001-12-24&regTimeEnd=2020-10-10
-#http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php?searchId=wa&outputFormat=json&languageCode=de&resultTarget=debug&searchResources=wms&maxResults=99&registratingDepartments=44,31,52&inspireThemes=11&isoCategories=5,10&searchBbox=7,48,9,51&regTimeBegin=2001-12-24&regTimeEnd=2020-10-10
+#Script to call this class: http://www.geoportal.rlp.de/mapbender/php/mod_callMetadata.php
+#Class for getting results out of the mapbender service registry 
+#Resulttypes: WMS, WMS-Layer, (WFS), WFS-Featurtyps, WFS-Conf, WMC, GeoRSS-Feeds, ...
+#Possible filters: registrating organizations, time, bbox (fully inside, intersects, fully outside), ISO Topic Categories, INSPIRE themes, INSPIRE: keywords, classification of data/service ... - maybe relevant for the german broker not for one instance, quality and actuality (maybe spatial and temporal), bbox, deegree of conformity with ir, access and use constraints, responsible parties - maybe one is enough? We must have a look at the INSPIRE Metadata IR
+#Metadata we need to fullfil the demands of INSPIRE:
+#1. INSPIRE conformity classification for WMS/WFS/WCS
+#2. Temporal Extents at WMS/WMS-Layer/WFS/WFS-Featuretype levels - for datasets if demanded - til now there is no demand defined in the guidance-paper for metadata ir
+#3. Classified access and use contraints - which classes? - Check IR Data Sharing and IR Metadata
+#4. 
+#Every ressource which should be send to INSPIRE can be filtered - but is not neccessary for a standardized approach
+#Another problem is the ranking of the different ressources. The ranking should be homogeneus. 
+#Till now we rank the using of WMS Layers when Caps are requested and when s.o. load one layer into the geoportal.
+#The same things have to be done for the wfs-conf, wmc and georssfeeds
+#The searching for metadata should be parallel done. We need different classes for doing the search. They should be requested by one central class (class_metadata.php).
+#Classes for filtering after the results have been send to the portal:
+#1. ISO Topic Categories
+#2. INSPIRE Themes
+#3. Access and use classification
+#4. departments which provides the ressources - we need the new concept for the administration of this departments - store the addresses in the group table and give the relation - originating group in table mb_user_mb_group 
+#Cause we have a authorization layer, we need the id of the requesting user which is defined in the session. If no session is set, it should be the anonymous user of the portal.
+#We need a parameter for internationalization - it should be send with the search request! Some of the Classes can be provided with different languages.
+#WMC and GeoRSS-Feeds have no or a to complex authorization info - maybe we need to test if wmc consists of info which is fully or only partually available to the anonymous user. 
+
 require_once(dirname(__FILE__)."/../../conf/mapbender.conf");
-require_once(dirname(__FILE__)."/../../conf/geoportal.conf");
-require_once(dirname(__FILE__)."/../classes/class_metadata_new.php");
-require_once(dirname(__FILE__)."/../classes/class_json.php");
-session_start();
-//initialize request parameters:
-$searchId = "dummysearch";
-$searchText = "e";
-#$registratingDepartments = "33,29,30,31,35,40,61,101,87,44";
-$registratingDepartments = NULL;
-#$isoCategories = "1,2,3";
-$isoCategories = NULL;
-$inspireThemes = NULL;
-$customCategories = NULL;
-$timeBegin = NULL;
-$timeEnd = NULL;
-$regTimeBegin = NULL;
-$regTimeEnd = NULL;
-$maxResults = 5;
-#$searchBbox = "-180.0,-90.0,180.0,90.0";
-$searchBbox = NULL;
-$searchTypeBbox = "intersects"; //outside / inside
-$accessRestrictions = "false"; 
-$languageCode = "de";
-$outputFormat = 'json';
-#$searchResources = "wms,wfs,wmc,georss";
-#$searchResources = "wms";
-$searchPages = "1";
-$resultTarget = "debug";
-$searchEPSG = "EPSG:31466";
-$classJSON = new Mapbender_JSON;
-#$tempFolder = "/tmp";
-$tempFolder = TMPDIR;
-$orderBy = "rank"; //rank or title or id
-$hostName = $_SERVER['HTTP_HOST'];
+require_once(dirname(__FILE__)."/class_administration.php");
+require_once(dirname(__FILE__)."/class_mb_exception.php");
+require_once(dirname(__FILE__)."/class_json.php");
 
-//read the whole query string:
-$searchURL = $_SERVER['QUERY_STRING'];
+//definition for the things which are common to all kind of metadata ressources
 
-//control if some request variables are not set and set them explicit to NULL
+class searchMetadata {
+	var $userId;
+	var $searchId;
+	var $searchText;
+	var $registratingDepartments;
+	var $isoCategories;
+	var $inspireThemes;
+	var $customCategories;
+	var $timeBegin;
+	var $timeEnd;
+	var $regTimeBegin;
+	var $regTimeEnd;
+	var $maxResults;
+	var $searchBbox;
+	var $searchTypeBbox;
+	var $accessRestrictions;
+	var $languageCode;
+	var $searchStartTime;
+	var $searchView;
+	var $searchURL;
+	var $searchEPSG;
+	var $searchResources;
+	var $searchPages;
+	var $outputFormat;
+	var $resultTarget;
+	var $tempFolder;
+	var $orderBy;
+	var $hostName;
 
+	function __construct($userId, $searchId, $searchText, $registratingDepartments, $isoCategories, $inspireThemes, $timeBegin, $timeEnd, $regTimeBegin, $regTimeEnd, $maxResults, $searchBbox, $searchTypeBbox, $accessRestrictions, $languageCode, $searchEPSG, $searchResources, $searchPages, $outputFormat, $resultTarget, $searchURL, $customCategories, $hostName, $orderBy){
+		$this->userId = (integer)$userId;
+		$this->searchId = $searchId;
+		$this->searchText = $searchText;
+		$this->registratingDepartments = $registratingDepartments; //array with ids of the registrating groups in the mb database
+		$this->registratingDepartmentsArray = explode(",",$this->registratingDepartments);
+		$this->isoCategories = $isoCategories;
+		$this->inspireThemes = $inspireThemes;
+		$this->customCategories = $customCategories;
+		$this->timeBegin = $timeBegin;
+		$this->timeEnd = $timeEnd;
+		$this->regTimeBegin = $regTimeBegin;
+		$this->regTimeEnd = $regTimeEnd;
+		$this->maxResults = (integer)$maxResults;
+		$this->searchBbox = $searchBbox;
+		$this->searchTypeBbox = $searchTypeBbox;
+		$this->accessRestrictions = $accessRestrictions;
+		$this->languageCode = $languageCode;
+		$this->searchEPSG = $searchEPSG;
+		$this->searchResources = $searchResources;
+		$this->searchPages = $searchPages;
+		$this->outputFormat = $outputFormat;
+		$this->resultTarget = $resultTarget;
+		$this->searchURL = $searchURL;
+		$this->hostName = $hostName;
+		$this->orderBy = $orderBy;
+		
+		$this->tempFolder = TMPDIR; //TODO define another path - maybe the one which is given in mapbender.conf
+		if ($this->outputFormat == 'json'){
+			$this->json = new Mapbender_JSON;
+		}
+		$this->accessableLayers = NULL;
+		//set a time to find time consumers
+		$this->searchStartTime = $this->microtime_float();
+		//Defining of the different database categories		
+		$this->resourceClassifications = array();
+		$this->resourceClassifications[0]['title'] = "ISO 19115"; //TODO: define the translations somewhere? - This is done in call_metadata.php before. Maybe we can get them from there? - It will be shown in the rightside categories table
+		$this->resourceClassifications[0]['tablename'] = 'md_topic_category';
+		$this->resourceClassifications[0]['requestName'] = 'isoCategories';
+		$this->resourceClassifications[0]['id_wms'] = 'layer_id';
+		$this->resourceClassifications[0]['id_wfs'] = 'featuretype_id';
+		$this->resourceClassifications[0]['relation_wms'] = 'layer_md_topic_category';
+		$this->resourceClassifications[0]['relation_wfs'] = 'featuretype_md_topic_category';//TODO: define this in mapbender
 
-$checkForNullRequests = array("registratingDepartments","isoCategories","inspireThemes","customCategories","regTimeBegin","regTimeEnd","timeBegin","timeEnd","searchBbox","searchTypeBbox","searchResources","orderBy","hostName");
+		$this->resourceClassifications[1]['title'] = "INSPIRE"; //TODO: define the translations somewhere? - This is done in call_metadata.php before. Maybe we can get them from there? - It will be shown in the rightside categories table
+		$this->resourceClassifications[1]['tablename'] = 'inspire_category';
+		$this->resourceClassifications[1]['requestName'] = 'inspireThemes';
+		$this->resourceClassifications[1]['id_wms'] = 'layer_id';
+		$this->resourceClassifications[1]['id_wfs'] = 'featuretype_id';
+		$this->resourceClassifications[1]['relation_wms'] = 'layer_inspire_category';
+		$this->resourceClassifications[1]['relation_wfs'] = 'featuretype_inspire_category';//TODO: define this in mapbender
 
+		$this->resourceClassifications[2]['title'] = "Custom"; //TODO: define the translations somewhere? - This is done in call_metadata.php before. Maybe we can get them from there? - It will be shown in the rightside categories table
+		$this->resourceClassifications[2]['tablename'] = 'custom_category';
+		$this->resourceClassifications[2]['requestName'] = 'customCategories';
+		$this->resourceClassifications[2]['id_wms'] = 'layer_id';
+		$this->resourceClassifications[2]['id_wfs'] = 'featuretype_id';
+		$this->resourceClassifications[2]['relation_wms'] = 'layer_custom_category';
+		$this->resourceClassifications[2]['relation_wfs'] = 'featuretype_custom_category';//TODO: define this in mapbender
 
-for($i=0; $i < count($checkForNullRequests); $i++){
-	if (!$_REQUEST[$checkForNullRequests[$i]] or $_REQUEST[$checkForNullRequests[$i]] == 'false' or $_REQUEST[$checkForNullRequests[$i]] == 'undefined') {
-		$_REQUEST[$checkForNullRequests[$i]] = "";
-		$searchURL = delTotalFromQuery($checkForNullRequests[$i],$searchURL);
-	}
-}
 
 
 
 
 
-//Read out request Parameter:
-if (isset($_REQUEST["searchId"]) & $_REQUEST["searchId"] != "") {
-	//gernerate md5 representation, cause the id is used as a filename later on! - no validation needed
-	$searchId = md5($_REQUEST["searchId"]);
-}
-if (isset($_REQUEST["searchText"]) & $_REQUEST["searchText"] != "") {
-	$test="(SELECT\s[\w\*\)\(\,\s]+\sFROM\s[\w]+)| (UPDATE\s[\w]+\sSET\s[\w\,\'\=]+)| (INSERT\sINTO\s[\d\w]+[\s\w\d\)\(\,]*\sVALUES\s\([\d\w\'\,\)]+)| (DELETE\sFROM\s[\d\w\'\=]+)";
-	//validate to csv integer list
-	$testMatch = $_REQUEST["searchText"];
-	$pattern = '/(\%27)|(\')|(\-\-)|(\")|(\%22)/';		
- 	if (preg_match($pattern,$testMatch)){ 
-		echo 'searchText: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$searchText = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["registratingDepartments"]) & $_REQUEST["registratingDepartments"] != "") {
-	//validate to csv integer list
-	$testMatch = $_REQUEST["registratingDepartments"];
-	$pattern = '/^[\d,]*$/';		
- 	if (!preg_match($pattern,$testMatch)){ 
-		echo 'registratingDepartments: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$registratingDepartments = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["isoCategories"]) & $_REQUEST["isoCategories"] != "") {
-	//validate to csv integer list
-	$testMatch = $_REQUEST["isoCategories"];
-	$pattern = '/^[\d,]*$/';		
- 	if (!preg_match($pattern,$testMatch)){ 
-		echo 'isoCategories: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$isoCategories = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["inspireThemes"]) & $_REQUEST["inspireThemes"] != "") {
-	//validate to csv integer list
-	$testMatch = $_REQUEST["inspireThemes"];
-	$pattern = '/^[\d,]*$/';		
- 	if (!preg_match($pattern,$testMatch)){ 
-		echo 'inspireThemes: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$inspireThemes = $testMatch;
-	$testMatch = NULL;
-}
 
-if (isset($_REQUEST["customCategories"]) & $_REQUEST["customCategories"] != "") {
-	//validate to csv integer list
-	$testMatch = $_REQUEST["customCategories"];
-	$pattern = '/^[\d,]*$/';		
- 	if (!preg_match($pattern,$testMatch)){ 
-		echo 'customCategories: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$customCategories = $testMatch;
-	$testMatch = NULL;
-}
+		//Defining of the different result categories		
+		$this->resourceCategories = array();
+		$this->resourceCategories[0]['name'] = 'WMS';
+		$this->resourceCategories[1]['name'] = 'WFS';
+		$this->resourceCategories[2]['name'] = 'WMC';
+		$this->resourceCategories[3]['name'] = 'GeoRSS';
+		switch($this->languageCode){
+        		case 'de':
+                	$this->resourceCategories[0]['name2show'] = 'Darstellungsdienste';
+			$this->resourceCategories[1]['name2show'] = 'Such- und Downloaddienste';
+			$this->resourceCategories[2]['name2show'] = 'Kartenzusammenstellungen';
+			$this->resourceCategories[3]['name2show'] = 'Geokodierte Newsfeeds';
+       			break;
+        		case 'en':
+               		$this->resourceCategories[0]['name2show'] = 'Viewingservices';
+			$this->resourceCategories[1]['name2show'] = 'Search- and Downloadservices';
+			$this->resourceCategories[2]['name2show'] = 'Combined Maps';
+			$this->resourceCategories[3]['name2show'] = 'Geocodet Newsfeeds';
+        		break;
+        		case 'fr':
+          	     	$this->resourceCategories[0]['name2show'] = 'Viewingservices';
+			$this->resourceCategories[1]['name2show'] = 'Search- and Downloadservices';
+			$this->resourceCategories[2]['name2show'] = 'Combined Maps';
+			$this->resourceCategories[3]['name2show'] = 'Geocodet Newsfeeds';
+       			break;
+     			default:
+                	$this->resourceCategories[0]['name2show'] = 'Darstellungsdienste';
+			$this->resourceCategories[1]['name2show'] = 'Such- und Downloaddienste';
+			$this->resourceCategories[2]['name2show'] = 'Kartenzusammenstellungen';
+			$this->resourceCategories[3]['name2show'] = 'Geokodierte Newsfeeds';
+		}	
+		//not needed til now - maybe usefull for georss output
+		if ($this->outputFormat == "xml") {
+			//Initialize XML documents
+			if (isset($this->searchResources) & strtolower($this->searchResources) === "wms") {
+				$this->wmsDoc = new DOMDocument('1.0');
+			}
+			if (isset($this->searchResources) & strtolower($this->searchResources) === "wfs") {
+				$this->wfsDoc = new DOMDocument('1.0');
+				$this->generateWFSMetadata($this->wfsDoc);
+			}
+			if (isset($this->searchResources) & strtolower($this->searchResources) === "wmc") {
+				$this->wmcDoc = new DOMDocument('1.0');
+				$this->generateWMCMetadata($this->wmcDoc);
+			}
+			if (isset($this->searchResources) & strtolower($this->searchResources) === "georss") {
+				$this->georssDoc = new DOMDocument('1.0');
+			}
+		}
+		
+		if ($this->outputFormat === "json") {
+			$this->e = new mb_exception("orderBy old: ".$this->orderBy);
+			if (isset($this->searchResources) & strtolower($this->searchResources) === "wfs") {
+				$this->searchView = 'search_wfs_view';
+				switch ($this->orderBy) {
+					case "rank":
+						$this->orderBy = " ORDER BY wfs_id,featuretype_id,wfs_conf_id ";
+						break;
+					case "id":
+						$this->orderBy = " ORDER BY wfs_id,featuretype_id,wfs_conf_id ";
+						break;
+					case "title":
+						$this->orderBy = " ORDER BY featuretype_title ";
+						break;
+					default:
+						$this->orderBy = " ORDER BY wfs_id,featuretype_id,wfs_conf_id ";
+				}
+				
+				$this->resourceClasses = NULL;
+				$this->generateWFSMetadata($this->wfsDoc);
+			}
+			if (isset($this->searchResources) & strtolower($this->searchResources) === "wms") {
+				$this->searchView = 'wms_search_table_test';
+				switch ($this->orderBy) {
+					case "rank":
+						$this->orderBy = " ORDER BY load_count DESC";
+						break;
+					case "id":
+						$this->orderBy = " ORDER BY wms_id,layer_pos DESC";
+						break;
+					case "title":
+						$this->orderBy = " ORDER BY layer_title ";
+						break;
+					default:
+						$this->orderBy = " ORDER BY load_count DESC";
+				}
+				
+				$this->resourceClasses = array(0,1,2);
+				$this->generateWMSMetadata($this->wmsDoc);
+			}
+			if (isset($this->searchResources) & strtolower($this->searchResources) === "wmc") {
+				$this->searchView = 'search_wmc_view';
+				switch ($this->orderBy) {
+					case "rank":
+						$this->orderBy = " ORDER BY wmc_id ";
+						break;
+					case "id":
+						$this->orderBy = " ORDER BY wmc_id ";
+						break;
+					case "title":
+						$this->orderBy = " ORDER BY wmc_title ";
+						break;
+					default:
+						$this->orderBy = " ORDER BY wmc_title ";
+				}
+				
+				$this->resourceClasses = NULL; #TODO adopt to count classifications
+				$this->generateWMCMetadata($this->wmcDoc);
+			}
+		}
+	$this->e = new mb_exception("orderBy new: ".$this->orderBy);
+	}
 
-if (isset($_REQUEST["timeBegin"]) & $_REQUEST["timeBegin"] != "") {
-	//validate to iso date format YYYY-MM-DD
-	$testMatch = $_REQUEST["timeBegin"];
-	$pattern = '/^(19|20)[0-9]{2}[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/';		
- 	if (!preg_match($pattern,$testMatch)){ 
-		echo 'timeBegin: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$timeBegin = $testMatch;
-	$testMatch = NULL;	
-}
-if (isset($_REQUEST["timeEnd"]) & $_REQUEST["timeEnd"] != "") {
-	$testMatch = $_REQUEST["timeEnd"];
-	$pattern = '/^(19|20)[0-9]{2}[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/';		
- 	if (!preg_match($pattern,$testMatch)){ 
-		echo 'timeEnd: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$timeEnd = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["regTimeBegin"]) & $_REQUEST["regTimeBegin"] != "") {
-	//validate to iso date format YYYY-MM-DD
-	$testMatch = $_REQUEST["regTimeBegin"];
-	$pattern = '/^(19|20)[0-9]{2}[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/';		
- 	if (!preg_match($pattern,$testMatch)){ 
-		echo 'regTimeBegin: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$regTimeBegin = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["regTimeEnd"]) & $_REQUEST["regTimeEnd"] != "") {
-	//validate to iso date format YYYY-MM-DD
-	$testMatch = $_REQUEST["regTimeEnd"];
-	$pattern = '/^(19|20)[0-9]{2}[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/';		
- 	if (!preg_match($pattern,$testMatch)){ 
-		echo 'regTimeEnd: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$regTimeEnd = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["maxResults"]) & $_REQUEST["maxResults"] != "") {
-	//validate integer to 100 - not more
-	$testMatch = $_REQUEST["maxResults"];
-	//give max 99 entries - more will be to slow
-	$pattern = '/^([0-9]{0,1})([0-9]{1})$/';		
- 	if (!preg_match($pattern,$testMatch)){ 
-		echo 'maxResults: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$maxResults = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["searchBbox"]) & $_REQUEST["searchBbox"] != "") {
-	//validate to float/integer
-	$testMatch = $_REQUEST["searchBbox"];
-	//$pattern = '/^[-\d,]*$/';	
-	$pattern = '/^[-+]?([0-9]*\.[0-9]+|[0-9]+)*$/';
-	$testMatchArray = explode(',',$testMatch);
- 	if (count($testMatchArray) != 4) {
-		echo 'searchBbox: <b>'.$testMatch.'</b> has a wrong amount of entries.<br/>'; 
-		die(); 
+	private function microtime_float() {
+    		list($usec, $sec) = explode(" ", microtime());
+    		return ((float)$usec + (float)$sec);
 	}
-	for($i=0; $i<count($testMatchArray);$i++){
-		if (!preg_match($pattern,$testMatchArray[$i])){ 
-			echo 'searchBbox: <b>'.$testMatchArray[$i].'</b> is not a valid coordinate value.<br/>'; 
-			die(); 		
- 		}
+	private function generateXMLHead($xmlDoc) {
+		$xmlDoc->encoding = CHARSET;
+		$result = $xmlDoc->createElement("result");
+		$xmlDoc->appendChild($result);
+		//Result Count
+		$overLimit = $xmlDoc->createElement("overLimit");
+		$result->appendChild($overLimit);
+		//$tr_text = $xmlDoc->createTextNode($this->isOverLimit);
+		$tr_text = $xmlDoc->createTextNode("really?");
+		$overLimit->appendChild($tr_text);
+		$rd = $xmlDoc->createElement("redirect");
+		$result->appendChild($rd);
+		$trd = $xmlDoc->createTextNode("not yet ready...");
+		$rd->appendChild($trd);
 	}
-	$searchBbox = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["searchTypeBbox"]) & $_REQUEST["searchTypeBbox"] != "") {
-	//validate to inside / outside - TODO implement other ones than intersects which is default
-	$testMatch = $_REQUEST["searchTypeBbox"];	
- 	if (!($testMatch == 'inside' or $testMatch == 'outside' or $testMatch == 'intersects')){ 
-		echo 'searchTypeBbox: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	#$searchTypeBbox = $testMatch; //TODO activate this
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["accessRestrictions"]) & $_REQUEST["accessRestrictions"] != "") {
-	//validate to ?
-	#TODO implement me //$accessRestrictions = $_REQUEST["accessRestrictions"];
-}
-if (isset($_REQUEST["languageCode"]) & $_REQUEST["languageCode"] != "") {
-	//validate to de, en, fr
-	$testMatch = $_REQUEST["languageCode"];	
- 	if (!($testMatch == 'de' or $testMatch == 'en' or $testMatch == 'fr')){ 
-		echo 'languageCode: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$languageCode = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["outputFormat"]) & $_REQUEST["outputFormat"] != "") {
-	$testMatch = $_REQUEST["outputFormat"];	
- 	if (!($testMatch == 'json' or $testMatch == 'georss')){ 
-		echo 'outputFormat: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$outputFormat = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["hostName"]) & $_REQUEST["hostName"] != "") {
-	$testMatch = $_REQUEST["hostName"];	
- 	if (!($testMatch == 'www.geoportal.rlp' or $testMatch == 'www.geoportal.rlp.de' or $testMatch == 'geoportal.rlp' or $testMatch == '10.7.101.165' or $testMatch == 'localhost:16580' or $testMatch == 'localhost')){ 
-		echo 'hostName: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$hostName = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["orderBy"]) & $_REQUEST["orderBy"] != "") {
-	$testMatch = $_REQUEST["orderBy"];	
- 	if (!($testMatch == 'rank' or $testMatch == 'title' or $testMatch == 'id')){ 
-		echo 'orderBy: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$orderBy = $testMatch;
-	$testMatch = NULL;
-}// else {
-//$orderBy= 'rank';
-//}
-if (isset($_REQUEST["searchResources"]) & $_REQUEST["searchResources"] != "") {
-	//validate to wms,wfs,wmc,georss
-	$testMatch = $_REQUEST["searchResources"];
-	#$pattern = '/^(19|20)[0-9]{2}[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])$/';
-	$countSR = count(explode(',',$testMatch));
- 	if (!($countSR >= 1 && $countSR <= 4)){ 
-		echo 'searchResources: <b>'.$testMatch.'</b> count of requested resources out of sync.<br/>'; 
-		die(); 		
- 	} else {
-		$testArray = explode(',',$testMatch);
-		for($i=0; $i<count($testArray);$i++){
-			if (!($testArray[$i] == 'wms' or $testArray[$i] == 'wfs' or $testArray[$i] == 'wmc' or $testArray[$i] == 'georss')) {
-			echo 'searchResources: <b>'.$testMatch.'</b>at least one of them does not exists!<br/>'; 
-			die();
-			}
+	private function generateXMLFoot($xmlDoc){
+		$results = $xmlDoc->getElementsByTagName("result");			
+		foreach ($results as $result) {
+			$result->appendChild($ready);
 		}
-		unset($i);
 	}
-	$searchResources = $testMatch;
-	$testMatch = NULL;
-}
-if (isset($_REQUEST["searchPages"]) & $_REQUEST["searchPages"] != "") {
-	//validate to csv integer list with dimension of searchResources list
-	$testMatch = $_REQUEST["searchPages"];
-	$pattern = '/^[-\d,]*$/';		
- 	if (!preg_match($pattern,$testMatch)){ 
-		echo 'searchPages: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	if (count(explode(',',$testMatch)) != count(explode(',',$searchResources))) {
-		echo 'searchPages: <b>'.$testMatch.'</b> has a wrong amount of entries.<br/>'; 
-		die(); 
+	private function flipDiagonally($arr) {
+    		$out = array();
+    		foreach ($arr as $key => $subarr) {
+      			foreach ($subarr as $subkey => $subvalue) {
+        			$out[$subkey][$key] = $subvalue;
+       			 }
+    		}
+   		return $out;
 	}
-	$searchPages = $testMatch;
-	$testMatch = NULL;
-#$searchPages = $_REQUEST["searchPages"];
-	#$searchPages = split(',',$searchPages);
-	
-}
-if (isset($_REQUEST["resultTarget"]) & $_REQUEST["resultTarget"] != "") {
-	//validate to web,debug,file
-	$testMatch = $_REQUEST["resultTarget"];	
- 	if (!($testMatch == 'web' or $testMatch == 'debug' or $testMatch == 'file')){ 
-		echo 'resultTarget: <b>'.$testMatch.'</b> is not valid.<br/>'; 
-		die(); 		
- 	}
-	$resultTarget = $testMatch;
-	$testMatch = NULL;
-}
 
-if (isset($_REQUEST["userId"]) & $_REQUEST["userId"] != "") {
-        //validate integer to 100 - not more
-        $testMatch = $_REQUEST["userId"];
-        //give max 99 entries - more will be to slow
-        $pattern = '/^[0-9]*$/';  
-        if (!preg_match($pattern,$testMatch)){
-                echo 'userId: <b>'.$testMatch.'</b> is not valid.<br/>';
-                die();
-        }
-        $userId = $testMatch;
-        $testMatch = NULL;
-} else {
+	private function generateWFSMetadataJSON($res, $n) {
+		//initialize object
+		$this->wfsJSON = new stdClass;
+		$this->wfsJSON->wfs = (object) array(
+				'md' => (object) array(
+					'nresults' => $n, 
+					'p' => $this->searchPages,
+					'rpp' => $this->maxResults
+					),
+				'srv' => array()
+				);
+			
+		//read out records
+		$serverCount = 0;
+		$wfsMatrix = db_fetch_all($res);
+		//sort result for accessing the right services
+		$wfsMatrix = $this->flipDiagonally($wfsMatrix);
+		//TODO check if order by db or order by php is faster! 
+		#array_multisort($wfsMatrix['wfs_id'], SORT_ASC,$wfsMatrix['featuretype_id'], SORT_ASC,$wfsMatrix['wfs_conf_id'], SORT_ASC); //have some problems - the database version is more stable
+		#print_r($wfsMatrix);
+		$wfsMatrix = $this->flipDiagonally($wfsMatrix);
+		//read out first server entry - maybe this a little bit timeconsuming TODO
+		$j = 0; //count identical wfs_id => double featuretype
+		$l = 0; //index featuretype and or modul per wfs
+		$m = 0; //index modul per featuretype
+		for($i=0; $i<count($wfsMatrix);$i++){
+				$this->wfsJSON->wfs->srv[$i-$j]->id = $wfsMatrix[$i]['wfs_id'];
+				$this->wfsJSON->wfs->srv[$i-$j]->title = $wfsMatrix[$i]['wfs_title'];
+				$this->wfsJSON->wfs->srv[$i-$j]->abstract = $wfsMatrix[$i]['wfs_abstract'];
+				$this->wfsJSON->wfs->srv[$i-$j]->date = date("d.m.Y",$wfsMatrix[$i]['wfs_timestamp']);
+				$this->wfsJSON->wfs->srv[$i-$j]->respOrg = $wfsMatrix[$i]['mb_group_name'];
+				$this->wfsJSON->wfs->srv[$i-$j]->mdLink = "http://".$this->hostName."/mapbender/x_geoportal/showWFSMetadata.php?id=".$wfsMatrix[$i]['wfs_id'];
+				$spatialSource = "";
+				$stateOrProvince = $wfsMatrix[$i]['administrativearea']; 
+				if ($stateOrProvince == "NULL" || $stateOrProvince == "") {
+					$spatialSource = $wfsMatrix[$i]['country'];
+				} else {
+					$spatialSource = $wfsMatrix[$i]['administrativearea'];
+				}
+				$this->wfsJSON->wfs->srv[$i-$j]->iso3166 = $spatialSource;
+				//check if a disclaimer has to be shown and give the relevant symbol
+				//$this->wfsJSON->wfs->srv[$i-$j]->tou = $wfsMatrix[$i]['termsofuse'];
+				list($hasConstraints, $symbolLink) = $this->hasConstraints("wfs", $wfsMatrix[$i]['wfs_id']);
+				$this->wfsJSON->wfs->srv[$i-$j]->hasConstraints = $hasConstraints;
+				$this->wfsJSON->wfs->srv[$i-$j]->symbolLink = $symbolLink;
+				//TODO check the field accessconstraints - which should be presented?
+				$this->wfsJSON->wfs->srv[$i-$j]->status = NULL; //$wfsMatrix[$i][''];
+				$this->wfsJSON->wfs->srv[$i-$j]->avail = NULL; //$wfsMatrix[$i][''];
+				$this->wfsJSON->wfs->srv[$i-$j]->logged = NULL; //$wfsMatrix[$i][''];
+				$this->wfsJSON->wfs->srv[$i-$j]->price = NULL; //$wfsMatrix[$i][''];
+				$this->wfsJSON->wfs->srv[$i-$j]->nwaccess = NULL; //$wfsMatrix[$i][''];
+				$this->wfsJSON->wfs->srv[$i-$j]->bbox = array(-180.0,-90.0,180.0,90.0); //$wfsMatrix[$i][''];
+				//if featuretype hasn't been created - do it
+				if (!isset($this->wfsJSON->wfs->srv[$i-$j]->ftype)) {
+					$this->wfsJSON->wfs->srv[$i-$j]->ftype = array();
+				}
+				//fill in featuretype infos
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->id = (integer)$wfsMatrix[$i]['featuretype_id'];
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->title = $wfsMatrix[$i]['featuretype_title'];
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->abstract = $wfsMatrix[$i]['featuretype_abstract'];
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->mdLink = "http://".$this->hostName."/mapbender/x_geoportal/showWFeatureTypeMetadata.php?id=".$wfsMatrix[$i]['featuretype_id'];
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->geomtype = $wfsMatrix[$i]['element_type'];
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->bbox = array(-180.0,-90.0,180.0,90.0);//TODO: $wfsMatrix[$i]['bbox'];
 
-if (!isset($_SESSION['mb_user_id']) ) {
-        $userId = ANONYMOUS_USER;
-}
-else
-{
-        $userId = $_SESSION['mb_user_id'];
-}
 
-}
+				//give info for inspire categories - not relevant for other services or instances of mapbender TODO: comment it if the mapbender installation is not used to generate inspire output
+				if (isset($wfsMatrix[$i]['md_inspire_cats']) & ($wfsMatrix[$i]['md_inspire_cats'] != '')){
+					$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->inspire = 1;
+				}
+				else {
+					$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->inspire = 0;
+				}
+				//fill in categories
+				#if (!isset($this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->cat)) {
+				#	$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->cat = array();
+				#}
+				#if (isset($wfsMatrix[$i]['iso_categories'])) {
+				#}
+				//if (isset($wfsMatrix[$i]['inspire_category'])) {
+					//TODO write the categories as JSON into Database!
+					#$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->cat[0]->type = 'INSPIRE Kategorie';
+ 					#$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->cat[0]->value = 'Umwelt';
+					#$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->cat[0]->symbol = 'umwelt.png';
+				//}
+				#if (isset($wfsMatrix[$i]['custom_categories'])) {
+				#}
+				//if modul hasn't been created - do it
+				if (!isset($this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul)) {	
+					$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul = array();
+				}
+				//fill in modul infos
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->id = $wfsMatrix[$i]['wfs_conf_id'];	
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->title = $wfsMatrix[$i]['wfs_conf_description'];	
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->abstract = $wfsMatrix[$i]['wfs_conf_abstract'];
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->type = $wfsMatrix[$i]['modultype'];
+				$equalEPSG = $wfsMatrix[$i]['featuretype_srs'];
+                       		$isEqual = true;
+				//control if EPSG is supported by Client
+		        	if ($equalEPSG == $this->searchEPSG){
+					$isEqual = false;		
+		        	}	
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->srsProblem = $isEqual;
+				//generate Link to show metadata
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->mdLink = "http://".$this->hostName."/mapbender/x_geoportal/showWFSConfMetadata.php?id=".$wfsMatrix[$i]['wfs_conf_id'];
+				$perText = $this->getPermissionValueForWFS($wfsMatrix[$i]['wfs_id'], $wfsMatrix[$i]['wfs_conf_id']);
+				$this->wfsJSON->wfs->srv[$i-$j]->ftype[$l-$m]->modul[$m]->permission = $perText;
+				if ($wfsMatrix[$i]['wfs_id'] == $wfsMatrix[$i+1]['wfs_id']){
+					$j++; //next record is the same service
+					$l++;	
+				}
+				else
+				{
+					$l = 0;
+				}
 
+				if ($wfsMatrix[$i]['featuretype_id'] == $wfsMatrix[$i+1]['featuretype_id']){
+					$m++;
+				}
+				else
+				{
+					$m = 0;
+				}		
+			}
+			
+	}
+	private function generateWMCMetadataJSON($res, $n) {
+		//initialize object
+		$this->wmcJSON = new stdClass;
+		$this->wmcJSON->wmc = (object) array(
+				'md' => (object) array(
+					'nresults' => $n, 
+					'p' => $this->searchPages,
+					'rpp' => $this->maxResults
+					),
+				'srv' => array()
+				);
+			
+		//read out records
+		$serverCount = 0;
+		$wmcMatrix = db_fetch_all($res);
+		//sort result for accessing the right services
+		$wmcMatrix = $this->flipDiagonally($wmcMatrix);
+		//TODO check if order by db or order by php is faster! 
+		#array_multisort($wfsMatrix['wfs_id'], SORT_ASC,$wfsMatrix['featuretype_id'], SORT_ASC,$wfsMatrix['wfs_conf_id'], SORT_ASC); //have some problems - the database version is more stable
+		#print_r($wfsMatrix);
+		$wmcMatrix = $this->flipDiagonally($wmcMatrix);
+		//read out first server entry - maybe this a little bit timeconsuming TODO
+		for($i=0; $i<count($wmcMatrix);$i++){
+			$this->wmcJSON->wmc->srv[$i]->id = $wmcMatrix[$i]['wmc_id'];
+			$this->wmcJSON->wmc->srv[$i]->title = $wmcMatrix[$i]['wmc_title'];
+			$this->wmcJSON->wmc->srv[$i]->abstract = $wmcMatrix[$i]['abstract'];
+			$this->wmcJSON->wmc->srv[$i]->date = date("d.m.Y",$wmcMatrix[$i]['wmc_timestamp']);
+			$this->wmcJSON->wmc->srv[$i]->respOrg = $wmcMatrix[$i]['mb_group_name'];
+			$this->wmcJSON->wmc->srv[$i]->mdLink = "http://".$this->hostName."/mapbender/x_geoportal/showWMCMetadata.php?id=".$wmcMatrix[$i]['wmc_id'];
+			$spatialSource = "";
+			$stateOrProvince = $wmcMatrix[$i]['mb_group_stateorprovince']; 
+			if ($stateOrProvince == "NULL" || $stateOrProvince == "") {
+				$spatialSource = $wmcMatrix[$i]['mb_group_country'];
+			} else {
+				$spatialSource = $wmcMatrix[$i]['mb_group_stateorprovince'];
+			}
+			$this->wmcJSON->wmc->srv[$i-$j]->iso3166 = $spatialSource;
+				
+			$this->wmcJSON->wmc->srv[$i-$j]->bbox = array($wmcMatrix[$i]['bbox']); //TODO: read out bbox from wmc $wmcMatrix[$i][''];
 
+			#$equalEPSG = $wmcMatrix[$i]['srs'];
+                       	#$isEqual = true;
+			//control if EPSG is supported by Client
+		        #if ($equalEPSG == $this->searchEPSG){
+			#	$isEqual = false;		
+		        #}	
+				
+		}
+			
+	}
 
-#$searchResources = array('wms','wfs','wmc','georss');
-#$searchPages = array(1,1,1,1);
 
-//TODO: if class is called directly
 
 
 
+	private function generateWMSMetadataJSON($res, $n) {
+		//initialize object
+		$this->wmsJSON = new stdClass;
+		$this->wmsJSON->wms = (object) array(
+				'md' => (object) array(
+					'nresults' => $n, 
+					'p' => $this->searchPages,
+					'rpp' => $this->maxResults
+					),
+				'srv' => array()
+				);
+		//read out records
+		$serverCount = 0;
+		$wmsMatrix = db_fetch_all($res);
+		$layerIdArray = array();
+		//read out array with unique wms_ids in wmsMatrix
+		$wmsIdArray = array();
+		//initialize root layer id;
+		$rootLayerId = -1;
+		$j = 0;
+		//get array with all available layer_id for this user:
+ 		$admin = new administration();
+		$this->accessableLayers = $admin->getLayersByPermission($this->userId);
+		#echo "<br>user_id: ".$this->userId."<br><br>";
+		#var_dump($this->accessableLayers);
+		#echo "<br>";
+		
+		#$countWmsMatrix = count($wmsMatrix);
+		#echo $countWmsMatrix;
+		if ($n != 0) {
+		for($i=0; $i<count($wmsMatrix);$i++){				
+			$layerID = $wmsMatrix[$i]['layer_id'];
+			#echo "<br>LayerID: ".$layerID."<br>";	
+			#$wmsID = $wmsMatrix[$i]['wms_id']; //get first wms id - in the next loop - dont get second, but some else!
+			if (!in_array($layerID, $layerIdArray) or !in_array($rootLayerId, $layerIdArray)) {
+				$wmsID = $wmsMatrix[$i]['wms_id']; //get first wms id - in the next loop - dont get second, but some else!
+				//Select all layers of with this wms_id into new array per WMS - the grouping should be done by wms!
+				$subLayers = $this->filter_by_value($wmsMatrix, 'wms_id', $wmsID);
+				#echo "<br>wms_id: ".$wmsID."<br>";
+				#echo "<br>Number of sublayers: <br>";
+				#print(count($subLayers));
+				//Sort array by load_count - problem: maybe there are some groups between where count is to low (they have no load count because you cannot load them by name)? - Therefor we need some ideas - or pull them out of the database and show them greyed out. Another way will be to define a new group (or wms with the same id) for those layers which are more than one integer away from their parents
+				$subLayersFlip = $this->flipDiagonally($subLayers);
+				#var_dump($subLayers['layer_pos']);
+				#$subLayers = $this->flipDiagonally($subLayers);
+				//go backwards through the layerTree to get the layer with the highest position without gaps in between
+				#var_dump($subLayers['layer_id']);
+				#echo "<br>";
+				$index = array_search($layerID, $subLayersFlip['layer_id']);
+				#echo "<br>found layer_id= ".$layerID." at index: ".$index." in sublayerstable layer_pos=".$subLayers[$index]['layer_pos']." <br>";
+				
+				#echo "<br>sublayers: ";
+				#var_dump($subLayersFlip);
+				#echo "<br>";
+				$rootIndex = $this->getLayerParent($subLayersFlip, $index);
+				$rootLayerPos = $subLayers[$rootIndex]['layer_pos'];
+				$rootLayerId = $subLayers[$rootIndex]['layer_id'];
+				#echo "<br>root layer for this layer: <br>";
+				#echo "<br>id= "..""
+				#echo "<br>";
+				#echo "<br>LayerId:<br>";
+				#echo "<br>".$layerID."<br>";
+				#echo "<br>rootLayerPos:<br>";
+				#echo "<br>".$rootLayerPos."<br>";
+				#echo "<br>rootLayerId:<br>";
+				#echo "<br>".$rootLayerId."<br>";
+				//push root layer id in array
+				array_push($layerIdArray, $rootLayerId);
+				
+				#echo "<br>root Layer ID: ".$rootLayerId."<br>";
+				#array_multisort($subLayers['layer_pos'], SORT_ASC);
+				#print_r($subLayers);
+				#$subLayers = $this->flipDiagonally($subLayers);
+				#print_r("<br>rootIndex: ".$rootIndex."<br>");
+				//Create object for wms service level
+				$this->wmsJSON->wms->srv[$j]->id = (integer)$subLayers[$rootIndex]['wms_id'];
+				$this->wmsJSON->wms->srv[$j]->title = $subLayers[$rootIndex]['wms_title'];
+				$this->wmsJSON->wms->srv[$j]->abstract = $subLayers[$rootIndex]['wms_abstract'];
+				$this->wmsJSON->wms->srv[$j]->date = date("d.m.Y",$subLayers[$rootIndex]['wms_timestamp']);
+				#$this->wmsJSON->wms->srv[$j]->respOrg = "test";
+				$this->wmsJSON->wms->srv[$j]->loadCount = (integer)$subLayers[$rootIndex]['load_count'];
+				#$this->wmsJSON->wms->srv[$j]->mdLink = "http://".$_SERVER['HTTP_HOST']."/mapbender/x_geoportal/mod_layerMetadata.php?id=".(integer)$subLayers[$rootIndex]['layer_id'];
+				
+				$spatialSource = "";
+				$stateOrProvince = $subLayers[$rootIndex]['stateorprovince']; 
+				#echo $stateOrProvince."<br>";
+				if ($stateOrProvince == "NULL" || $stateOrProvince == "") {
+					$spatialSource = $subLayers[$rootIndex]['country'];
+				} else {
+					$spatialSource = $subLayers[$rootIndex]['stateorprovince'];
+				}
+				$this->wmsJSON->wms->srv[$j]->iso3166 = $spatialSource;
+				$this->wmsJSON->wms->srv[$j]->respOrg = $subLayers[$rootIndex]['mb_group_name'];
+				#$this->wmsJSON->wms->srv[$j]->tou = $subLayers[$rootIndex]['termsofuse'];
+				//check if a disclaimer has to be shown and give the relevant symbol
+				list($hasConstraints, $symbolLink) = $this->hasConstraints("wms", $subLayers[$rootIndex]['wms_id']);
+				$this->wmsJSON->wms->srv[$j]->hasConstraints = $hasConstraints;
+				$this->wmsJSON->wms->srv[$j]->symbolLink = $symbolLink;
+				//TODO check the field accessconstraints - which should be presented?
+				$this->wmsJSON->wms->srv[$j]->status = $subLayers[$rootIndex]['status']; //$wmsMatrix[$i][''];
+				$this->wmsJSON->wms->srv[$j]->avail = $subLayers[$rootIndex]['availability']; //$wmsMatrix[$i][''];
 
 
 
+				
+				//get info about defined price
+				if ($subLayers[$rootIndex]['wms_pricevolume'] == '' OR $subLayers[$rootIndex]['wms_pricevolume'] == 0){
+					$this->wmsJSON->wms->srv[$j]->price = NULL;
+				}
+				else {
+					$this->wmsJSON->wms->srv[$j]->price = $subLayers[$rootIndex]['wms_pricevolume'];
+				}
+				//get info about logging of resource
+				if ($subLayers[$rootIndex]['wms_proxylog'] == NULL OR $subLayers[$rootIndex]['wms_proxylog'] == 0){
+					 $this->wmsJSON->wms->srv[$j]->logged = false;
+				}
+				else {
+					 $this->wmsJSON->wms->srv[$j]->logged = true;
+				}
+				//get info about network_accessability
+				if ($subLayers[$rootIndex]['wms_network_access'] == NULL OR $subLayers[$rootIndex]['wms_network_access'] == 0){
+					 $this->wmsJSON->wms->srv[$j]->nwaccess = false;
+				}
+				else {
+					 $this->wmsJSON->wms->srv[$j]->nwaccess = true;
+				}
 
-
-
-
-
-
-if ($resultTarget == 'debug') {
-	echo "<br>DEBUG: searchURL: ".$searchURL."<br>";
-	#echo "<br>DEBUG: languageCode: ".$languageCode."<br>";
-}
-
-
-if ($resultTarget == 'file') {
-	if (!isset($searchResources) OR ($searchResources == "")) {
-		$searchResources = "wms,wfs";
-		$searchPages = "1,1";
+				$this->wmsJSON->wms->srv[$j]->logged = NULL; //$wmsMatrix[$i][''];
+				$this->wmsJSON->wms->srv[$j]->price = NULL; //$wmsMatrix[$i][''];
+				$this->wmsJSON->wms->srv[$j]->nwaccess = NULL; //$wmsMatrix[$i][''];
+				$this->wmsJSON->wms->srv[$j]->bbox = $subLayers[$rootIndex]['bbox']; //$wmsMatrix[$i][''];
+				//Call recursively the child elements, give and pull $layerIdArray to push the done elements in the array to avoid double results
+				#print_r($subLayers);
+				//generate the layer-entry for the so called root layer - maybe this is only a group layer if there is a gap in the layer hierachy
+				$this->wmsJSON->wms->srv[$j]->layer = array();
+				$this->wmsJSON->wms->srv[$j]->layer[0]->id = (integer)$subLayers[$rootIndex]['layer_id'];
+				$this->wmsJSON->wms->srv[$j]->layer[0]->title = $subLayers[$rootIndex]['layer_title'];
+				$this->wmsJSON->wms->srv[$j]->layer[0]->abstract = $subLayers[$rootIndex]['layer_abstract'];
+				$this->wmsJSON->wms->srv[$j]->layer[0]->mdLink = "http://".$this->hostName."/mapbender/x_geoportal/mod_layerMetadata.php?id=".(integer)$subLayers[$rootIndex]['layer_id'];
+				$this->wmsJSON->wms->srv[$j]->layer[0]->previewURL = "http://".$this->hostName."/mapbender/x_geoportal/mod_layerPreview.php?id=".(integer)$subLayers[$rootIndex]['layer_id'];
+				if ($subLayers[$rootIndex]['layer_name'] == ''){
+					$this->wmsJSON->wms->srv[$j]->layer[0]->loadable = 0;
+				}
+				else {
+					$this->wmsJSON->wms->srv[$j]->layer[0]->loadable = 1;
+				}
+				if ($subLayers[$rootIndex]['layer_pos'] == '0'){
+					$this->wmsJSON->wms->srv[$j]->layer[0]->isRoot = true;
+				}
+				else {
+					$this->wmsJSON->wms->srv[$j]->layer[0]->isRoot = false;
+				}
+				//give info for inspire categories - not relevant for other services or instances of mapbender TODO: comment it if the mapbender installation is not used to generate inspire output
+				if ($subLayers[$rootIndex]['md_inspire_cats'] == ''){
+					$this->wmsJSON->wms->srv[$j]->layer[0]->inspire = 0;
+				}
+				else {
+					$this->wmsJSON->wms->srv[$j]->layer[0]->inspire = 1;
+				}
+				//get info about queryable or not
+				if ($subLayers[$rootIndex]['layer_queryable'] == 1){
+					$this->wmsJSON->wms->srv[$j]->layer[0]->queryable = 1;
+				}
+				else {
+					$this->wmsJSON->wms->srv[$j]->layer[0]->queryable = 0;
+				}
+				
+				#if ($subLayers[$rootIndex]['layer_name'] == ''){
+				#	$this->wmsJSON->wms->srv[$i-$j]->layer[0]->loadable = 0;
+				#}
+				#else {
+				#	$this->wmsJSON->wms->srv[$i-$j]->layer[0]->loadable = 1;
+				#}
+				$this->wmsJSON->wms->srv[$j]->layer[0]->loadCount = $subLayers[$rootIndex]['load_count'];
+				#$servObject->layer[$countsublayer]->mdLink = $_SERVER['HOST']."/mapbender/x_geoportal/showWFeatureTypeMetadata.php?id=".$wfsMatrix[$i]['featuretype_id'];
+				#$servObject->layer[$countsublayer]->geomtype = $wfsMatrix[$i]['element_type'];
+				$this->wmsJSON->wms->srv[$j]->layer[0]->bbox = $subLayers[$rootIndex]['bbox'];
+				$this->wmsJSON->wms->srv[$j]->layer[0]->permission = $this->getPermissionValueForLayer($subLayers[$rootIndex]['layer_id'], $subLayers[$rootIndex]['wms_id']); //TODO: Make this much more faster
+				//when the entry for the first server has been written, the server entry is fixed and the next one will be a new server or a part of the old one.
+				 //increment server (highest object id)
+				
+				$layerIdArray = $this->writeWMSChilds($layerIdArray, $rootLayerPos, $subLayers, $this->wmsJSON->wms->srv[$j]->layer[0]);
+				$j++;
+				//generate php object - if root layer was found - > layer_parent='' give hint to visualize folder symbol. 		
+				}
+			}
+		}			
 	}
 
-}
-if ($resultTarget == 'web' or $resultTarget == 'debug') {
-	if (!isset($searchResources) OR ($searchResources == "")) {
-		$searchResources = "wms";
-		$searchPages = "1";
+	private function generateWMSMetadata($xmlDoc) {
+		$starttime = $this->microtime_float();
+		list($sql, $v, $t, $n) = $this->generateSearchSQL();
+		//call database search in limits
+		$res = db_prep_query($sql, $v, $t);
+		if ($this->outputFormat == 'json'){
+			//generate json
+			$this->generateWMSMetadataJSON($res,$n);
+			$usedTime = $this->microtime_float() - $starttime;
+			//put in the time to generate the data
+			$this->wmsJSON->wms->md->genTime = $usedTime;
+			$this->wmsJSON = $this->json->encode($this->wmsJSON);
+			if ($this->resultTarget == 'file') {
+				if($wmsFileHandle = fopen($this->tempFolder."/".$this->searchId."_".$this->searchResources."_".$this->searchPages.".json","w")){
+					fwrite($wmsFileHandle,$this->wmsJSON);
+					fclose($wmsFileHandle);
+				}
+			}
+			if ($this->resultTarget == 'web' or $this->resultTarget == 'debug') {
+				echo $this->wmsJSON;
+			}
+		}
+		$usedTime2 = $this->microtime_float() - $starttime;
+		//echo "<br>used time: ".$usedTime."<br>";
+		$e = new mb_exception("Time to generate WMS-Metadata: ".$usedTime2);
+		$e = new mb_exception("Wrote the MD_WMS-File");
 	}
 
-}
 
-//convert the respources and the pagenumbers into arrays
-$searchResources = explode(",",$searchResources);
-$searchPages = explode(",",$searchPages);
 
-//Generate search filter file. This file holds the defined search filter to allow the user to see how he searched 
-//The user should become the possibility to drop the search filters by clicking in some buttons
-//list of options to display:
-//searchText (textfields) - dropping only if more than one text is given
-//registratingDepartments (list) - dropping allowed - maybe give a webservice for mb_group data
-//isoCategories - dropping allowed
-//inspireThemes - dropping allowed
-//customCategories - dropping allowed
-//bbox (show) - dropping allowed
-//regTimeBegin - dropping allowed
-//regTimeEnd -dropping allowed
-//the idea is, to rewrite the searchURL directly and then have another url for the special case!
-//we have to get the searchURL as a parameter for this wrapper cause the class_metadata should give filters for the found categories
-//use regular expressions to do this!
-
-//define internationalization
-//searchText
-//registratingDepartments
-//bbox
-
-//generate query json:
-//some objects like names of categories and other objects have to be pulled of the database. Maybe a webservice is the better way? But now there are no webservices - therefor: pull the names out of the database into arrays - only those who are requested:
-
-//function to get the information about the registrating departments (mb_groups) out of the mapbender database
-function get_registratingDepartmentsArray($departmentIds,$languageCode) {
-			$sql = "SELECT mb_group_id, mb_group_name FROM mb_group WHERE mb_group_id IN (";
-			$v = array();
-			$t = array();
-			$departmentsArray = array();
-			for($i=0; $i<count($departmentIds);$i++){
-				if($i > 0){$sql .= ",";}
-				$sql .= "$".strval($i+1);
-				array_push($v,$departmentIds[$i]);
-				array_push($t,"i");
+	private function generateWFSMetadata($xmlDoc) {
+		$starttime = $this->microtime_float();
+		list($sql, $v, $t, $n) = $this->generateSearchSQL();
+		//call database search
+		$res = db_prep_query($sql, $v, $t);
+		if ($this->outputFormat == 'json'){
+			//generate json
+			$this->generateWFSMetadataJSON($res, $n);
+			$usedTime = $this->microtime_float() - $starttime;
+			//put in the time to generate the data
+			$this->wfsJSON->wfs->md->genTime = $usedTime;
+			$this->wfsJSON = $this->json->encode($this->wfsJSON);
+			if ($this->resultTarget == 'file') {
+				if($wfsFileHandle = fopen($this->tempFolder."/".$this->searchId."_".$this->searchResources."_".$this->searchPages.".json","w")){
+					fwrite($wfsFileHandle,$this->wfsJSON);
+					fclose($wfsFileHandle);
+				}
 			}
-			$sql .= ")";
-			$res = db_prep_query($sql,$v,$t);
-			$countDepArray = 0;
-			while($row = db_fetch_array($res)){
-				$departmentsArray[$countDepArray]["id"] = $row["mb_group_id"];
-				$departmentsArray[$countDepArray]["name"] = $row["mb_group_name"];
-				$departmentsArray[$countDepArray]["showScript"] = "../php/mod_showRegistratingGroup.php?";
-				$countDepArray = $countDepArray + 1; 
+			if ($this->resultTarget == 'web'or $this->resultTarget == 'debug') {
+				echo $this->wfsJSON;
 			}
-			return $departmentsArray;
 		}
-
-//get the information about the requested isoCategories
-function get_isoCategoriesArray($isoCategoryIds,$languageCode) {
-			
-			$sql = "SELECT md_topic_category_id, md_topic_category_code_".$languageCode;
-			#$e = new mb_exception("php/mod_callMetadata.php: language code: ".$languageCode);
-			$sql .= " FROM md_topic_category WHERE md_topic_category_id IN (";
-			$v = array();
-			$t = array();
-			$isoCategoryArray = array();
-			for($i=0; $i<count($isoCategoryIds);$i++){
-				if($i > 0){$sql .= ",";}
-				$sql .= "$".strval($i+1);
-				array_push($v,$isoCategoryIds[$i]);
-				array_push($t,"i");
+		if ($this->outputFormat == 'xml'){
+			//generate xml
+			$this->generateXMLHead($xmlDoc);
+			$this->generateXMLFoot($xmlDoc);
+			$this->generateWFSResultXML($xmlDoc,$res);
+			if ($this->resultTarget == 'file') {
+				if($wfsFileHandleXML = fopen($this->tempFolder."/".$this->searchId."_".$this->searchResources."_".$this->searchPages.".xml","w")){
+					fwrite($wfsFileHandleXML,$xmlDoc->saveXML());
+					fclose($wfsFileHandleXML);
+				}
 			}
-			$sql .= ")";
-			#$e = new mb_exception("php/mod_callMetadata.php: sql for getting topic cats: ".$sql);
-			$res = db_prep_query($sql,$v,$t);
-			$countIsoArray = 0;
-			while($row = db_fetch_array($res)){
-				$isoCategoryArray[$countIsoArray]["id"] = $row["md_topic_category_id"];
-				$isoCategoryArray[$countIsoArray]["name"] = $row["md_topic_category_code_".$languageCode];
-				$countIsoArray = $countDepArray + 1; 
+			if ($this->resultTarget == 'web') {
+				header("Content-type: application/xhtml+xml; charset=UTF-8");
+				echo $xmlDoc->saveXML();
 			}
-			return $isoCategoryArray;
 		}
-
-//get the information about the inspireThemes
-function get_inspireThemesArray($inspireThemesIds,$languageCode) {
-			$sql = "SELECT inspire_category_id, inspire_category_code_".$languageCode." FROM inspire_category WHERE inspire_category_id IN (";
-			$v = array();
-			$t = array();
-			$inspireCategoryArray = array();
-			for($i=0; $i<count($inspireThemesIds);$i++){
-				if($i > 0){$sql .= ",";}
-				$sql .= "$".strval($i+1);
-				array_push($v,$inspireThemesIds[$i]);
-				array_push($t,"i");
+		
+		$e = new mb_exception("Time to generate WFS-Metadata: ".$usedTime);
+		$e = new mb_exception("Wrote the MD_WFS-File");
+	}
+	private function generateWMCMetadata($xmlDoc) {
+		$starttime = $this->microtime_float();
+		list($sql, $v, $t, $n) = $this->generateSearchSQL();
+		//call database search in limits
+		$res = db_prep_query($sql, $v, $t);
+		if ($this->outputFormat == 'json'){
+			//generate json
+			$this->generateWMCMetadataJSON($res,$n);
+			$usedTime = $this->microtime_float() - $starttime;
+			//put in the time to generate the data
+			$this->wmcJSON->wmc->md->genTime = $usedTime;
+			$this->wmcJSON = $this->json->encode($this->wmcJSON);
+			if ($this->resultTarget == 'file') {
+				if($wmcFileHandle = fopen($this->tempFolder."/".$this->searchId."_".$this->searchResources."_".$this->searchPages.".json","w")){
+					fwrite($wmcFileHandle,$this->wmcJSON);
+					fclose($wmcFileHandle);
+				}
 			}
-			$sql .= ")";
-			$e = new mb_exception("php/mod_callMetadata.php: sql for getting inspire cats: ".$sql);
-			$res = db_prep_query($sql,$v,$t);
-			$countInspireArray = 0;
-			while($row = db_fetch_array($res)){
-				$inspireCategoryArray[$countInspireArray]["id"] = $row["inspire_category_id"];
-				$inspireCategoryArray[$countInspireArray]["name"] = $row["inspire_category_code_".$languageCode];
-				$countInspireArray = $countInspireArray + 1; 
+			if ($this->resultTarget == 'web' or $this->resultTarget == 'debug') {
+				echo $this->wmcJSON;
 			}
-			return $inspireCategoryArray;
 		}
+		$usedTime2 = $this->microtime_float() - $starttime;
+		//echo "<br>used time: ".$usedTime."<br>";
+		$e = new mb_exception("Time to generate WMC-Metadata: ".$usedTime2);
+		$e = new mb_exception("Wrote the MD_WMC-File");
+	}
 
-function get_customCategoriesArray($customCategoriesIds,$languageCode) {
-			$sql = "SELECT custom_category_id, custom_category_code_".$languageCode." FROM custom_category WHERE custom_category_id IN (";
-			$v = array();
-			$t = array();
-			$customCategoryArray = array();
-			for($i=0; $i<count($customCategoriesIds);$i++){
-				if($i > 0){$sql .= ",";}
-				$sql .= "$".strval($i+1);
-				array_push($v,$customCategoriesIds[$i]);
-				array_push($t,"i");
-			}
-			$sql .= ")";
-			$e = new mb_exception("php/mod_callMetadata.php: sql for getting custom cats: ".$sql);
-			$res = db_prep_query($sql,$v,$t);
-			$countCustomArray = 0;
-			while($row = db_fetch_array($res)){
-				$customCategoryArray[$countCustomArray]["id"] = $row["custom_category_id"];
-				$customCategoryArray[$countCustomArray]["name"] = $row["custom_category_code_".$languageCode];
-				$countCustomArray = $countCustomArray + 1; 
-			}
-			return $customCategoryArray;
-		}
 
 
 
 
+	private function replaceChars_all($text){
+		$search = array( "ä",  "ö",  "ü",  "Ä",  "Ö",  "Ü",  "ß");
+		$repWith = array("ae", "oe", "ue", "AE", "OE", "UE", "ss");
+		$replaced = str_replace($search, $repWith, $text);
+		return $replaced;
+	}
+	private function generateSearchSQL() {
+		//elements needed to exist in mb wfs,wms,wmc view or table:
+		//1. textfield - all texts - searchText
+		//2. responsible organisations - given id 
+		//3. bbox - is not explicit given in the wfs metadata? Since WFS 1.1.0 a latlonbbox is present
+		//4. isoTopicCategory - is not been saved til now
+		//5. ...
+		//parse searchText into different array elements to allow an AND search
+		$searchStringArray = $this->generateSearchStringArray();
+		$v = array();
+		$t = array();
+		$sql = "SELECT * from ".$this->searchView." where ";
+		#$sqlN = "SELECT count(".$this->searchResources."_id) from ".$this->searchView." where ";
+		$whereStr = "";
+		$whereCondArray = array();
+		$isTextSearch = "false";
+		$e = new mb_exception("Number of used searchstrings: ".count($searchStringArray));
+		//textsearch
+		if ($this->searchText != NULL) {
+			for($i=0; $i < count($searchStringArray); $i++){
+				$isTextSearch = "true";
+				if($i>0) {
+					$whereStr .= " AND ";
+				}
+				$whereStr .= "searchtext LIKE $".($i+1);
+				//output for debugging
+				$e = new mb_notice("Part of string".$i.": ".$searchStringArray[$i]);
+				$e = new mb_notice("converted: ".$this->replaceChars_all($searchStringArray[$i]));			
+				$va = "%".trim(strtoupper($this->replaceChars_all($searchStringArray[$i])))."%";
+				$e = new mb_notice($this->searchResources." Searchtext in SQL: ".$va);
+				array_push($v,$va);
+				array_push($t,"s");	
+			}
+		}
+/* This is only for the later postgis versions. The within and disjoint is to slow, cause there is no usage of the geometrical index in the old versions!
+		//spatial search filter - ist should be the first filter in the where clause, cause it is 
+		//
+		if (strtolower($this->searchResources) === "wms" & $this->searchBbox != NULL) {
+			#$spatialFilter = "(the_geom ";	
+			#echo "<br> spatial operator: ".$this->searchTypeBbox."<br>";
+			if ($this->searchTypeBbox == 'outside') {
+				$spatialFilter = ' disjoint(';
+			} elseif ($this->searchTypeBbox == 'inside') { 
+				$spatialFilter = ' within(';
+			} else {
+				$spatialFilter = ' intersects(';
+			}
+			//define spatial filter
+			if(count(explode(',',$this->searchBbox)) == 4){   //if searchBbox has 4 entries
+				
+				$spatialFilterCoords = explode(',',$this->searchBbox);//read out searchBbox
+				//definition of the spatial filter
+				$spatialFilter .= 'GeomFromText(\'POLYGON(('.$spatialFilterCoords[0];//minx
+				$spatialFilter .= ' '.$spatialFilterCoords[1].',';//miny
+				$spatialFilter .= $spatialFilterCoords[0];//minx
+				$spatialFilter .= ' '.$spatialFilterCoords[3].',';//maxy
+				$spatialFilter .= $spatialFilterCoords[2];//maxx
+				$spatialFilter .= ' '.$spatialFilterCoords[3].',';//maxy
+				$spatialFilter .= $spatialFilterCoords[2];//maxx
+				$spatialFilter .= ' '.$spatialFilterCoords[1].',';//miny
+				$spatialFilter .= $spatialFilterCoords[0];//minx
+				$spatialFilter .= ' '.$spatialFilterCoords[1].'))\',4326)';//miny
+				$spatialFilter .= ",the_geom)";
+				array_push($whereCondArray, $spatialFilter);
+			}
+			#array_push($whereCondArray, $spatialFilter);
+		}
+*/	
+		//spatial search filter - ist should be the first filter in the where clause, cause it is 
+		//
+		if ((strtolower($this->searchResources) === "wms" or strtolower($this->searchResources) === "wmc") & $this->searchBbox != NULL) {
+			#$spatialFilter = "(the_geom ";	
+			#echo "<br> spatial operator: ".$this->searchTypeBbox."<br>";
+			#if ($this->searchTypeBbox == 'outside') {
+			#	$spatialFilter = ' disjoint(';
+			#} elseif ($this->searchTypeBbox == 'inside') { 
+			#	$spatialFilter = ' within(';
+			#} else {
+			#	$spatialFilter = ' intersects(';
+			#}
+			$spatialFilter = ' the_geom && ';
+			//define spatial filter
+			if(count(explode(',',$this->searchBbox)) == 4){   //if searchBbox has 4 entries
+				
+				$spatialFilterCoords = explode(',',$this->searchBbox);//read out searchBbox
+				//definition of the spatial filter
+				$spatialFilter .= 'GeomFromText(\'POLYGON(('.$spatialFilterCoords[0];//minx
+				$spatialFilter .= ' '.$spatialFilterCoords[1].',';//miny
+				$spatialFilter .= $spatialFilterCoords[0];//minx
+				$spatialFilter .= ' '.$spatialFilterCoords[3].',';//maxy
+				$spatialFilter .= $spatialFilterCoords[2];//maxx
+				$spatialFilter .= ' '.$spatialFilterCoords[3].',';//maxy
+				$spatialFilter .= $spatialFilterCoords[2];//maxx
+				$spatialFilter .= ' '.$spatialFilterCoords[1].',';//miny
+				$spatialFilter .= $spatialFilterCoords[0];//minx
+				$spatialFilter .= ' '.$spatialFilterCoords[1].'))\',4326)';//miny
+				#$spatialFilter .= ",the_geom)";
+				array_push($whereCondArray, $spatialFilter);
+			}
+			#array_push($whereCondArray, $spatialFilter);
+		}	
 
 
 
-//define where to become the information from - this is relavant for the information which must be pulled out of the database
-$classificationElements = array();
 
 
+		//search filter for md_topic_categories
+		//
+		if ((strtolower($this->searchResources) === "wms" or strtolower($this->searchResources) === "wmc") & $this->isoCategories != NULL) {
+			
+			$isoArray = explode(',',$this->isoCategories);
+			$topicCond = "(";
+			for($i=0; $i < count($isoArray); $i++){
+				if ($i == 0) {
+					$topicCond .= "(md_topic_cats LIKE '%{".$isoArray[$i]."}%') ";			
+				} else {
+					$topicCond .= "AND (md_topic_cats LIKE '%{".$isoArray[$i]."}%') ";
+				}
+			}
+			$topicCond .= ")";
+			array_push($whereCondArray, $topicCond);
+		}
+		//search filter for inspire_categories
+		//
+		if (strtolower($this->searchResources) === "wms" & $this->inspireThemes != NULL) {
+			
+			$inspireArray = explode(',',$this->inspireThemes);
+			$inspireCond = "(";
+			for($i=0; $i < count($inspireArray); $i++){
+				if ($i == 0) {
+					$inspireCond .= "(md_inspire_cats LIKE '%{".$inspireArray[$i]."}%') ";			
+				} else {
+					$inspireCond .= "AND (md_inspire_cats LIKE '%{".$inspireArray[$i]."}%') ";
+				}
+			}
+			$inspireCond .= ")";
+			array_push($whereCondArray, $inspireCond);
+		}
+		//search filter for custom_categories
+		//
+		if (strtolower($this->searchResources) === "wms" & $this->customCategories != NULL) {
+			
+			$customArray = explode(',',$this->customCategories);
+			$customCond = "(";
+			for($i=0; $i < count($customArray); $i++){
+				if ($i == 0) {
+					$customCond .= "(md_custom_cats LIKE '%{".$customArray[$i]."}%') ";			
+				} else {
+					$customCond .= "AND (md_custom_cats LIKE '%{".$customArray[$i]."}%') ";
+				}
+			}
+			$customCond .= ")";
+			array_push($whereCondArray, $customCond);
+		}
+		
 
 
+		//date condition
+		//if begin and end are set
+		//echo "<br> regTimeBegin: ".$this-> regTimeBegin." regTimeEnd: ".$this-> regTimeEnd."<br>";
+		
+		if ($this->regTimeBegin != NULL && $this->regTimeEnd != NULL){
+			$time ="(TO_TIMESTAMP(".$this->searchResources."_timestamp) BETWEEN '".$this->regTimeBegin."' AND '".$this->regTimeEnd."')";
+			array_push($whereCondArray, $time);
+			//only begin is set		
+		}
+		if ($this->regTimeBegin != NULL && $this->regTimeEnd == NULL){
+			$time ="(TO_TIMESTAMP(".$this->searchResources."_timestamp) > '".$this->regTimeBegin."')";
+			array_push($whereCondArray, $time);
+		}
+		if ($this->regTimeBegin == NULL && $this->regTimeEnd != NULL){
+			$time ="(TO_TIMESTAMP(".$this->searchResources."_timestamp) < '".$this->regTimeEnd."')";
+			array_push($whereCondArray, $time);
+		}
 
-$classificationElements[0]['name'] = 'searchText';
-$classificationElements[1]['name'] = 'registratingDepartments';
-$classificationElements[2]['name'] = 'isoCategories';
-$classificationElements[3]['name'] = 'inspireThemes';
-$classificationElements[4]['name'] = 'customCategories';
-$classificationElements[5]['name'] = 'searchBbox';
-$classificationElements[6]['name'] = 'regTimeBegin';
-$classificationElements[7]['name'] = 'regTimeEnd';
+ 
+		//department condition
+		//TODO: generate filter for new sql check if at least some department is requested
+		//generate array
+		//$this->registratingDepartments = explode(',',$this->registratingDepartments);
+		#if(count($this->registratingDepartments) > 0 & $this->registratingDepartments){
+		if($this->registratingDepartments != NULL){		
+			$dep = " department IN (".$this->registratingDepartments.") ";
+			array_push($whereCondArray, $dep);	
+		}
+		// Creating the WHERE clause, based on a array
+		if(count($whereCondArray) > 0){
+			$txt_whereCond = "";
+			for ($index = 0; $index < sizeof($whereCondArray); $index++) {
+				$array_element = $whereCondArray[$index];
+				if($isTextSearch == "true") {
+					$txt_whereCond .= " AND ".$array_element;
+				} else {
+					if($index>0){
+					$txt_whereCond .= " AND ".$array_element;		
+					} else {
+						$txt_whereCond .= " ".$array_element;	
+					}	
+				}
+			}
+			$whereStr .= $txt_whereCond;
+		}
+		//Add WHERE condition to search
+		$sql .= $whereStr;
+		//TODO ORDER BY in SQL - not necessary for counting things:
+		$sql .= $this->orderBy;
+		//Calculate Paging for OFFSET and LIMIT values:
+		$offset = ((integer)$this->maxResults) * ((integer)$this->searchPages -1);
+		$limit = (integer)$this->maxResults;
+		//defining range for paging
+		$sql .= " LIMIT ".$limit." OFFSET ".$offset."";
+		//Print out search SQL term
+		$e = new mb_exception("class_metadata.php: Search => SQL-Request of ".$this->searchResources." service metadata: ".$sql."");
+		//parameter: searchId -> can be used global, searchResources -> is only one type per instance!!-> global,which categories -> can be defined global! $whereStr
+		$n = $this->writeCategories($whereStr, $v, $t); 
+		//write counts to filesystem to avoid to many database connections
+		//only write them, if searchId is given - problem: searches with same searchId's maybe get wrong information
+		return array($sql, $v, $t, $n);
+	}
 
-$classificationElements[0]['source'] = '';
-$classificationElements[1]['source'] = 'database';
-$classificationElements[2]['source'] = 'database';
-$classificationElements[3]['source'] = 'database';
-$classificationElements[4]['source'] = 'database';
-$classificationElements[5]['source'] = '';
-$classificationElements[6]['source'] = '';
-$classificationElements[7]['source'] = '';
+	private function writeCategories($whereStr, $v, $t) {
+		//generate count sql
+		//generate count of all entries	
+		$sqlN = "SELECT count(".$this->searchResources."_id) from ".$this->searchView." where ";
+		$sqlN .= $whereStr;
+		//Get total number of results 
+		$count = db_prep_query($sqlN, $v, $t);
+		$n = db_fetch_all($count);
+		#echo "<br>N: ".var_dump($n)."<br>";
+		$n = $n[0]['count'];
+		$e = new mb_notice("class_metadata.php: Search => SQL-Request of ".$this->searchResources." service metadata N: ".$sqlN." Number of found objects: ".$n);
+		if ($this->searchId != 'dummysearch') { //searchId is not the default id! - it has been explicitly defined 
+			//check if cat file already exists:
+			//filename to search for:
+			$filename = $this->tempFolder."/".$this->searchId."_".$this->searchResources."_cat.json";
+			if (!file_exists($filename) or $this->resultTarget == 'debug') { //TODO at the moment the cat file will be overwritten - change this in production system
+				//open category file for wfs results
+				$this->catJSON = new stdClass;
+				$this->catJSON->searchMD = (object) array(
+					'searchId' => $this->searchId,
+					'n' => $n
+					);
+				//generate the list of category counts
+				$sqlCat = array();
+				//check if categories are defined for the resource
+				if ($this->resourceClasses != NULL) {
+					$this->catJSON->searchMD->category = array();
+					for ($i = 0; $i < count($this->resourceClasses); $i++) {
+						//TODO: not to set the classification?
+						$this->catJSON->searchMD->category[$i]->title = $this->resourceClassifications[$i]['title'];
+						$sqlCat[$i] = "SELECT ".$this->resourceClassifications[$i]['tablename'];
+						$sqlCat[$i] .= ".".$this->resourceClassifications[$i]['tablename']."_id, ";
+						$sqlCat[$i] .= " ".$this->resourceClassifications[$i]['tablename'].".";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_code_";
+						$sqlCat[$i] .= $this->languageCode.", COUNT(*) FROM ".$this->searchView;
+						
+						//first join for connection table
+						$sqlCat[$i] .= " INNER JOIN ".$this->resourceClassifications[$i]['relation_'.$this->searchResources];
+						$sqlCat[$i] .= " ON (";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['relation_'.$this->searchResources].".fkey_";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['id_'.$this->searchResources]."=".$this->searchView;
+						$sqlCat[$i] .= ".".$this->resourceClassifications[$i]['id_'.$this->searchResources];
+						$sqlCat[$i] .= ") INNER JOIN ";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']." ON (";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['tablename'].".";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_id=";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['relation_'.$this->searchResources].".fkey_";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_id)";
+						$sqlCat[$i] .= " WHERE ".$whereStr."  GROUP BY ";
 
-$classificationElements[0]['list'] = true;
-$classificationElements[1]['list'] = true;
-$classificationElements[2]['list'] = true;
-$classificationElements[3]['list'] = true;
-$classificationElements[4]['list'] = true;
-$classificationElements[5]['list'] = false;
-$classificationElements[6]['list'] = false;
-$classificationElements[7]['list'] = false;
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['tablename'].".";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_id,";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['tablename'].".";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_code_".$this->languageCode." ORDER BY ";
+						$sqlCat[$i] .= $this->resourceClassifications[$i]['tablename']."_id";
+						$sqlCategory = $sqlCat[$i];
 
-//Defining of the different result categories		
-		$resourceCategories = array();
-		#$resourceCategories[0]['wms'] = 'WMS';
-		#$resourceCategories[1]['wfs'] = 'WFS';
-		#$resourceCategories[2]['wmc'] = 'WMC';
-		#$resourceCategories[3]['georss'] = 'GeoRSS';
-		
+						//call sql for count of category
+						$res = db_prep_query($sqlCategory, $v, $t);
+						$categoryCounts = db_fetch_all($res);
+						//if none found: $categoryCounts=false
+						#echo "<br>count sub categories :".$categoryCounts."<br>";
+						if ($categoryCounts) {
+						//write results in json object
+						if (count($categoryCounts) > 0) {
+							#echo "<br>count main categories".count($categoryCounts)."<br>";
+							#echo "<br>vardump main categories".var_dump($categoryCounts)."<br>";
+							$this->catJSON->searchMD->category[$i]->subcat = array();
+							for ($j = 0; $j < count($categoryCounts); $j++) {
+								$this->catJSON->searchMD->category[$i]->subcat[$j]->id = $categoryCounts[$j][$this->resourceClassifications[$i]['tablename']."_id"];
+								$this->catJSON->searchMD->category[$i]->subcat[$j]->title = $categoryCounts[$j][$this->resourceClassifications[$i]['tablename']."_code_".$this->languageCode];
+								$this->catJSON->searchMD->category[$i]->subcat[$j]->count = $categoryCounts[$j]['count'];
+								//delete requestParam for this category and for id - cause a new search is started from searchURL
+								$filteredSearchString = $this->delTotalFromQuery('searchId',$this->searchURL);
+								//uncomment the following line if a or category search is intended
+								//$filteredSearchString = $this->delTotalFromQuery($this->resourceClassifications[$i]['requestName'],$filteredSearchString);
+								//TODO: maybe adopt this to do a and search and not a or like it is done now
+								//check if category search was requested and rewrite the search url
+								//get the value of the param as string or false if not set!
+								$paramValue = $this->getValueForParam($this->resourceClassifications[$i]['requestName'], $filteredSearchString);
+								$paramValue = urldecode($paramValue);
+								if ($paramValue == false) {
+									//add new category to search
 
-switch($languageCode){
-        case 'de':
-        	$classificationElements[0]['name2show'] = 'Suchbegriff(e):';
-		$classificationElements[1]['name2show'] = 'Anbietende Stelle(n):';
-		$classificationElements[3]['name2show'] = 'INSPIRE Themen:';
-		$classificationElements[2]['name2show'] = 'ISO Kategorien:';
-		$classificationElements[4]['name2show'] = 'RP Kategorien:';
-		$classificationElements[5]['name2show'] = 'Räumliche Einschränkung:';
-		$classificationElements[6]['name2show'] = 'Registrierung/Aktualisierung von:';
-		$classificationElements[7]['name2show'] = 'Registrierung/Aktualisierung bis:';
+								//set filter for this categoryid
+								$filteredSearchString .= "&".$this->resourceClassifications[$i]['requestName']."=".$categoryCounts[$j][$this->resourceClassifications[$i]['tablename']."_id"];
+								
+								
+								} else {
+									//rewrite the searchUrl
+									$filteredSearchString = $this->addToQuery($this->resourceClassifications[$i]['requestName'],$filteredSearchString,$categoryCounts[$j][$this->resourceClassifications[$i]['tablename']."_id"],$paramValue);
+								}
 
-		$resourceCategories['wms'] = 'Darstellungsdienste';
-		$resourceCategories['wfs'] = 'Such- und Downloaddienste';
-		$resourceCategories['wmc'] = 'Kartenzusammenstellungen';
-		$resourceCategories['georss'] = 'Geokodierte Newsfeeds';
+								$this->catJSON->searchMD->category[$i]->subcat[$j]->filterLink = $filteredSearchString;
+							}
+						}
+						} else {
+							#$this->catJSON->searchMD->category[$i]->subcat = array();
+						}
+						$e = new mb_notice("class_metadata: countsql: ".$sqlCat[$i]);
+					}
+				}
 
-		$orderByTitle['header'] = 'Sortierung nach:';
-		$orderByTitle['id'] = 'ID';
-		$orderByTitle['title'] = 'Titel';
-		$orderByTitle['rank'] = 'Relevanz';
+				$this->catJSON = $this->json->encode($this->catJSON);
+				//write categories files only when file is requested and the searchid was not used before!
+				if ($this->resultTarget == 'file') {
+					if($catFileHandle = fopen($filename, "w")){
+						fwrite($catFileHandle,$this->catJSON);
+						fclose($catFileHandle);
+						$e = new mb_notice("class_metadata: new ".$this->searchResources."_class_file created!");
+					} else {
+						$e = new mb_notice("class_metadata: cannot create ".$this->searchResources."_cat_file!");
+					}
+				} 
+				if ($this->resultTarget == 'debug') {
+					echo "<br>DEBUG: show categories: <br>".$this->catJSON."<br><br>";
+				}
+			} else {
+				$e = new mb_exception("class_metadata: ".$this->searchResources."_class_file: ".$filename." already exists - no new one is generated!");				
+			}	
+		} else {
+			if ($this->resultTarget == 'debug') {
+				echo "<br>DEBUG: Standard ID dummysearch was invoked - classifications won't be counted!<br>";
+			}
+			$e = new mb_exception("class_metadata: standard dummysearch was invoked - classifications won't be counted!");	
+		}			
+		return $n;
+	}
 
-	
-       	break;
-        case 'en':
-        	$classificationElements[0]['name2show'] = 'Search Term(s):';
-		$classificationElements[1]['name2show'] = 'Department(s):';
-		$classificationElements[3]['name2show'] = 'INSPIRE Themes:';
-		$classificationElements[2]['name2show'] = 'ISO Topic Categories:';
-		$classificationElements[4]['name2show'] = 'RP Categories:';
-		$classificationElements[5]['name2show'] = 'Spatial Filter:';
-		$classificationElements[6]['name2show'] = 'Registration/Update from:';
-		$classificationElements[7]['name2show'] = 'Registration/Update till:';
 
-		$resourceCategories['wms'] = 'Viewingservices';
-		$resourceCategories['wfs'] = 'Search- and Downloadservices';
-		$resourceCategories['wmc'] = 'Combined Maps';
-		$resourceCategories['georss'] = 'Geocodet Newsfeeds';
 
-		$orderByTitle['header'] = 'Sort by:';
-		$orderByTitle['id'] = 'ID';
-		$orderByTitle['title'] = 'title';
-		$orderByTitle['rank'] = 'relevance';
 
-        break;
-        case 'fr':
-        	$classificationElements[0]['name2show'] = 'Suchbegriff(e):';
-		$classificationElements[1]['name2show'] = 'Anbietende Stelle(n):';
-		$classificationElements[3]['name2show'] = 'INSPIRE Themen:';
-		$classificationElements[2]['name2show'] = 'ISO Kategorien:';
-		$classificationElements[4]['name2show'] = 'RP Kategorien:';
-		$classificationElements[5]['name2show'] = 'Räumliche Einschränkung:';
-		$classificationElements[6]['name2show'] = 'Registrierung/Aktualisierung von:';
-		$classificationElements[7]['name2show'] = 'Registrierung/Aktualisierung bis:';
+	private function generateWFSResultXML($wfsDoc, $res) {
+		$c = $this->wfsDoc->createElement("category");
+		$results = $this->wfsDoc->getElementsByTagName("result");
+		foreach ($results as $result) {
+			$result->appendChild($c);
+			$c->setAttribute('name', "WFS");
+			$c->setAttribute('count', "0");
+		}
+		$i = 0;
+		while($row = db_fetch_array($res)){
+			$m = $this->wfsDoc->createElement('member');
+			$m->setAttribute('wfs_id', $row['wfs_id']);
+			$m->setAttribute('layer_pos', "");
+			$c->appendChild($m);	 // member categorie 1 (first member)
+			// epsg - TODO adopt
+			$epsg = $this->wfsDoc->createElement('epsg');
+			$m->appendChild($epsg);	
+			$equalEPSG = $row['featuretype_srs'];
+                       	$isequal = "false";
+		        if ($equalEPSG == $this->search_epsg){
+				$isequal = "true";		
+		        }	
+		       	//Insert end
+			$epsg_text = $this->wfsDoc->createTextNode($isequal);
+			$epsg->appendChild($epsg_text);
+			// country codes
+			$state = $this->wfsDoc->createElement('federalstate');
+			$m->appendChild($state);
+			$spatialSource = "";
+			$stateorprovince = $row['administrativearea']; 
+			if ($stateorprovince == "NULL" || $stateorprovince == "") {
+				$spatialSource = $row['country'];
+			} else {
+				$spatialSource = $row['administrativearea'];
+			}
+			$countr_code_text = $this->wfsDoc->createTextNode($spatialSource);
+			$state->appendChild($countr_code_text);
+			//type
+			$type = $this->wfsDoc->createElement('type');
+			$m->appendChild($type);
+			$ttype = $this->wfsDoc->createTextNode("wfs");
+			$type->appendChild($ttype);
+                        //wfs_id
+			$wfsid = $this->wfsDoc->createElement('wfs_id');
+			$m->appendChild($wfsid);
+			$twfsid = $this->wfsDoc->createTextNode($row['wfs_id']);
+			$wfsid->appendChild($twfsid);
+			//id
+			$id = $this->wfsDoc->createElement('featuretype_id');
+			$m->appendChild($id);
+			$tid = $this->wfsDoc->createTextNode($row['featuretype_id']);
+			$id->appendChild($tid);
+			//title
+			$title = $this->wfsDoc->createElement('featuretype_title');
+			$m->appendChild($title);
+			$ttitle = $this->wfsDoc->createTextNode($row['featuretype_title']);
+			$title->appendChild($ttitle);
+			//abstract
+			$abst = $this->wfsDoc->createElement('featuretype_abstract');
+			$m->appendChild($abst);  
+			$tabst = $this->wfsDoc->createTextNode($row['featuretype_abstract']);
+			$abst->appendChild($tabst);
+			// accesscontraints				
+			$ac = $this->wfsDoc->createElement('accessconstraints');
+			$m->appendChild($ac);	
+//			$myac = $this->getAccessConstraints($this->cat[$i]['member'][$ii]['wms_id'], $this->cat[$i]['member'][$ii]['accessconstraints'], $this->cat[$i]['member'][$ii]['layer_id']);				
+			$myac = $this->wfsDoc->createTextNode($row['accessconstraints']);							
+			$ac->appendChild($myac);
+			// termsofuse				
+			$ter = $this->wfsDoc->createElement('termsofuse');
+			$m->appendChild($ter);
+			$myter =  $this->wfsDoc->createTextNode($row['termsofuse']);				
+			$ter->appendChild($myter);
+			//date
+			$date = $this->wfsDoc->createElement('date');
+			$m->appendChild($date);
+			$tdate = $this->wfsDoc->createTextNode(date("d.m.Y",$row['wfs_timestamp']));
+			$date->appendChild($tdate);	
+			// Geomtype
+			$geo = $this->wfsDoc->createElement('geomtype');
+			$m->appendChild($geo);
+			//$geo_text = $this->getGeoType($row['wfs_id'], $row['featuretype_id']);
+			$geo_text = $this->wfsDoc->createTextNode($row['element_type']);
+			//$ge =  $this->wfsDoc->createTextNode($geo_text);
+			$geo->appendChild($geo_text);
+			//department
+			$dm = $this->wfsDoc->createElement('department');
+			$m->appendChild($dm);
+			$tdm = $this->wfsDoc->createTextNode($row['mb_group_name']);
+			$dm->appendChild($tdm);
+			//permission  		 Leseberechtigung des Benutzers(true), sonst Email zur Beantragung(email)
+			$per = $this->wfsDoc->createElement('permission');
+			$m->appendChild($per);
+			$per_text = $this->getPermissionValueForWFS($row['wfs_id'], $row['wfs_conf_id']);
+			$pe =  $this->wfsDoc->createTextNode($per_text);
+			$per->appendChild($pe);
+			//wfs_conf_id
+			$conf_id = $this->wfsDoc->createElement('wfs_conf_id');
+			$m->appendChild($conf_id);
+			$c_id = $this->wfsDoc->createTextNode($row['wfs_conf_id']);
+			$conf_id->appendChild($c_id);
+			//wfs_conf_title
+			$conf_title = $this->wfsDoc->createElement('wfs_conf_title');
+			$m->appendChild($conf_title);
+			$conf_title_text = $this->wfsDoc->createTextNode($row['wfs_conf_abstract']);
+			$conf_title->appendChild($conf_title_text);
+			//wfs_conf_abstract
+			$conf_abstract = $this->wfsDoc->createElement('wfs_conf_abstract');
+			$m->appendChild($conf_abstract);
+			$c_abstract = $this->wfsDoc->createTextNode($row['wfs_conf_description']);
+			$conf_abstract->appendChild($c_abstract);
+			//wfs_conf_modul
+			$conf_modul = $this->wfsDoc->createElement('wfs_conf_modul');
+			$m->appendChild($conf_modul);
+			$c_modul = $this->wfsDoc->createTextNode($row['modultype']);
+			$conf_modul->appendChild($c_modul);
+			$i++;
+		}
+		$c->setAttribute('count', $i);
+	}
 
-		$resourceCategories['wms'] = 'Viewingservices';
-		$resourceCategories['wfs'] = 'Search- and Downloadservices';
-		$resourceCategories['wmc'] = 'Combined Maps';
-		$resourceCategories['georss'] = 'Geocodet Newsfeeds';
+	private function getPermissionValueForWFS($wfs_id, $wfs_conf_id){
+		//TODO: Set Email of owner into view for ressource - so it don't have to be searched?
+		$return_permission = "";
+		//get permission
+		$admin = new administration();
+		$myWFSconfs = $admin->getWfsConfByPermission($this->userId);
+		$this->myWFSConfs = $myWFSconfs;
+		for ($index = 0; $index < sizeof($this->myWFSConfs); $index++) {
+			$array_element = $this->myWFSConfs[$index];
+		}
+		if (in_array($wfs_conf_id, $this->myWFSConfs)){
+			$return_permission = "true";
+		} else {
+			$sql = "SELECT wfs.wfs_id, mb_user.mb_user_email as email FROM wfs, mb_user where wfs.wfs_owner=mb_user.mb_user_id "."and wfs.wfs_id=$1";
+			$v = array($wfs_id);
+			$t = array('i');
+			$res = db_prep_query($sql, $v, $t);
+			// get email
+			$mail = "";
+			while($row = db_fetch_array($res)){
+				$mail = $row['email'];
+				$return_permission = $mail; 
+			}
+		}
+		return $return_permission;
+	}
 
-		$orderByTitle['header'] = 'Sort by:';
-		$orderByTitle['id'] = 'identification';
-		$orderByTitle['title'] = 'title';
-		$orderByTitle['rank'] = 'relevance';
+	private function getPermissionValueForLayer($layerId,$wmsId){
+		//TODO: Set Email of owner into view for ressource - so it don't have to be searched?
+		$return_permission="";
+		#$admin = new administration();
+		#$permission = $admin->getLayerPermission($wms_id, $layer_name, $this->userId);
+		#echo "<br>wms_id: ".$wms_id."<br>";
+		#echo "<br>layer_name: ".$layer_name."<br>";
+		#echo "<br>user_id: ".$this->userId."<br>";
+		#echo "<br>Permission: ".$permission."<br>";
+               # var_dump($this->accessableLayers);
+		if (in_array($layerId, $this->accessableLayers)){
+			$return_permission = "true";
+			return $return_permission;
+		} else {
+			$sql = "SELECT mb_user.mb_user_email as email FROM wms, mb_user WHERE wms.wms_owner=mb_user.mb_user_id";
+			$sql .= " AND wms.wms_id=$1";
+			$v = array($wmsId);
+			$t = array('i');
+			$res = db_prep_query($sql, $v, $t);
+			// get email
+			$mail="";
+			while($row = db_fetch_array($res)){
+				$mail = $row['email'];
+				$return_permission = $mail; 
+			}
+		return $return_permission;
+		}
+	}	
 
-       	break;
-     	default:
-        	$classificationElements[0]['name2show'] = 'Suchbegriff(e):';
-		$classificationElements[1]['name2show'] = 'Anbietende Stelle(n):';
-		$classificationElements[3]['name2show'] = 'INSPIRE Themen:';
-		$classificationElements[2]['name2show'] = 'ISO Kategorien:';
-		$classificationElements[4]['name2show'] = 'RP Kategorien:';
-		$classificationElements[5]['name2show'] = 'Räumliche Einschränkung:';
-		$classificationElements[6]['name2show'] = 'Registrierung/Aktualisierung von:';
-		$classificationElements[7]['name2show'] = 'Registrierung/Aktualisierung bis:';
+	
 
-		$resourceCategories['wms'] = 'Darstellungsdienste';
-		$resourceCategories['wfs'] = 'Such- und Downloaddienste';
-		$resourceCategories['wmc'] = 'Kartenzusammenstellungen';
-		$resourceCategories['georss'] = 'Geokodierte Newsfeeds';
+	private function generateSearchStringArray() {
+		//'wfs test array' -> ('wfs' 'test' 'array')
+		$asstr = array();
+		if ($this->searchText != "false"){
+			$asstr = split(",",$this->searchText);	
+		}
+		return $asstr;
+	}			
+		
+	//out of php doc - test if it is faster than normal array_search	
+	private function fast_in_array($elem, $array) {
+   		$top = sizeof($array) -1;
+   		$bot = 0;
+		while($top >= $bot) {
+			$p = floor(($top + $bot) / 2);
+			if ($array[$p] < $elem) $bot = $p + 1;
+			elseif ($array[$p] > $elem) $top = $p - 1;
+			else return TRUE;
+		}
+    	return FALSE;
+	}
+	/*
+	* filtering an array
+	*/
+	private function filter_by_value ($array, $index, $value){
+        	if(is_array($array) && count($array)>0) {
+            		foreach(array_keys($array) as $key){
+                		$temp[$key] = $array[$key][$index];
+                		if ($temp[$key] == $value){
+                    			$newarray[$key] = $array[$key];
+                		}
+           		}
+          	}
+      	return $newarray;
+    	} 
 
-		$orderByTitle['header'] = 'Sortierung nach:';
-		$orderByTitle['id'] = 'ID';
-		$orderByTitle['title'] = 'Titel';
-		$orderByTitle['rank'] = 'Relevanz';
+	//function to get the parent of the given layer by crawling the layertree upwards
+	private function getLayerParent ($layerArray, $index){
+		//only layers of one service should be in $layerArray
+		#$parentExists = false;
+		#var_dump($layerArray);
+		$layerIDKey = $layerArray['layer_id'][$index];	
+		#echo ("layerIDKey= ".$layerIDKey."<br>");
+		$layerParentPos = $layerArray['layer_parent'][$index];//get first parent object position
+		#echo ("layerParentPos= ".$layerParentPos."<br>");
+		#echo("<br>number of sublayers ".count(flipDiagonally($layerArray))."<br>");
+		#echo("<br>size of layerArray['layer_pos']: ".count($layerArray['layer_pos'])."<br>");
+		#var_dump($layerArray['layer_pos']);
+		#echo "<br>flipped layerArray: <br> ";
+		#var_dump(flipDiagonally($layerArray));
+		#echo "<br>";		
 
-}	
-
-$queryJSON = new stdClass;
-$queryJSON->searchFilter = (object) array();
-$queryJSON->searchFilter->origURL = $searchURL;
-#$queryJSON->searchFilter->classes = (object) array();
-for($i=0; $i<count($searchResources);$i++){
-//fill in the different search classes into the filter - the client can generate the headers out of this information
-	$queryJSON->searchFilter->classes[$i]->title = $resourceCategories[$searchResources[$i]];
-	$queryJSON->searchFilter->classes[$i]->name = $searchResources[$i];
-}
-//generate search filter file - if more categories are defined give 
-#echo "<br> number of filter elements: ".count($classificationElements)."<br>";
-for($i=0; $i < count($classificationElements); $i++){
-	if (isset(${$classificationElements[$i]['name']}) & ${$classificationElements[$i]['name']} !='' & ${$classificationElements[$i]['name']} != NULL) {
-		//pull register information out of database in arrays
-		if ($classificationElements[$i]['source'] == 'database') {
-			$funcName = "get_".$classificationElements[$i]['name']."Array";
-			${$classificationElements[$i]['name']."Array"} = $funcName(explode(',',${$classificationElements[$i]['name']}),$languageCode);
+		if ($layerParentPos == '') {
+			//root layer directly found
+			return $index;
 		}
-		$queryJSON->searchFilter->{$classificationElements[$i]['name']}->title = $classificationElements[$i]['name2show'];
-		//check if the filter has subfilters - if not delete the whole filter from query
-		if ($classificationElements[$i]['list'] == false) { //the object has no subsets - like bbox or time filters
-			$queryJSON->searchFilter->{$classificationElements[$i]['name']}->delLink = delTotalFromQuery($classificationElements[$i]['name'],$searchURL);
-		} else {
+		#echo ("layerParentPos= ".$layerParentPos."<br>");
+		//Initialize index of layer parent - first it references the layer itself
+		$layerParentIndex = $index;
+		//loop to search higher parent objects - maybe this can be faster if the loop is not used over all sublayer elements! Do a while loop instead!
+		$highestParentLayerNotFound = true;
+		while ($highestParentLayerNotFound) {
+			#echo("<br>i= ".$i."<br>");
+			#echo("<br>layerParentPosNew= ".$layerParentPos."<br>");
+			$layerParentIndexNew = array_search((string)$layerParentPos, $layerArray['layer_pos']);
+			#echo("<br>layerParentIndexNew= ".$layerParentIndexNew."<br>");
+			if ($layerParentIndexNew != false) {
+				//some parent has been found
+				$layerParentIndex = $layerParentIndexNew;
+				$layerParentPos = $layerArray['layer_parent'][$layerParentIndex];
+				if ($layerParentPos == '') {
+					$highestParentLayerNotFound = false;
+					return $layerParentIndex; //a real root layer was found!
+				}
+				
+				#$layerParentIndex = array_search($layerParentPos, $layerArray['layer_pos']);
+			} else {
+				$highestParentLayerNotFound = false; //no higher layer could be found
+				return $layerParentIndex;
+			}
+		}
+		return $layerParentIndex;  
+    	} 
 
 
-
-			//TODO delete all entries of this main category (not for searchText)
-			if ($classificationElements[$i]['name'] != 'searchText') { 
-				$queryJSON->searchFilter->{$classificationElements[$i]['name']}->delLink = delTotalFromQuery($classificationElements[$i]['name'],$searchURL);
+	//function to write the child elements to the resulting wms object -> object is given by reference
+	private function writeWMSChilds($layerIdArray, $rootLayerPos, $subLayers, &$servObject) {
+		#echo "test";
+		#echo "<br>subLayers:<br>";
+		#var_dump($subLayers);
+		#echo "<br>";
+		$childLayers = $this->filter_by_value($subLayers, 'layer_parent', $rootLayerPos); //the root layer position in the sublayer array was located before. In this step, all layers will be pulled out of sublayer, where root layer position is parent object
+		#echo "<br<childLayers:<br>";
+		#var_dump($childLayers);
+		#echo "<br>";
+		#echo "test";
+		#print_r($childLayers);
+		#print_r($childLayers);
+		$countsublayer = 0;
+		//if child exists create a new layer array for these 
+		if (count($childLayers) != 0) {
+			$servObject->layer = array();
+		}
+		foreach ($childLayers as $child){	
+			#echo "<br>countsublayer: ".$countsublayer."<br>";
+			#echo "<br>Child id: ".$child['layer_id']."<br>";
+			#echo "<br>Child pos: ".$child['layer_pos']."<br>";
+			$servObject->layer[$countsublayer]->id = $child['layer_id'];
+			$servObject->layer[$countsublayer]->title = $child['layer_title'];
+			$servObject->layer[$countsublayer]->abstract = $child['layer_abstract'];
+			$servObject->layer[$countsublayer]->previewURL = "http://".$this->hostName."/mapbender/x_geoportal/mod_layerPreview.php?id=".$child['layer_id'];
+			$servObject->layer[$countsublayer]->mdLink = "http://".$this->hostName."/mapbender/x_geoportal/mod_layerMetadata.php?id=".$child['layer_id'];
+			if ($child['layer_name'] == ''){
+				$servObject->layer[$countsublayer]->loadable = 0;
 			} else {
-				$queryJSON->searchFilter->{$classificationElements[$i]['name']}->delLink = NULL;
+				$servObject->layer[$countsublayer]->loadable = 1;
 			}
-			$queryJSON->searchFilter->{$classificationElements[$i]['name']}->item = array();
-			$queryArray = explode(',',${$classificationElements[$i]['name']});
-			//loop for the subcategories
-			for($j=0; $j < count($queryArray); $j++){
-				if ($classificationElements[$i]['source'] == 'database') {
-					$identArray = ${$classificationElements[$i]['name']."Array"};
-					$identArray = flipDiagonally($identArray);
-					//find searched id in information from database
-					$key = array_search($queryArray[$j], $identArray['id']);
-					if ($key === false) {
-						$queryJSON->searchFilter->{$classificationElements[$i]['name']}->item[$j]->title = "no information found in database";
-					} else {
-						$queryJSON->searchFilter->{$classificationElements[$i]['name']}->item[$j]->title = ${$classificationElements[$i]['name']."Array"}[$key]['name'];
-					}
-				} else {
-					$queryJSON->searchFilter->{$classificationElements[$i]['name']}->item[$j]->title = $queryArray[$j];
-				}
-				//generate links to disable filters on a simple way
-				if ($classificationElements[$i]['name'] === 'searchText' & count(explode(',',${$classificationElements[$i]['name']})) === 1) { 
-					$queryJSON->searchFilter->{$classificationElements[$i]['name']}->item[$j]->delLink = NULL;
-				} else {
-					$newSearchLink = delFromQuery($classificationElements[$i]['name'], $searchURL,$queryArray[$j],$queryArray,${$classificationElements[$i]['name']});
-					$newSearchLink = delTotalFromQuery('searchId',$newSearchLink);
-					$queryJSON->searchFilter->{$classificationElements[$i]['name']}->item[$j]->delLink = $newSearchLink;
-				}
+			//give info for inspire categories - not relevant for other services or instances of mapbender TODO: comment it if the mapbender installation is not used to generate inspire output
+			if ($child['md_inspire_cats'] == ''){
+				$servObject->layer[$countsublayer]->inspire = 0;
 			}
+			else {
+				$servObject->layer[$countsublayer]->inspire = 1;
+			}
+			//get info about queryable or not
+			if ($child['layer_queryable'] == 1){
+				$servObject->layer[$countsublayer]->queryable = 1;
+			}
+			else {
+				$servObject->layer[$countsublayer]->queryable = 0;
+			}
+				
+			$servObject->layer[$countsublayer]->loadCount = $child['load_count'];
+			$servObject->layer[$countsublayer]->bbox = $child['bbox'];
+			$servObject->layer[$countsublayer]->permission = $this->getPermissionValueForLayer($child['layer_id'],$child['wms_id']); //TODO: make this much faster!!!! - is done by collecting all accessable resources once. Maybe this has to be adopted if the count of the resources become higher
+			//call this function itself - search sublayers in the layer object.
+			$layerIdArray = $this->writeWMSChilds($layerIdArray, $child['layer_pos'], $subLayers, $servObject->layer[$countsublayer]);//TODO create a timeout condition !
+			array_push($layerIdArray, $child['layer_id']); //child have been identified and recursively written 
+			#var_dump($layerIdArray);#
+			#echo "<br>";
+			$countsublayer ++;
 		}
-	}	
-}
+		return $layerIdArray;
+	}
 
 
-//generate filter for different order possibilities
 
-//$queryJSON->searchFilter = (object) array();
-if ($_REQUEST["orderBy"] == '') {
-//echo "<br>orderBy:>".$_REQUEST["orderBy"]."<<br>";
-	$queryJSON->searchFilter->orderFilter->title = $orderByTitle['header'];
 	
+	private function hasConstraints($type,$id) {
+		if ($type == "wms") {
+			$sql = "SELECT wms.accessconstraints, wms.fees, wms.wms_network_access , wms.wms_pricevolume, wms.wms_proxylog, termsofuse.name,";
+			$sql .= " termsofuse.termsofuse_id, termsofuse.symbollink, termsofuse.description,termsofuse.descriptionlink from wms LEFT OUTER JOIN";
+			$sql .= "  wms_termsofuse ON  (wms.wms_id = wms_termsofuse.fkey_wms_id) LEFT OUTER JOIN termsofuse ON";
+			$sql .= " (wms_termsofuse.fkey_termsofuse_id=termsofuse.termsofuse_id) where wms.wms_id = $1";
+}
+		if ($type == "wfs") {
+			$sql = "SELECT accessconstraints, fees, wfs_network_access , termsofuse.name,";
+			$sql .= " termsofuse.termsofuse_id ,termsofuse.symbollink, termsofuse.description,termsofuse.descriptionlink from wfs LEFT OUTER JOIN";
+			$sql .= "  wfs_termsofuse ON  (wfs.wfs_id = wfs_termsofuse.fkey_wfs_id) LEFT OUTER JOIN termsofuse ON";
+			$sql .= " (wfs_termsofuse.fkey_termsofuse_id=termsofuse.termsofuse_id) where wfs.wfs_id = $1";	
+}
+		$v = array();
+		$t = array();
 
-	$queryJSON->searchFilter->orderFilter->item[0]->title = $orderByTitle['title'];
-	$queryJSON->searchFilter->orderFilter->item[0]->url = $searchURL."&orderBy=title";
-	$queryJSON->searchFilter->orderFilter->item[1]->title = $orderByTitle['id'];
-	$queryJSON->searchFilter->orderFilter->item[1]->url = $searchURL."&orderBy=id";
 
-} else {
-//read out actual order filter
-switch ($orderBy) {
-					case "rank":
-						$queryJSON->searchFilter->orderFilter->title = $orderByTitle['header'];
-						$queryJSON->searchFilter->orderFilter->item[0]->title = $orderByTitle['id'];
-						
-						$queryJSON->searchFilter->orderFilter->item[0]->url = str_replace("orderBy=rank", "orderBy=id", $searchURL);
-						$queryJSON->searchFilter->orderFilter->item[1]->title = $orderByTitle['title'];
+		array_push($t, "i");
+		array_push($v, $id);
 
-						$queryJSON->searchFilter->orderFilter->item[1]->url = str_replace("orderBy=rank", "orderBy=title", $searchURL);
-						break;
-					case "id":
-						$queryJSON->searchFilter->orderFilter->title = $orderByTitle['header'];
-						$queryJSON->searchFilter->orderFilter->item[0]->title = $orderByTitle['rank'];
+		$res = db_prep_query($sql,$v,$t);
 
-						$queryJSON->searchFilter->orderFilter->item[0]->url = str_replace("orderBy=id", "orderBy=rank", $searchURL);
-						$queryJSON->searchFilter->orderFilter->item[1]->title = $orderByTitle['title'];
+		$row = db_fetch_array($res);
 
-						$queryJSON->searchFilter->orderFilter->item[1]->url = str_replace("orderBy=id", "orderBy=title", $searchURL);
-						break;
-					case "title":
-						$queryJSON->searchFilter->orderFilter->title = $orderByTitle['header'];
-						$queryJSON->searchFilter->orderFilter->item[0]->title = $orderByTitle['rank'];
 
-						$queryJSON->searchFilter->orderFilter->item[0]->url = str_replace("orderBy=title", "orderBy=rank", $searchURL);
-						$queryJSON->searchFilter->orderFilter->item[1]->title = $orderByTitle['id'];
 
-						$queryJSON->searchFilter->orderFilter->item[1]->url = str_replace("orderBy=title", "orderBy=id", $searchURL);
-						break;
-					
-}
-}
+		if ((isset($row[$type.'_proxylog']) & $row[$type.'_proxylog'] != 0) or strtoupper($row['accessconstraints']) != "NONE" or strtoupper($row['fees']) != "NONE" or isset($row['termsofuse_id']) ) {
+		//service has some constraints defined!
+		//give symbol and true
+		//termsofuse symbol or exclamation mark
+			if (isset($row['termsofuse_id']) & $row['symbollink'] != "") {
+ 				$symbolLink = $row['symbollink'];
+			} else {
+				$symbolLink = "http://".$this->hostName."/portal/fileadmin/design/icn_warn.png";
+			}
+			$hasConstraints = true;
+			#$disclaimerLink = $_SERVER['HTTP_HOST']."/mapbender/php/mod_getServiceDisclaimer.php?type=".$type."&id=".$id;
+			#$symbolMouseOver = "Nutzungsbedingungen"; //TODO internationalize it
 
-//write out json to file or web
-	
-$queryFilter = $classJSON->encode($queryJSON);
+		} else {
+		//give symbol and false
+		//green symbol
+			$symbolLink = "http://".$this->hostName."/portal/fileadmin/design/icn_ok.png";
+       			#$disclaimerLink = "";
+			$hasConstraints = false;
+			#$symbolMouseOver = "Frei zugänglich"; //TODO internationalize it
+		}
 
-if ($resultTarget == 'debug') {
-	echo "<br>DEBUG: filter: ".$queryFilter."<br>";
-	#echo "<br>DEBUG: searchTypeBbox: ".$searchTypeBbox."<br>";
-}
-if ($resultTarget == 'file') {
-	$filename = $tempFolder."/".$searchId."_filter.json";
-	if (file_exists($filename)) {
-    		$e = new mb_notice("php/callMetdata.php: The file $filename exists - it will not be overwritten!");
-
-	} else {
-   		if($catFileHandle = fopen($filename, "w")){
-			fwrite($catFileHandle,$queryFilter);
-			fclose($catFileHandle);
-			$e = new mb_notice("php/callMetdata.php: new filter_file created!");
+		//generate json output:
+		#$json = new Mapbender_JSON;
+		#$returnJSON = new stdClass;
+		#$returnJSON->serviceConstraints = (object) array(
+				#'hasConstraints' => $hasConstraints,
+				#'disclaimerLink' => $disclaimerLink, 
+				#'symbolLink' => $symbolLink,
+				#'symbolMouseOver' => $symbolMouseOver
+		#	);
+		#$returnJSON = $json->encode($returnJSON);
+		#echo $returnJSON;
+		return array($hasConstraints, $symbolLink);
+	}
+	//function to delete one of the comma separated values from one get request
+	//
+	//
+	//
+	//
+	private function delFromQuery($paramName,$queryString,$string,$queryArray,$queryList) {
+		//check if if count searchArray = 1
+		if (count($queryArray) == 1){
+			//remove request parameter from url by regexpr or replace
+			$str2search = $paramName."=".$queryList;
+			$str2exchange = "";
+			$queryStringNew = str_replace($str2search, $str2exchange, $queryString);
+			$queryStringNew = str_replace("&&", "&", $queryStringNew);
 		} else {
-		$e = new mb_notice("php/callMetdata.php: cannot create filter_file!");
+		//there are more than one filter - reduce the filter  
+			$objectList = "";
+			for($i=0; $i < count($queryArray); $i++){
+				if ($queryArray[$i] != $string){
+					$objectList .= $queryArray[$i].",";		
+				} 
+			}
+			//remove last comma
+			$objectList = rtrim($objectList, ",");
+			$str2search = $paramName."=".$queryList;
+			$str2exchange = $paramName."=".$objectList;
+			$queryStringNew = str_replace($str2search, $str2exchange, $queryString);
 		}
+	return $queryStringNew;
 	}
 	
-}
-//function to transpose a matrix - sometimes needed to do an array search
-function flipDiagonally($arr) {
-    	$out = array();
-    	foreach ($arr as $key => $subarr) {
-      		foreach ($subarr as $subkey => $subvalue) {
-        		$out[$subkey][$key] = $subvalue;
-       		}
-    	}
-   	return $out;
-}
 
-//function to delete one of the comma separated values from one get request
-function delFromQuery($paramName,$queryString,$string,$queryArray,$queryList) {
-	//check if if count searchArray = 1
-	if (count($queryArray) == 1){
-		//remove request parameter from url by regexpr or replace
-		$str2search = $paramName."=".$queryList;
-		$str2exchange = "";
-		$queryStringNew = str_replace($str2search, $str2exchange, $queryString);
-		$queryStringNew = str_replace("&&", "&", $queryStringNew);
-	} else {
-	//there are more than one filter - reduce the filter  
-		$objectList = "";
-		for($i=0; $i < count($queryArray); $i++){
-			if ($queryArray[$i] != $string){
-				$objectList .= $queryArray[$i].",";		
-			} 
+	
+	private function getValueForParam($paramName,$queryString) {
+		$queryString = "&".$queryString;
+		$pattern = '/\b'.$paramName.'\=[^&]+&?/';	
+ 		if (!preg_match($pattern, $queryString, $matches)){
+			return false;
+		} else {
+			//some param found
+			//delete $paramName= and the last ampersand!
+			if (count($matches) == 1) {
+				$requestString = $matches[0];
+				$requestString = ltrim($requestString,$paramName."=");
+				$requestString = rtrim($requestString,'&');
+
+				return $requestString;
+			} else {
+				$e = new mb_exception("class_metadata_new.php: There are parameter ambiguities!");
+				#echo "Parameter Ambiguities found!";
+				die();
+			}
 		}
-		//remove last comma
-		$objectList = rtrim($objectList, ",");
-		$str2search = $paramName."=".$queryList;
-		$str2exchange = $paramName."=".$objectList;
-		$queryStringNew = str_replace($str2search, $str2exchange, $queryString);
+	}	
+
+	private function addToQuery($paramName,$queryString,$string,$queryList) {
+		//test if string was part of query before, if so, don't extent the query
+		//TODO: the strings come from json and so they are urlencoded! maybe we have to decode them to find the commata
+		$queryListComma = urldecode($queryList);
+		$queryListC = ",".$queryListComma.",";
+		$pattern = ','.$string.',';	
+ 		if (!preg_match($pattern, $queryListC)){
+			//append the new element
+			$queryListNew = $queryListC.$string;
+			//echo "query string new: ".$queryListNew."<br>";
+			//delete the commatas
+			$queryListNew = ltrim($queryListNew,',');
+			//generate the new query string
+			$queryStringNew = str_replace($paramName.'='.$queryList,$paramName.'='.$queryListNew,$queryString);
+			//echo "query string new: ".$queryListNew."<br>";
+			//dump old and new querystring for debugging
+			//$this->logit("class_metadata_new: queryString_old:".$queryString);
+			//$this->logit("class_metadata_new: queryString_new:".$queryStringNew);
+			return $queryStringNew;
+		} else {
+			//$this->logit("class_metadata_new: queryString unchanged:".$queryString);
+			//return the old one!
+			return $queryString;
+		}
 	}
-	return $queryStringNew;
-}
+	//for debugging purposes
+	private function logit($text){
+	 	if($h = fopen("/tmp/class_metadata_new.log","a")){
+					$content = $text .chr(13).chr(10);
+					if(!fwrite($h,$content)){
+						#exit;
+					}
+					fclose($h);
+				}
+	 	
+	 }
 
-//function to remove one complete get param out of the query
-function delTotalFromQuery($paramName,$queryString) {
-	//echo $paramName ."<br>";
-	$queryString = "&".$queryString;
-	$queryStringNew = preg_replace('/\b'.$paramName.'\=[^&]*&?/',"",$queryString); //TODO find empty get params
-	$queryStringNew = ltrim($queryStringNew,'&');
-	$queryStringNew = rtrim($queryStringNew,'&');
-	return $queryStringNew;
-}
 
 
 
-//call class_metadata - in case of file for all requested resources, in case of web only for one resource - cause there are different result files
-
-
-if ($resultTarget == 'file') {
-	for($i=0; $i<count($searchResources);$i++){
-		$str = "nohup php5 /data/mapbender/http/php/mod_metadataWrite.php ";
-		$str .= "'".$userId."' ";		
-		$str .= "'".$searchId."' ";		
-		$str .= "'".$searchText."' "; 		
-		$str .= "'".$registratingDepartments."' ";						
-		$str .= "'".$isoCategories."' ";							
-		$str .= "'".$inspireThemes."' ";
-		$str .= "'".$timeBegin."' ";
-		$str .= "'".$timeEnd."' ";
-		$str .= "'".$regTimeBegin."' ";
-		$str .= "'".$regTimeEnd."' ";
-		$str .= "'".$maxResults."' ";
-		$str .= "'".$searchBbox."' ";
-		$str .= "'".$searchTypeBbox."' ";
-		$str .= "'".$accessRestrictions."' ";
-		$str .= "'".$languageCode."' ";
-		$str .= "'".$searchEPSG."' ";
-		$str .= "'".$searchResources[$i]."' ";
-		$str .= "'".$searchPages[$i]."' ";
-		$str .= "'".$outputFormat."' ";
-		$str .= "'".$resultTarget."' ";
-		$str .= "'".$searchURL."' ";
-		$str .= "'".$customCategories."' ";
-		$str .= "'".$hostName."' ";
-		$str .= "'".$orderBy."' ";
-		$str .= " & ";
-		$e = new mb_exception($str);
-		exec($str);
-	}
+	private function delTotalFromQuery($paramName,$queryString) {
+		$queryString = "&".$queryString;
+		#echo "<br>queryString: ".$queryString."<br>";
+		$queryStringNew = preg_replace('/\b'.$paramName.'\=[^&]+&?/',"",$queryString);
+		$queryStringNew = ltrim($queryStringNew,'&');
+		$queryStringNew = rtrim($queryStringNew,'&');
+		return $queryStringNew;
+	}	
+		
 }
-if ($resultTarget == 'web' or $resultTarget == 'debug') {
-	if (count($searchResources) == 1) {
-		$metadata = new searchMetadata($userId, $searchId, $searchText, $registratingDepartments, $isoCategories, $inspireThemes, $timeBegin, $timeEnd, $regTimeBegin, $regTimeEnd, $maxResults, $searchBbox, $searchTypeBbox, $accessRestrictions, $languageCode, $searchEPSG, $searchResources[0], $searchPages[0], $outputFormat, $resultTarget, $searchURL, $customCategories, $hostName, $orderBy);
-		#if ($outputFormat == 'xml') {
-		#	header("Content-type: application/xhtml+xml; charset=UTF-8");		
-		#}
-		#echo "class initiated<br>";
-	}
-	else {
-		echo "Result for web can only requested for one type of resource (wms, wfs, wmc, georss)!";
-	}
-}
-/*
-How does the webservice look like?
-First request: Do search for all classes. 
-Next request: Search only in the requested class and the numbered page.
-search.php?q=test&classes=wms,wfs,wmc,georss&pages=1,1,1,1&iso=1,2,3&inspire=1,2,3,4&department=1,2,3,4&bbox=123,123,123,123
-simple other request:
-search.php?q=test&classes=wms&pages=2&iso=1,2,3&inspire=1,2,3,4&department=1,2,3,4&beginDate=2009-10-10&endDate=2010-11-12&searchId=12hjxa31231
-There is a possibility to exchange some classes by other information - the id will be used to update the search result files - but this can only update the class infos. The pagenumber should be updated in the metadata file
-*/
-//
-//Name of searchMetadata file
-//searchid_classes.json
-//Name of searchCategories file
-//Name of searchResult files
-//searchid_wms_1.json
-//searchid_wfs_1.json
-//searchid_wmc_1.json - doesn't exists till now
-//searchid_georss_1.json - doesn't exists till now
-//categories files - will only be generated when the search is started and resultType = 'file'. if the categories files already exists it will not be updated! - Here we can spare a reasonable amount of calculating power. Another approach is to generate a md5 hash of an ordered searchURL. With this we can cache the requests!
-
-//searchid_wms_cat.json
-//searchid_wfs_cat.json
-//searchid_wmc_cat.json - doesn't exists till now
-//searchid_georss_cat.json - doesn't exists till now
-//searchid_filter.json
-
 ?>
\ No newline at end of file

Modified: trunk/mapbender/http/classes/class_rss_factory.php
===================================================================
--- trunk/mapbender/http/classes/class_rss_factory.php	2010-05-10 12:04:26 UTC (rev 6148)
+++ trunk/mapbender/http/classes/class_rss_factory.php	2010-05-10 12:32:29 UTC (rev 6149)
@@ -122,6 +122,11 @@
 				case "link":
 					$item->setUrl(trim($childNode->nodeValue));
 					break;
+					
+				case "pupDate":
+					$item->setPubDate(trim($childNode->nodeValue));
+					break;	
+					
 			}
 		}
 		return $item;

Modified: trunk/mapbender/http/classes/class_rss_item.php
===================================================================
--- trunk/mapbender/http/classes/class_rss_item.php	2010-05-10 12:04:26 UTC (rev 6148)
+++ trunk/mapbender/http/classes/class_rss_item.php	2010-05-10 12:32:29 UTC (rev 6149)
@@ -12,6 +12,7 @@
 	protected $title;
 	protected $description;
 	protected $url;
+	protected $pubDate;
 	
 	public function __construct () {
 	}
@@ -28,6 +29,11 @@
         $this->title = $title;
 	}
 
+	
+	public function setPubDate ($pubDate) {
+        $this->pubDate = $pubDate;
+	}
+	
 	public function setDescription ($description) {
         $this->description = $description;
 	}
@@ -42,7 +48,7 @@
 	protected function getItemString () {
         return '<title>' . $this->title . '</title>' . "\n" . 
 			'<link>' . htmlentities($this->url, ENT_QUOTES, CHARSET) . '</link>' . "\n" . 
-			'<description>' . $this->description . '</description>' . "\n";
+			'<description>' . $this->description . '</description>' . "\n" . '<pubDate>' . $this->pubDate . '</pubDate>' . "\n";
 //			'<feedburner:origLink>' . $this->url . '</feedburner:origLink>' . 
 //			"\n";
 	}

Modified: trunk/mapbender/http/classes/class_wms.php
===================================================================
--- trunk/mapbender/http/classes/class_wms.php	2010-05-10 12:04:26 UTC (rev 6148)
+++ trunk/mapbender/http/classes/class_wms.php	2010-05-10 12:32:29 UTC (rev 6149)
@@ -83,7 +83,24 @@
 	  
 	function wms() {
 	} 
+    /**
+     *
+     * @generate RSS formated date 
+     *
+     * @param int $timestamp The UNIX_TIMESTAMP
+     *
+     * @return string
+     *
+     */
+    private static function rssDate($timestamp=null)
+    {
+        /*** set the timestamp ***/
+        $timestamp = ($timestamp==null) ? time() : $timestamp;
 
+        /*** Mon, 02 Jul 2009 11:36:45 +0000 ***/
+        return date(DATE_RSS, $timestamp);
+    }
+    
 	public static function getWmsMetadataUrl ($wmsId) {
 		return preg_replace(
 			"/(.*)frames\/login.php/", 
@@ -1479,6 +1496,7 @@
 			$geoRssItem->setTitle("NEW: " . $this->wms_title);
 			$geoRssItem->setDescription($this->wms_abstract);
 			$geoRssItem->setUrl(self::getWmsMetadataUrl($myWMS));
+			$geoRssItem->setPubDate(self::rssDate());
 
 			for ($j = 0; $j < count($this->objLayer[0]->layer_epsg); $j++) {
 				$currentEpsg = $this->objLayer[0]->layer_epsg[$j];
@@ -1941,6 +1959,7 @@
 			$geoRssItem->setTitle("UPDATED WMS: " . $this->wms_title);
 			$geoRssItem->setDescription($this->wms_abstract);
 			$geoRssItem->setUrl(self::getWmsMetadataUrl($myWMS));
+			$geoRssItem->setPubDate(self::rssDate());
 			for ($j = 0; $j < count($this->objLayer[0]->layer_epsg); $j++) {
 				$currentEpsg = $this->objLayer[0]->layer_epsg[$j];
 				if ($currentEpsg["epsg"] === "EPSG:4326") {
@@ -1963,7 +1982,7 @@
 				$geoRssItem->setTitle("ADDED LAYER: " . $currentLayer->layer_title);
 				$geoRssItem->setDescription($currentLayer->layer_abstract);
 				$geoRssItem->setUrl(layer::getLayerMetadataUrl($currentLayer->layer_id));
-				
+				$geoRssItem->setPubDate(self::rssDate());
 				for ($j = 0; $j < count($currentLayer->layer_epsg); $j++) {
 					$currentEpsg = $currentLayer->layer_epsg[$j];
 					if ($currentEpsg["epsg"] === "EPSG:4326") {
@@ -1984,6 +2003,7 @@
 				$geoRssItem = new GeoRssItem();
 				$geoRssItem->setTitle("DELETED LAYER: " . $oldLayer["title"]);
 				$geoRssItem->setDescription($oldLayer["abstract"]);
+				$geoRssItem->setPubDate(self::rssDate());
 //				$geoRssItem->setUrl();
 				$geoRss->append($geoRssItem);
 			}

Modified: trunk/mapbender/http/php/mod_callMetadata.php
===================================================================
--- trunk/mapbender/http/php/mod_callMetadata.php	2010-05-10 12:04:26 UTC (rev 6148)
+++ trunk/mapbender/http/php/mod_callMetadata.php	2010-05-10 12:32:29 UTC (rev 6149)
@@ -51,7 +51,8 @@
 
 //read the whole query string:
 $searchURL = $_SERVER['QUERY_STRING'];
-
+//decode it !
+$searchURL = urldecode($searchURL);
 //control if some request variables are not set and set them explicit to NULL
 
 
@@ -76,7 +77,7 @@
 }
 if (isset($_REQUEST["searchText"]) & $_REQUEST["searchText"] != "") {
 	$test="(SELECT\s[\w\*\)\(\,\s]+\sFROM\s[\w]+)| (UPDATE\s[\w]+\sSET\s[\w\,\'\=]+)| (INSERT\sINTO\s[\d\w]+[\s\w\d\)\(\,]*\sVALUES\s\([\d\w\'\,\)]+)| (DELETE\sFROM\s[\d\w\'\=]+)";
-	//validate to csv integer list
+	//validate to csv integer list
 	$testMatch = $_REQUEST["searchText"];
 	$pattern = '/(\%27)|(\')|(\-\-)|(\")|(\%22)/';		
  	if (preg_match($pattern,$testMatch)){ 
@@ -87,7 +88,7 @@
 	$testMatch = NULL;
 }
 if (isset($_REQUEST["registratingDepartments"]) & $_REQUEST["registratingDepartments"] != "") {
-	//validate to csv integer list
+	//validate to csv integer list
 	$testMatch = $_REQUEST["registratingDepartments"];
 	$pattern = '/^[\d,]*$/';		
  	if (!preg_match($pattern,$testMatch)){ 
@@ -98,7 +99,7 @@
 	$testMatch = NULL;
 }
 if (isset($_REQUEST["isoCategories"]) & $_REQUEST["isoCategories"] != "") {
-	//validate to csv integer list
+	//validate to csv integer list
 	$testMatch = $_REQUEST["isoCategories"];
 	$pattern = '/^[\d,]*$/';		
  	if (!preg_match($pattern,$testMatch)){ 
@@ -109,7 +110,7 @@
 	$testMatch = NULL;
 }
 if (isset($_REQUEST["inspireThemes"]) & $_REQUEST["inspireThemes"] != "") {
-	//validate to csv integer list
+	//validate to csv integer list
 	$testMatch = $_REQUEST["inspireThemes"];
 	$pattern = '/^[\d,]*$/';		
  	if (!preg_match($pattern,$testMatch)){ 
@@ -121,7 +122,7 @@
 }
 
 if (isset($_REQUEST["customCategories"]) & $_REQUEST["customCategories"] != "") {
-	//validate to csv integer list
+	//validate to csv integer list
 	$testMatch = $_REQUEST["customCategories"];
 	$pattern = '/^[\d,]*$/';		
  	if (!preg_match($pattern,$testMatch)){ 
@@ -188,7 +189,7 @@
 	$testMatch = NULL;
 }
 if (isset($_REQUEST["searchBbox"]) & $_REQUEST["searchBbox"] != "") {
-	//validate to float/integer
+	//validate to float/integer
 	$testMatch = $_REQUEST["searchBbox"];
 	//$pattern = '/^[-\d,]*$/';	
 	$pattern = '/^[-+]?([0-9]*\.[0-9]+|[0-9]+)*$/';
@@ -221,7 +222,7 @@
 	#TODO implement me //$accessRestrictions = $_REQUEST["accessRestrictions"];
 }
 if (isset($_REQUEST["languageCode"]) & $_REQUEST["languageCode"] != "") {
-	//validate to de, en, fr
+	//validate to de, en, fr
 	$testMatch = $_REQUEST["languageCode"];	
  	if (!($testMatch == 'de' or $testMatch == 'en' or $testMatch == 'fr')){ 
 		echo 'languageCode: <b>'.$testMatch.'</b> is not valid.<br/>'; 
@@ -241,7 +242,7 @@
 }
 if (isset($_REQUEST["hostName"]) & $_REQUEST["hostName"] != "") {
 	$testMatch = $_REQUEST["hostName"];	
- 	if (!($testMatch == 'www.geoportal.rlp' or $testMatch == 'www.geoportal.rlp.de' or $testMatch == 'geoportal.rlp' or $testMatch == '10.7.101.165' or $testMatch == 'localhost:16580' or $testMatch == 'localhost')){ 
+ 	if (!($testMatch == 'www.geoportal.rlp' or $testMatch == 'www.geoportal.rlp.de' or $testMatch == 'geoportal.rlp' or $testMatch == '10.7.101.165' or $testMatch == 'localhost:16580' or $testMatch == 'localhost' or $testMatch == 'www.gdi-rp-dienste3.rlp.de' )){ 
 		echo 'hostName: <b>'.$testMatch.'</b> is not valid.<br/>'; 
 		die(); 		
  	}
@@ -281,7 +282,7 @@
 	$testMatch = NULL;
 }
 if (isset($_REQUEST["searchPages"]) & $_REQUEST["searchPages"] != "") {
-	//validate to csv integer list with dimension of searchResources list
+	//validate to csv integer list with dimension of searchResources list
 	$testMatch = $_REQUEST["searchPages"];
 	$pattern = '/^[-\d,]*$/';		
  	if (!preg_match($pattern,$testMatch)){ 
@@ -444,7 +445,7 @@
 			while($row = db_fetch_array($res)){
 				$isoCategoryArray[$countIsoArray]["id"] = $row["md_topic_category_id"];
 				$isoCategoryArray[$countIsoArray]["name"] = $row["md_topic_category_code_".$languageCode];
-				$countIsoArray = $countDepArray + 1; 
+				$countIsoArray = $countIsoArray + 1; 
 			}
 			return $isoCategoryArray;
 		}
@@ -796,8 +797,10 @@
 		//remove last comma
 		$objectList = rtrim($objectList, ",");
 		$str2search = $paramName."=".$queryList;
+		echo "string to search: ".$str2search."<br>";
 		$str2exchange = $paramName."=".$objectList;
-		$queryStringNew = str_replace($str2search, $str2exchange, $queryString);
+		echo "string to exchange: ".$str2exchange."<br>";
+		$queryStringNew = str_replace($str2search, $str2exchange, urldecode($queryString));
 	}
 	return $queryStringNew;
 }
@@ -820,11 +823,11 @@
 if ($resultTarget == 'file') {
 	for($i=0; $i<count($searchResources);$i++){
 		$str = "nohup php5 /data/mapbender/http/php/mod_metadataWrite.php ";
-		$str .= "'".$userId."' ";		
-		$str .= "'".$searchId."' ";		
-		$str .= "'".$searchText."' "; 		
-		$str .= "'".$registratingDepartments."' ";						
-		$str .= "'".$isoCategories."' ";							
+		$str .= "'".$userId."' ";		
+		$str .= "'".$searchId."' ";		
+		$str .= "'".$searchText."' "; 		
+		$str .= "'".$registratingDepartments."' ";						
+		$str .= "'".$isoCategories."' ";							
 		$str .= "'".$inspireThemes."' ";
 		$str .= "'".$timeBegin."' ";
 		$str .= "'".$timeEnd."' ";
@@ -887,4 +890,4 @@
 //searchid_georss_cat.json - doesn't exists till now
 //searchid_filter.json
 
-?>
\ No newline at end of file
+?>

Modified: trunk/mapbender/http/php/mod_metadataWrite.php
===================================================================
--- trunk/mapbender/http/php/mod_metadataWrite.php	2010-05-10 12:04:26 UTC (rev 6148)
+++ trunk/mapbender/http/php/mod_metadataWrite.php	2010-05-10 12:32:29 UTC (rev 6149)
@@ -26,4 +26,4 @@
 $orderBy = $_SERVER["argv"][24];
 
 $metadata = new searchMetadata($userId, $searchId, $searchText, $registratingDepartments, $isoCategories, $inspireThemes, $timeBegin, $timeEnd, $regTimeBegin, $regTimeEnd, $maxResults, $searchBbox, $searchTypeBbox, $accessRestrictions, $languageCode, $searchEPSG, $searchResources, $searchPages, $outputFormat, $resultTarget, $searchURL, $customCategories, $hostName, $orderBy);
-?>
\ No newline at end of file
+?>



More information about the Mapbender_commits mailing list