/*
* Copyright (c) 2013 Bundesamt by Kartographie und Geodäsie.
* See license.txt in the BKG WebMap distribution or repository for the
* full text of the license.
*
* Author: Dirk Thalheim
*/
/**
* @requires OpenLayers/BaseTypes/Class.js
* @requires OpenLayers/Util.js
* @requires OpenLayers/BaseTypes.js
* @requires BKGWebMap/Control/Geocoder/View.js
* @requires BKGWebMap/Layer/MarkerLayer.js
* @requires BKGWebMap/Util.js
*/
/**
* @classdesc Darstellung von Geocodierungsergebnissen als Layer
*
* @constructor BKGWebMap.Control.Geocoder.LayerView
* @param {object} options
**/
BKGWebMap.Control.Geocoder.LayerView = OpenLayers.Class(BKGWebMap.Control.Geocoder.View, {
/**
* @memberOf BKGWebMap.Control.Geocoder.LayerView
* @type BKGWebMap.Layer.MarkerLayer
*/
layer: null,
/**
* Wenn <code>true</code>, wird automatisch auf die Ausdehnung aller Ergebnisse in der Karte gezoomt.
* @memberOf BKGWebMap.Control.Geocoder.LayerView
* @type boolean
*/
autoZoom: true,
/**
* Titel für Ergebnislayer
* @memberOf BKGWebMap.Control.Geocoder.LayerView
*/
layerName : 'Suchergebnisse',
initialize: function(options) {
OpenLayers.Util.extend(this, options);
},
destroy: function() {
if(this.layer) {
this.layer.destroy();
this.layer = null;
}
},
setMap: function(map) {
BKGWebMap.Control.Geocoder.View.prototype.setMap.apply(this, arguments);
// Layer hinzufügen falls noch nicht geschehen
var resultLayers = map.getLayersByName(this.layerName);
if(resultLayers.length == 0) {
resultLayers.push(new BKGWebMap.Layer.MarkerLayer(this.layerName, {displayInLayerSwitcher: false}));
this.map.addLayer(resultLayers[0]);
}
this.layer = resultLayers[0];
},
/**
* Wird ausgelöst, wenn eine neue Suche gestartet wird.
* @memberOf BKGWebMap.Control.Geocoder.LayerView
* @param {object} evt - Eventobjekt mit element und object
*/
onStartSearch: function(evt) {
this.layer.clearMarkers();
},
/**
* Wird ausgelöst, wenn ein Fehler bei der Geocodierung auftrat.
* @memberOf BKGWebMap.Control.Geocoder.LayerView
* @param {object} evt - Eventobjekt mit element, object und response
* @param {BKGWebMap.Protocol.Geoindex.Response} evt.response
*/
onError: function(evt) {
},
/**
* Wird ausgelöst, wenn die Geocodierung erfolgreich war.
* @memberOf BKGWebMap.Control.Geocoder.LayerView
* @param {object} evt - Eventobjekt mit element, object und response
* @param {BKGWebMap.Protocol.Geoindex.Response} evt.response
*/
onLocationUpdate: function(evt) {
var response = evt.response;
if(!response.features) {
return
}
this.layer.addFeatures(response.features, this.getHtml);
// registriere mousover
BKGWebMap.Util.each(
response.features,
OpenLayers.Function.bind(
function(index, feature) {
if(!feature.marker) return;
var toggleHighligth = function(evt) {
this.geocoder.hoverFeature(feature, this.hover);
OpenLayers.Event.stop(evt);
};
feature.marker.events.register('mouseover', {geocoder: this.geocoder, hover: true}, toggleHighligth);
feature.marker.events.register('mouseout', {geocoder: this.geocoder, hover: false}, toggleHighligth);
},
this
)
);
if (this.autoZoom /* && !result.keepViewPort */) {
this.zoomToDataExtend(response.features);
}
},
getHtml: function(feature, index) {
var text = feature.attributes.text;
var typ = feature.attributes.typ;
return '<div class="featureInfo">' +
'<div class="featureFulltext">' + text + '</div>' +
'<div class="featureType">' + typ + '</div>' +
'<div class=\"featureCoordinates\">(' +
feature.geometry.x + ', ' +
feature.geometry.y +
')</div></div>';
},
/**
* Zoomt auf die Ausdehnung der Features
* @memberOf BKGWebMap.Control.Geocoder.LayerView
* @param {Array<OpenLayers.Feature>} features
*/
zoomToDataExtend: function(features) {
if (features.length == 0) return;
var extent = BKGWebMap.Util.getDataExtent(features, 'bbox');
if(extent.intersectsBounds(this.map.getMaxExtent()))
this.map.zoomToExtent( extent, false );
else
this.map.zoomToMaxExtent();
},
/**
* Eventhandler, wenn Feature hervorgehoben wird.
*
* @memberOf BKGWebMap.Control.Geocoder.ListView
* @param {object} evt - Eventobjekt mit element, feature und Hoverstatus
* @param {OpenLayers.Feature} evt.feature - das hervorzuhebende Feature
* @param {boolean} evt.hover - der Status zum hervorheben
*/
onHoverFeature: function(evt) {
if(!evt.feature.marker) return;
if(evt.hover) {
evt.feature.marker.inflate(1.5);
} else {
evt.feature.marker.inflate(1 / 1.5);
}
},
CLASS_NAME: "BKGWebMap.Control.Geocoder.LayerView"
});