[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