Source: BKGWebMap/Control/Geocoder/LayerView.js

/*
 * 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"
});