<?php
#$Id: mod_insertWmcIntoDb.php 507 2006-11-20 10:55:57Z christoph $
#$Header: /cvsroot/mapbender/mapbender/http/javascripts/mod_insertWmcIntoDb.php,v 1.19 2006/03/09 14:02:42 uli_rothstein Exp $
# Copyright (C) 2002 CCGIS 
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

require_once(dirname(__FILE__)."/../php/mb_validateSession.php");
require_once(dirname(__FILE__)."/../classes/class_mb_exception.php");
require_once(dirname(__FILE__)."/../classes/class_administration.php");
require_once(dirname(__FILE__)."/../extensions/JSON.php");

$json = new Services_JSON();
$mapObject = $json->decode($_REQUEST["mapObject"]);
$user_id = $_SESSION["mb_user_id"];
$save_in_session = $_POST["saveInSession"];
$generalTitle = $_POST["generalTitle"];

$wmc_id = $user_id . '_' . time();

$generalWidth = $mapObject->width;
$generalHeight = $mapObject->height;
$generalBboxSrs = $mapObject->epsg;

$arrayBBox = explode(",", $mapObject->extent);
$generalBboxMinx = floatval($arrayBBox[0]);
$generalBboxMiny = floatval($arrayBBox[1]);
$generalBboxMaxx = floatval($arrayBBox[2]);
$generalBboxMaxy = floatval($arrayBBox[3]);

$generalName = "Mapbender WMC"; // TO do : insert proper data
$generalKeywords = array("Mapbender", "WMC"); // TO do : insert proper data
$generalAbstract = ""; // TO do : insert proper data
$generalLogoUrl = ""; // TO do : insert proper data
$generalLogoUrlWidth = ""; // TO do : insert proper data
$generalLogoUrlHeight = ""; // TO do : insert proper data
$generalLogoUrlFormat = ""; // TO do : insert proper data
$generalDescriptionUrl = ""; // TO do : insert proper data
$generalContactPerson = "";
$generalContactOrganization = "";
$generalContactPosition = "";
$generalContactAddressType = "";
$generalContactAddress = "";
$generalContactCity = "";
$generalContactStateOrProvince = "";
$generalContactPostCode = "";
$generalContactCountry = "";
$generalContactVoiceTelephone = "";
$generalContactFacsimileTelephone = "";
$generalContactElectronicMailAddress = "";
		
$extension_namespace = "mapbender";

// LayerList variables
$layerHidden = "";
$layerQueryable = "";
$layerAbstract = "";
$layerName = "";
$layerSrs = "";
$layerDataUrl = "";
$layerMetadataUrl = "";
$layerFormat = "";
$layerFormat_current = "";
$layerStyle_current = "";
$layerStyle_name = "";
$layerStyle_title = "";
$layerStyle_legendURL = "";
$layerStyle_legendURL_width = "";
$layerStyle_legendURL_height = "";
$layerStyle_legendURL_format = "";		

// generate XML
$doc = new DOMDocument("1.0", CHARSET);
$doc->preserveWhiteSpace = false;

// ViewContext
$e_view_context = $doc->createElementNS("http://www.opengis.net/context", "ViewContext");


$e_view_context->setAttribute("version", "1.0.0");
$e_view_context->setAttribute("id", $wmc_id);
$e_view_context->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
$e_view_context->setAttribute("xmlns:mapbender", "http://www.mapbender.org");
$e_view_context->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
$e_view_context->setAttribute("xsi:SchemaLocation", "http://schemas.opengis.net/context/1.0.0/context.xsd");

	// General
	$e_general = $doc->createElement("General");

		$e_window = $doc->createElement("Window");
		if (!empty($generalWidth) && !empty($generalHeight)) {
			$e_window->setAttribute("width", $generalWidth);
			$e_window->setAttribute("height", $generalHeight);
		}
		$e_general->appendChild($e_window);
		
		$e_bbox = $doc->createElement("BoundingBox");
		$e_bbox->setAttribute("SRS", $generalBboxSrs);
		$e_bbox->setAttribute("minx", $generalBboxMinx);
		$e_bbox->setAttribute("miny", $generalBboxMiny);
		$e_bbox->setAttribute("maxx", $generalBboxMaxx);
		$e_bbox->setAttribute("maxy", $generalBboxMaxy);
		$e_general->appendChild($e_bbox);
		
		$e_name = $doc->createElement("Name", $generalName);
		$e_general->appendChild($e_name);
		
		$e_title = $doc->createElement("Title", $generalTitle);
		$e_general->appendChild($e_title);
		
		$e_keyword_list = $doc->createElement("KeywordList");
		for ($i=0; $i < count($generalKeywords); $i++) {
			$e_keyword = $doc->createElement("Keyword", $generalKeywords[$i]);
			$e_keyword_list->appendChild($e_keyword);
		}
		$e_general->appendChild($e_keyword_list);
		
		if ($generalAbstract){
			$e_abstract = $doc->createElement("Abstract", $generalAbstract);
			$e_general->appendChild($e_abstract);
		}
		
		if ($generalLogoUrlWidth && $generalLogoUrlHeight && $generalLogoUrlFormat && $generalLogoUrl){
			$e_logo_url = $doc->createElement("LogoURL");
			$e_logo_url->setAttribute("width", $generalLogoUrlWidth);
			$e_logo_url->setAttribute("height", $generalLogoUrlHeight);
			$e_logo_url->setAttribute("format", $generalLogoUrlFormat);
		
			$e_logo_url_or = $doc->createElement("OnlineResource");
			$e_logo_url_or->setAttributeNS("http://www.opengis.net/context", "xmlns:xlink", "http://www.w3.org/1999/xlink");
			$e_logo_url_or->setAttribute("xlink:type", "simple");
			$e_logo_url_or->setAttribute("xlink:href", $generalLogoUrl);
			$e_logo_url->appendChild($e_logo_url_or);

			$e_general->appendChild($e_logo_url);
		}
			
		if ($generalDescriptionUrl){
			$e_description_url = $doc->createElement("DescriptionURL");

			$e_description_url_or = $doc->createElement("OnlineResource");
			$e_description_url_or->setAttributeNS("http://www.opengis.net/context", "xmlns:xlink", "http://www.w3.org/1999/xlink");
			$e_description_url_or->setAttribute("xlink:type", "simple");
			$e_description_url_or->setAttribute("xlink:href", $generalDescriptionUrl);
			$e_description_url->appendChild($e_description_url_or);

			$e_general->appendChild($e_description_url);
		}
		
		if ($generalContactElectronicMailAddress || $generalContactOrganization ||
			$generalContactPerson || $generalContactPosition || $generalContactAddressType ||
			$generalContactAddress || $generalContactCity || $generalContactStateOrProvince ||
			$generalContactPostCode || $generalContactCountry || $generalContactVoiceTelephone ||
			$generalContactFacsimileTelephone || $generalContactElectronicMailAddress) {
		
			$e_contact = $doc->createElement("ContactInformation");
		
			if ($generalContactPerson || $generalContactOrganization){
				$e_contact_person_primary = $doc->createElement("ContactPersonPrimary");
		
				if ($generalContactPerson){
					$e_contact_person = $doc->createElement("ContactPerson", $generalContactPerson);
					$e_contact_person_primary->appendChild($e_contact_person);
				}
				if ($generalContactOrganization){
					$e_contact_organization = $doc->createElement("ContactOrganization", $generalContactOrganization);
					$e_contact_person_primary->appendChild($e_contact_organization);
				}
				$e_contact->appendChild($e_contact_person_primary);
			}
		
			if ($generalContactPosition){
				$e_contact_position = $doc->createElement("ContactPosition", $generalContactPosition);
				$e_contact->appendChild($e_contact_position);
			}
		
			if ($generalContactAddressType || $arrayBBoxgeneralContactAddress || 
				$generalContactCity || $generalContactStateOrProvince ||
				$generalContactPostCode || $generalContactCountry) {
		
				$e_contact_address = $doc->createElement("ContactAddress");
		
				if ($generalContactAddressType){
					$e_address_type = $doc->createElement("AddressType", $generalContactAddressType);
					$e_contact_address->appendChild($e_address_type);
				}
				if ($generalContactAddress){
					$e_address = $doc->createElement("Address", $generalContactAddress);
					$e_contact_address->appendChild($e_address);
				}
				if ($generalContactCity){
					$e_city = $doc->createElement("City", $generalContactCity);
					$e_contact_address->appendChild($e_city);
				}
				if ($generalContactStateOrProvince){
					$e_state = $doc->createElement("StateOrProvince", $generalContactStateOrProvince);
					$e_contact_address->appendChild($e_state);
				}
				if ($generalContactPostCode){
					$e_postcode = $doc->createElement("PostCode", $generalContactPostCode);
					$e_contact_address->appendChild($e_postcode);
				}
				if ($generalContactCountry){
					$e_country = $doc->createElement("Country", $generalContactCountry);
					$e_contact_address->appendChild($e_country);
				}
				$e_contact->appendChild($e_contact_address);
			}
			
			if ($generalContactVoiceTelephone){
				$e_voice_telephone = $doc->createElement("ContactVoiceTelephone", $generalContactVoiceTelephone);
				$e_contact->appendChild($e_voice_telephone);
			}
			if ($generalContactFacsimileTelephone){
				$e_facsimile_telephone = $doc->createElement("ContactFacsimileTelephone", $generalContactFacsimileTelephone);
				$e_contact->appendChild($e_facsimile_telephone);
			}
			if ($generalContactElectronicMailAddress){
				$e_email = $doc->createElement("ContactElectronicMailAddress", $generalContactElectronicMailAddress);
				$e_contact->appendChild($e_email);
			}
			$e_general->appendChild($e_contact);
		}
	$e_view_context->appendChild($e_general);


	// LayerList
	$e_layer_list = $doc->createElement("LayerList");

	for ($i=0; $i < count($mapObject->wms); $i++){
		$wmsId = $mapObject->wms[$i]->wms_id;
		$wms_epsg = array();
		$wms_epsg[0] = $mapObject->epsg;
	
		if ($mapObject->wms[$i]->gui_wms_epsg != $mapObject->epsg){
			$wms_epsg[1] = $mapObject->wms[$i]->gui_wms_epsg;
		}

		for ($q = 0; $q < count($mapObject->wms[$i]->gui_epsg); $q++){
			$isInArray = false;
			
			for ($r=0 ; $r < count($wms_epsg); $r++){
				if ($wms_epsg[$r] == $mapObject->wms[$i]->gui_epsg[$q]){
					$isInArray = true;
				}
			}
			if ($isInArray == false){
				array_push($wms_epsg, $mapObject->wms[$i]->gui_epsg[$q]);
			}
		}
		for ($j = 0; $j < count($mapObject->wms[$i]->objLayer); $j++){
			if ($mapObject->wms[$i]->objLayer[$j]->layer_parent != ''){
				if ($mapObject->wms[$i]->objLayer[$j]->gui_layer_visible == "1"){
					$layerHidden = 0;
				}
				else{
					$layerHidden = 1;
				}
				$layerQueryable = $mapObject->wms[$i]->objLayer[$j]->layer_queryable;
				$layerQuerylayer = $mapObject->wms[$i]->objLayer[$j]->gui_layer_querylayer;
				$layerId = $mapObject->wms[$i]->objLayer[$j]->layer_uid;
				$layerName = $mapObject->wms[$i]->objLayer[$j]->layer_name;
				$layerTitle = $mapObject->wms[$i]->objLayer[$j]->layer_title;
				$layerAbstract = $mapObject->wms[$i]->wms_abstract; //To Do: insert actual abstract
				$layerDataUrl = $mapObject->wms[$i]->objLayer[$j]->layer_dataurl_href; 
				$layerMetadataUrl = $mapObject->wms[$i]->objLayer[$j]->layer_metadataurl;
				$layerMinscale = $mapObject->wms[$i]->objLayer[$j]->layer_minscale; 
				$layerMaxscale = $mapObject->wms[$i]->objLayer[$j]->layer_maxscale; 
				$wmsVersion = $mapObject->wms[$i]->wms_version;
				$wmsTitle = $mapObject->wms[$i]->wms_title;
				$wmsOnlineResource = $mapObject->wms[$i]->wms_getmap;
	
				$e_layer = $doc->createElement("Layer");
				$e_layer->setAttribute("queryable", $layerQueryable);
				$e_layer->setAttribute("hidden", $layerHidden);
	
					$e_service = $doc->createElement("Server");
					$e_service->setAttribute("service", "OGC:WMS");
					$e_service->setAttribute("version", $wmsVersion);
					$e_service->setAttribute("title", $wmsTitle);
	
					$e_service_or = $doc->createElement("OnlineResource");
					$e_service_or->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
					$e_service_or->setAttribute("xlink:type", "simple");
					$e_service_or->setAttribute("xlink:href", $wmsOnlineResource);
					
					$e_service->appendChild($e_service_or);
					$e_layer->appendChild($e_service);
	
					$e_layer_name = $doc->createElement("Name", $layerName);
					$e_layer->appendChild($e_layer_name);
	
					$e_layer_title = $doc->createElement("Title", $layerTitle);
					$e_layer->appendChild($e_layer_title);
	
					if ($layerAbstract){
						$e_layer_abstract = $doc->createElement("Abstract", $layerAbstract);
						$e_layer->appendChild($e_layer_abstract);
					}
	
					$e_layer_srs = $doc->createElement("SRS", implode(" ", $wms_epsg));
					$e_layer->appendChild($e_layer_name);
	
					if ($layerDataUrl){
						$e_layer_data_url = $doc->createElement("DataURL");
		
						$e_layer_data_url_or = $doc->createElement("OnlineResource");
						$e_layer_data_url_or->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
						$e_layer_data_url_or->setAttribute("xlink:type", "simple");
						$e_layer_data_url_or->setAttribute("xlink:href", $layerDataUrl);
						
						$e_layer_data_url->appendChild($e_layer_data_url_or);
						$e_layer->appendChild($e_layer_data_url);
					}
	
					if ($layerMetadataUrl){
						$e_layer_metadata_url = $doc->createElement("MetadataURL");
		
						$e_layer_metadata_url_or = $doc->createElement("OnlineResource");
						$e_layer_metadata_url_or->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
						$e_layer_metadata_url_or->setAttribute("xlink:type", "simple");
						$e_layer_metadata_url_or->setAttribute("xlink:href", $layerMetadataUrl);
						
						$e_layer_metadata_url->appendChild($e_layer_metadata_url_or);
						$e_layer->appendChild($e_layer_metadata_url);
					}
	
					$e_extension = $doc->createElement("Extension");
	
					$e_scalehint = $doc->createElement($extension_namespace.":ScaleHint");
					$e_scalehint->setAttribute("min", $layerMinscale);
					$e_scalehint->setAttribute("max", $layerMaxscale);
					$e_extension->appendChild($e_scalehint);
					
					$e_layer_id = $doc->createElement($extension_namespace.":layer_id", $layerId);
					$e_extension->appendChild($e_layer_id);
	
					$e_wms_id = $doc->createElement($extension_namespace.":wms_id", $wmsId);
					$e_extension->appendChild($e_wms_id);
	
					$e_querylayer = $doc->createElement($extension_namespace.":querylayer", $layerQuerylayer);
					$e_extension->appendChild($e_querylayer);
					
					$e_layer->appendChild($e_extension);
	
					//layerFormat
					$e_layer_format = $doc->createElement("FormatList");
	
					$data_format_current = false;
	
					for ($k = 0; $k < count($mapObject->wms[$i]->data_format); $k++){
	
						if ($mapObject->wms[$i]->data_type[$k] == "map") {
							$layerFormat = $mapObject->wms[$i]->data_format[$k];
			
							$e_format = $doc->createElement("Format", $layerFormat);
	
							if ($data_format_current == false && ( 
									($mapObject->wms[$i]->data_format[$k] == $mapObject->wms[$i]->gui_wms_mapformat) ||
									($k == (count($mapObject->wms[$i]->data_format)-1))
							)){
	
								$e_format->setAttribute("current", "1");
								$data_format_current = true;
							}
							$e_layer_format->appendChild($e_format);
						}
					}
					$e_layer->appendChild($e_layer_format);
	
	
					// LayerStyle
					$e_layer_stylelist = $doc->createElement("StyleList");
		
					for ($k = 0; $k < count($mapObject->wms[$i]->objLayer[$j]->layer_style); $k++){
	
						if ($k == 0){
							$layerStyle_current = 1; // To do: insert proper data
						}
						else{
							$layerStyle_current = 0; // To do: insert proper data
						}
	
						$e_layer_style = $doc->createElement("Style");
	
						$layerStyleSLD = "";
	
						if ($layerStyleSLD){
							$layerStyleSLDUrl = ""; // To Do: Insert Proper Data
							
							$e_layer_style_or = $doc->createElement("OnlineResource");
							$e_layer_style_or->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
							$e_layer_style_or->setAttribute("xlink:type", "simple");
							$e_layer_style_or->setAttribute("xlink:href", $layerStyleSLDUrl);
							$e_layer_style->appendChild($e_layer_style_or);
						}
						else{
							//TODO: determine correct layer style entries
							$layerStyle_name = $mapObject->wms[$i]->objLayer[$j]->layer_style[$k]->name;
							$layerStyle_title = $mapObject->wms[$i]->objLayer[$j]->layer_style[$k]->title;
							$layerStyle_legendUrl = $mapObject->wms[$i]->objLayer[$j]->layer_style[$k]->legendurl;
							$layerStyle_legendUrl_width = ""; // To Do: add proper data
							$layerStyle_legendUrl_height = ""; // To Do: add proper data
							$layerStyle_legendUrl_format = ""; // To Do: add proper data
	
							if ($layerStyle_current == 1){
								$e_layer_style->setAttribute("current", "1");
							}

							$e_layer_style_name = $doc->createElement("Name", $layerStyle_name);
							$e_layer_style->appendChild($e_layer_style_name);

							$e_layer_style_title = $doc->createElement("Title", $layerStyle_title);
							$e_layer_style->appendChild($e_layer_style_title);
							
							
							$e_layer_style_legendurl = $doc->createElement("LegendUrl");
							$e_layer_style_legendurl->setAttribute("width", $layerStyle_legendUrl_width);
							$e_layer_style_legendurl->setAttribute("height", $layerStyle_legendUrl_height);
							$e_layer_style_legendurl->setAttribute("format", $layerStyle_legendUrl_format);

							$e_layer_style_legendurl_or = $doc->createElement("OnlineResource");
							$e_layer_style_legendurl_or->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
							$e_layer_style_legendurl_or->setAttribute("xlink:type", "simple");
							$e_layer_style_legendurl_or->setAttribute("xlink:href", $layerStyle_legendUrl);
							$e_layer_style_legendurl->appendChild($e_layer_style_legendurl_or);
							$e_layer_style->appendChild($e_layer_style_legendurl);
						}
						$e_layer_stylelist->appendChild($e_layer_style);
					}	
					$e_layer->appendChild($e_layer_stylelist);
					
				$e_layer_list->appendChild($e_layer);
			}
		}
	}
	$e_view_context->appendChild($e_layer_list);


$doc->appendChild($e_view_context);
$xml = $doc->saveXML();

if ($save_in_session) {
	if (isset($_SESSION["mb_wmc"])) {
		$_SESSION["mb_wmc"] = $xml;
	}
}
else {
	if ($user_id && $wmc_id) {
		$sql = "INSERT INTO mb_user_wmc VALUES ($1, $2, $3, $4, $5)";
		$v = array($wmc_id, $user_id, $xml, $generalTitle, time());
		$t = array("s", "i", "s", "s", "s");
		
		$res = db_prep_query($sql, $v, $t);
		if (db_error()) {
			 echo "Error while saving WMC document '" . $generalTitle . "': " . db_error();
		}
		else {
			 echo "WMC document '" . $generalTitle . "' has been saved.";
		}
	}
}
?>