[Mapbender-dev] gazetteer listing

Balázs Bámer bamerbalazs at gmail.com
Wed Mar 18 10:10:14 EDT 2009


Hi All,

I suggest the following changes to gazetteer listing format and operation:
- Table format with header instead of plain divs
- Remove built-in leading and trailing * (joker) characters from
search string as it provides misleading operation, too many hits. User
could include jokers where really needed.
- Limit hit list to for example 100 records. For me, 700 caused
unrecoverable blocking in browser (reload helped).

file in question:
http/javascripts/mod_wfs_gazetteer_client.php


best regards: Balázs Bámer
-------------- next part --------------
<?php 
# $Id: mod_wfs_gazetteer_client.php 2320 2008-04-01 12:44:25Z christoph $
# maintained by http://www.mapbender.org/index.php/User:Verena Diewald
# http://www.mapbender.org/index.php/WFS_gazetteer
# 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_validatePermission.php");

$gui_id = $_SESSION["mb_user_gui"];
$target = $_REQUEST["e_target"];
$isLoaded = $_REQUEST["isLoaded"];

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset='<?php echo CHARSET;?>'">	
<title>mod_wfs_gazetteer</title>

<?php
include '../include/dyn_css.php';
?>
<script type="text/javascript">
<?php 
	include '../include/dyn_js.php';
	include '../include/dyn_php.php';
	
	echo "var targetString = '" . $target . "';";
	echo "var wfsConfIdString = '" . $wfsConfIdString . "';";
	echo "var e_id_css = '" . $e_id_css . "';";
?>

// Element var maxHighlightedPoints
try{
	if (maxHighlightedPoints){
		maxHighlightedPoints = Number(maxHighlightedPoints);

		if (isNaN(maxHighlightedPoints)) {
//			var e = new parent.Mb_warning("mod_wfs_gazetteer_client.php: Element var maxHighlightedPoints must be a number.");
		}
	}
}
catch(e){
	maxHighlightedPoints = 0;
//	var e = new parent.Mb_warning("mod_wfs_gazetteer_client.php: Element var maxHighlightedPoints is not set, see 'edit element vars'.");
}

var targetArray = targetString.split(",");
var global_wfsConfObj;
var global_selectedWfsConfId;
var point_px = 10;
var resultGeom = null;
var cw_fillcolor = "#cc33cc";


parent.mb_registerInitFunctions("window.frames['"+this.name+"'].initModWfsGazetteer()");

function openwindow(Adresse) {
	Fenster1 = window.open(Adresse, "Informationen", "width=500,height=500,left=100,top=100,scrollbars=yes,resizable=no");
	Fenster1.focus();
}
//----------------------------------------------------------------------------------

function appendWfsConf(newWfsConfIdString) {
	// merge with existing wfs conf ids
	if (wfsConfIdString !== "") {
		if (newWfsConfIdString !== "") {
			wfsConfIdString += "," + newWfsConfIdString;

			// rebuild form
			initModWfsGazetteer();
		}
	}
	else {
		wfsConfIdString = newWfsConfIdString;

		// rebuild form
		initModWfsGazetteer();
	}
	
}

function removeChildNodes(node) {
	while (node.childNodes.length > 0) {
	  var childNode = node.firstChild;
		node.removeChild(childNode);
	}
}

/**
 * removes whitespaces and endlines before and after a string
 *
 */ 
function trimString (str) {
	return str.replace(/^\s+|\s+|\n+$/g, '');
}

function appendStyles() {
	var styleObj;
	var rule = global_wfsConfObj[global_selectedWfsConfId].g_style + global_wfsConfObj[global_selectedWfsConfId].g_res_style;
	if (parent.ie) {
		var styleSheetObj=document.createStyleSheet();
		styleObj=styleSheetObj.owningElement || styleSheetObj.ownerNode;
		styleObj.setAttribute("type","text/css");
		ruleArray = rule.split("}");
		for (var i=0; i < ruleArray.length - 1; i++) {
			var currentRule = trimString(ruleArray[i]);
			var nameValueArray = currentRule.split("{");
			var name = nameValueArray[0];
			var value = nameValueArray[1];
			styleSheetObj.addRule(name,value);
		}
	}
	else {
		styleObj=document.createElement("style");
		styleObj.setAttribute("type","text/css");
		document.getElementsByTagName("head")[0].appendChild(styleObj);
		styleObj.appendChild(document.createTextNode(rule+"\n"));		
	}
}

//----------------------------------------------------------------------------------


function initModWfsGazetteer() {
	// empty nodes
	var nodesToEmpty = ["selectWfsConfForm", "wfsForm", "res", "wfsInfo"];
	while (nodesToEmpty.length > 0) {
		var currentId = nodesToEmpty.pop();
		var currentNode = document.getElementById(currentId);
		removeChildNodes(currentNode);
	}
	document.getElementById("wfsGeomType").style.visibility = "hidden";
	document.getElementById("wfsRemove").style.visibility = "hidden";
	
	parent.mb_ajax_json("../php/mod_wfs_gazetteer_server.php", {command:"getWfsConf",wfsConfIdString:wfsConfIdString}, function(json, status) {
		global_wfsConfObj = json;
		var wfsCount = 0;
		for (var wfsConfId in global_wfsConfObj) {
			global_selectedWfsConfId = wfsConfId; 
			if (typeof(global_wfsConfObj[wfsConfId] != 'function')) {
				wfsCount++;
			}
		}
		if (wfsCount === 0) {
			var e = new parent.Mb_exception("no wfs conf id available.");
		}
		else if (wfsCount === 1) {
			appendStyles();
			appendWfsForm();
			setWfsInfo();	
		}
		else {
			appendWfsConfSelectBox();
			setWfsInfo();	
		}
		parent.mb_setWmcExtensionData({"wfsConfIdString":wfsConfIdString});
	});
}

function setWfsInfo() {
	var bulbNode = document.getElementById("wfsInfo"); 	

	// append bulb image
	removeChildNodes(bulbNode);
	var imgNode = document.createElement("img");
	imgNode.id = "wfsInfoImg";
	//imgNode.src = "../img/button_digitize/geomInfo.png";
	imgNode.src = "../img/tree_new/info.png";
	imgNode.border = 0;
	bulbNode.appendChild(imgNode);
	bulbNode.href = "javascript:openwindow('../php/mod_featuretypeMetadata.php?wfs_conf_id=" + global_selectedWfsConfId.toString() + "');";
	bulbNode.style.visibility = "visible";
	
	// set wfsGeomType image
	var wfsGeomTypeNode = document.getElementById("wfsGeomType");
	var wfsGeomType = "";
	for (var i=0; i < global_wfsConfObj[global_selectedWfsConfId].element.length; i++) {
		if (parseInt(global_wfsConfObj[global_selectedWfsConfId].element[i].f_geom)) {
			wfsGeomType = global_wfsConfObj[global_selectedWfsConfId].element[i].element_type;
		}
	}
	if (wfsGeomType.match(/Point/)) {
		wfsGeomTypeNode.src = "../img/button_digitize/point.png";
		wfsGeomTypeNode.style.visibility = 'visible';
	}
	else if (wfsGeomType.match(/Line/)) {
		wfsGeomTypeNode.src = "../img/button_digitize/line.png";
		wfsGeomTypeNode.style.visibility = 'visible';
	}
	else if (wfsGeomType.match(/Polygon/)) {
		wfsGeomTypeNode.src = "../img/button_digitize/polygon.png";
		wfsGeomTypeNode.style.visibility = 'visible';
	}
	else {
		var e = new parent.Mb_exception("WFS gazetteer: geometry type unknown.");		
	}
	
	// set image: remove this WFS
	var wfsRemoveNode = document.getElementById("wfsRemove");
	//wfsRemoveNode.src = "../img/button_digitize/geomRemove.png";
	wfsRemoveNode.src = "../img/tree_new/delete_wms.png";
	wfsRemoveNode.style.visibility = 'visible';
	// Internet explorer
	if (parent.ie) {
		wfsRemoveNode.onclick = function() {
			var x = new Function ("", "delete global_wfsConfObj[global_selectedWfsConfId];setWfsConfIdString();initModWfsGazetteer();parent.mb_setWmcExtensionData({'wfsConfIdString':wfsConfIdString});"); 
			x(); 
		};
	}
	// Firefox
	else {
		wfsRemoveNode.onclick = function () {
			delete global_wfsConfObj[global_selectedWfsConfId];
			setWfsConfIdString();
			initModWfsGazetteer();			
			parent.mb_setWmcExtensionData({"wfsConfIdString":wfsConfIdString});
		}
	}
}

function setWfsConfIdString() {
	var str = [];
	for (var wfsConfId in global_wfsConfObj) {
		global_selectedWfsConfId = wfsConfId; 
		if (typeof(global_wfsConfObj[wfsConfId] != 'function')) {
			str.push(wfsConfId);
		}
	}
	wfsConfIdString = str.join(",");
}

function appendWfsConfSelectBox() {
	var selectNode = document.createElement("select");
	selectNode.name = "wfs_conf_sel";
	var wfsFormNode = document.getElementById("selectWfsConfForm");
	selectNode.onchange = function() {
		global_selectedWfsConfId = this.value;
		setWfsInfo();
		appendStyles();
		appendWfsForm();
	};
	var isSelected = false;
	for (var wfsConfId in global_wfsConfObj) {
		var optionNode = document.createElement("option");
		
		optionNode.value = wfsConfId;
		optionNode.innerHTML = global_wfsConfObj[wfsConfId].g_label;

		if (!isSelected) {
			optionNode.selected = true;
			isSelected = true;
			global_selectedWfsConfId = wfsConfId;
		}
		selectNode.appendChild(optionNode);
	}

	var form = document.getElementById('selectWfsConfForm');
	form.appendChild(selectNode);
	
	appendStyles();
	appendWfsForm();
}

function appendWfsForm() {
	var form = document.getElementById("wfsForm");
	removeChildNodes(form);
	var resultDiv = document.getElementById("res");
	removeChildNodes(resultDiv);
	
	var divContainer = document.createElement("div");
	divContainer.className = global_wfsConfObj[global_selectedWfsConfId].g_label_id;
	
	divContainer.innerHTML = global_wfsConfObj[global_selectedWfsConfId].g_label;
	
	form.appendChild(divContainer);

	var wfsConfElementArray = global_wfsConfObj[global_selectedWfsConfId].element;

	for (var i = 0; i < wfsConfElementArray.length; i++){
		if (parseInt(wfsConfElementArray[i].f_search)) {
			var spanNode = document.createElement("span");
			spanNode.setAttribute("id", "ttttt");
			spanNode.className = wfsConfElementArray[i].f_label_id;
			spanNode.innerHTML = wfsConfElementArray[i].f_label;
			var inputNode = document.createElement("input");
			inputNode.type = "text";
			inputNode.className = wfsConfElementArray[i].f_style_id;
			inputNode.id = wfsConfElementArray[i].element_name;
			
			form.appendChild(spanNode);
			form.appendChild(inputNode);
			form.appendChild(document.createElement("br"));
		}
	}
	var submitButton = document.createElement("input");
	submitButton.type = "submit";
	submitButton.className = global_wfsConfObj[global_selectedWfsConfId].g_button_id;
	submitButton.value = global_wfsConfObj[global_selectedWfsConfId].g_button;
	
	form.appendChild(submitButton);
}

function validate(){
	global_resultHighlight = new parent.Highlight(targetArray, "wfs_gazetteer_highlight", {"position":"absolute", "top":"0px", "left":"0px", "z-index":100}, 2);

	var filterParameterCount = getNumberOfFilterParameters();
	
	if(filterParameterCount == 0){
		return false;
	}
	else{
		var andConditions = "";
		
		var el = global_wfsConfObj[global_selectedWfsConfId].element;

		for (var i = 0; i < el.length; i++) {
			if (el[i]['f_search'] == 1 && document.getElementById(el[i]['element_name']).value != '') {
		
				var a = new Array();
				a = document.getElementById(el[i]['element_name']).value.split(",");
				var orConditions = "";
				for (var j=0; j < a.length; j++) {
					
					orConditions += "<ogc:PropertyIsLike wildCard='*' singleChar='.' escape='!'>";
					orConditions += "<ogc:PropertyName>" + el[i]['element_name'] + "</ogc:PropertyName>";
					orConditions += "<ogc:Literal>";
					if(el[i]['f_toupper'] == 1){
						orConditions += a[j].toUpperCase();
					}
					else{
						orConditions += a[j];
					}
					orConditions += "</ogc:Literal>";
					orConditions += "</ogc:PropertyIsLike>";
				}
				if(a.length > 1){
					andConditions += "<Or>" + orConditions + "</Or>";
				}
				else {
					andConditions += orConditions;
				}
			}
		}

		var u = global_wfsConfObj[global_selectedWfsConfId].wfs_getfeature + parent.mb_getConjunctionCharacter(global_wfsConfObj[global_selectedWfsConfId].wfs_getfeature);
		u += "REQUEST=getFeature&Typename="+global_wfsConfObj[global_selectedWfsConfId].featuretype_name+"&Version=1.0.0&service=WFS";
		u += "&filter=";

		if (filterParameterCount > 1) {
			andConditions = "<And>" + andConditions + "</And>";
		}

		var filter = "<ogc:Filter xmlns:ogc='http://ogc.org' xmlns:gml='http://www.opengis.net/gml'>"+andConditions+"</ogc:Filter>";

		document.getElementById("res").innerHTML = "<table><tr><td><img src='../img/indicator_wheel.gif'></td><td>Searching...</td></tr></table>";
		var parameters = {command:"getSearchResults", "wfs_conf_id":global_selectedWfsConfId, "frame":this.name, "url":u, "filter":filter, "backlink":""};
		parent.mb_ajax_get("../php/mod_wfs_gazetteer_server.php", parameters, function (jsCode, status) {
			document.getElementById("res").innerHTML = "<table><tr><td>Arranging search results...</td></tr></table>";
			
			eval(jsCode);
			
			for (var i=0; i < parent.wms.length; i++) {
				for (var j=0; j < parent.wms[i].objLayer.length; j++) {
	
					var currentLayer = parent.wms[i].objLayer[j];
					var wms_id = parent.wms[i].wms_id; 
	
					if (currentLayer.gui_layer_wfs_featuretype == global_selectedWfsConfId) {
						var layer_name = currentLayer.layer_name; 
						parent.handleSelectedLayer_array(targetArray[0],[wms_id],[layer_name],'querylayer',1); 
						parent.handleSelectedLayer_array(targetArray[0],[wms_id],[layer_name],'visible',1);
					}
				}
			}
			
			var body = "";
			if (typeof(geom) == 'object') {
				body+="<table cellpadding=1><tr>";
                                var sorted=new Array(el.length);
                                for (var i = 0; i < el.length; i++){
                                        sorted[i]=el[i].f_respos+"~"+el[i].f_label;
                                }
                                sorted.sort(
function (a,b){
        var aa=a.substring(0,a.indexOf("~"));
        var bb=b.substring(0,b.indexOf("~"));
        return aa-bb;
}
                                );
                                for(var i=0; i<sorted.length; i++) {
                                        var label=sorted[i].substring(sorted[i].indexOf("~")+1);
                                        if(label.length>0) {
                                                body+="<td>";
                                                body+=label;
                                                body+="</td>";
                                        }
                                }
                                body+="</tr>";
				resultGeom = geom; // set the global variable
				for (var i=0; i < geom.count(); i++) {
					body += "<tr id='geom"+i+"'style='cursor:pointer;' ";
					if ((i % 2) === 0) {
						body += "class='even'";
					}
					else {
						body += "class='uneven'";
					}
					body += " onmouseover=\"setResult('over', this.id)\" ";
					body += " onmouseout=\"setResult('out', this.id)\" ";
					body += " onclick=\"setResult('click', this.id)\">";
					for (var j=0; j < geom.get(i).e.count(); j++) {
						body +="<td>";
						body += geom.get(i).e.getValue(j) + " ";
						body +="</td>";
					}
					body += "</tr>";
				}
				body += "</table>";
			}
			else {
				body = "Kein Ergebnis.";
			}
			document.getElementById('res').innerHTML = body;
		});
	}
	return false;
}

function getNumberOfFilterParameters(){
	var cnt = 0;
	var el = global_wfsConfObj[global_selectedWfsConfId].element;

	for (var i = 0; i < el.length; i++){
		if( el[i]['f_search'] == 1){
			if (document.getElementById(el[i]['element_name']).value != '') {
				cnt++;
			}
		}
	}
	return cnt;
}
/*
* event -> {over || out || click}
* geom -> commaseparated coordinates x1,y1,x2,y2 ...
*/
function setResult(event, id){
	var index = parseInt(id.slice(4));

	var currentGeom = resultGeom.get(index);
	if (maxHighlightedPoints > 0 && currentGeom.getTotalPointCount() > maxHighlightedPoints) {
		currentGeom = currentGeom.getBBox4();
	}
	if (event == "over") {
		global_resultHighlight.add(currentGeom, cw_fillcolor);
		global_resultHighlight.paint();
	}
	else if (event == "out"){
		global_resultHighlight.del(currentGeom, cw_fillcolor);
		global_resultHighlight.paint();
	}
	else if (event == "click"){
		global_resultHighlight.del(currentGeom, cw_fillcolor);
		var bbox = currentGeom.getBBox();
		var bufferFloat = parseFloat(global_wfsConfObj[global_selectedWfsConfId].g_buffer);
		var buffer = new parent.Point(bufferFloat,bufferFloat);
		bbox[0] = bbox[0].minus(buffer);
		bbox[1] = bbox[1].plus(buffer);
		parent.mb_calculateExtent(targetArray[0], bbox[0].x, bbox[0].y, bbox[1].x, bbox[1].y);
		parent.zoom(targetArray[0], 'true', 1.0);
		global_resultHighlight.add(currentGeom, cw_fillcolor);
		global_resultHighlight.paint();
	}
	return true;
}
</script>
</head>
<body leftmargin='0' topmargin='10'  bgcolor='#ffffff'>
<form name='selectWfsConfForm' id='selectWfsConfForm'></form>
<img src = "" name='wfsGeomType' id='wfsGeomType'>
<img src = "" name='wfsRemove' id='wfsRemove'>
<a name='wfsInfo' id='wfsInfo'></a>
<form name='wfsForm' id='wfsForm' onsubmit='return validate()'></form>
<div name='res' id='res' style='width:180px'></div>
</body>
</html>


More information about the Mapbender_dev mailing list