Source: BKGWebMap/Control.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/Util.js
 * @requires OpenLayers/Control/PanZoomBar.js
 * @requires OpenLayers/Control/Panel.js
 * @requires OpenLayers/Control/NavToolbar.js
 * @requires OpenLayers/Control/MousePosition.js
 * @requires OpenLayers/Control/ScaleLine.js
 */

/**
 * @namespace BKGWebMap.Control
 */
BKGWebMap.Control = BKGWebMap.Control || {};

/**
 * Factory-Funktion zur Generierung von Steuerelementen.<br/>
 * Es wird ein JavaScript Objekt übergeben, das die zu generierenden Steuerelemente konfiguriert. Über den Attributnamen
 * wird entschieden welches Steuerelement generiert werden soll. Der Attributwert wird zur Konfiguration des
 * Steuerelements verwendet. Details dazu finden sich in der <a href="../factories.html#controls">MapBuilder-Referenz</a>.
 * <br/>
 * Die generierten OpenLayers.Control-Instanzen werden der <code>controls</code>-Liste hinzugefügt.
 *
 * @param {object} config - Konfiguration der Steuerelemente als object, wobei der key den Control-Typ definiert.
 * @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
 *                                               eingefügt werden sollen.
 * @returns {Array<OpenLayers.Control>} - Zurückgegeben wird die modifizierte Liste der Steuerelemente.
 */
BKGWebMap.Control.create = function(config, controls) {
    controls = controls || [];

    // SidePanel ggf. zuerst behandeln
    BKGWebMap.Control.FACTORIES['sidePanel'](controls, config.sidePanel);
    delete config.sidePanel;

    // Konfigurierbare der restlichen Steuerelemente
    for (var key in config) {
        if(!config.hasOwnProperty(key)) continue;

        // Direkte Übergabe eines Control-Elements
        if(config[key] instanceof OpenLayers.Control) {
            controls.push(config[key]);
            continue;
        }

        // Control aus Konfiguration erzeugen
        var factory =  BKGWebMap.Control.FACTORIES[key];
        if(!factory) continue;

        factory(controls, config[key]);
    }
    return controls;
};

/**
 * Registry für Factory-Funktionen zur Controlgenerierung.
 *
 * Funktionen erwarten Zielliste <code>controls</code>, in die Steuerelemente eingefügt werden sollen und Konfiguration
 * des Steuerelements (Typ abhängig von Funktion). Es können weitere Funktionen zur Layergenerierung registriert werden.
 *
 * @type {object<string, Function>}
 */
BKGWebMap.Control.FACTORIES = {};

/**
 * Fügt die Zoom-Steuerelemente der Control-Liste hinzu.
 * @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
 *                                               eingefügt werden sollen.
 * @param {boolean} usePanZoomBar - true wenn OpenLayers.Control.PanZoomBar verwendet werden soll. Ansonsten wird
 *                                  OpenLayers.Control.Zoom verwendet.
 */
BKGWebMap.Control.FACTORIES['zoomBar'] = function(controls, usePanZoomBar) {
    if(usePanZoomBar) {
        controls.push(new OpenLayers.Control.PanZoomBar());
    } else {
        if (OpenLayers.Control.Zoom) {
            controls.push(new OpenLayers.Control.Zoom());
        } else if (OpenLayers.Control.PanZoom) {
            controls.push(new OpenLayers.Control.PanZoom());
        }
    }
};

/**
 * Fügt ein Panel für weitere Steuerelemente der Karte hinzu.
 * @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
 *                                               eingefügt werden sollen.
 * @param {object} config - Konfiguration für Panel.
 * @param {object} config.controls - Konfiguration für Steuerelemente im Panel (s. Konstruktor OpenLayers.Control.Panel).
 */
BKGWebMap.Control.FACTORIES['panel'] = function(controls, config) {
    if (!config) return;

    var subControls = [];
    if (config.controls) {
        subControls = BKGWebMap.Control.create(config.controls);
        delete config.controls;
    }
    var panel = new OpenLayers.Control.Panel(config);
    panel.addControls(subControls);

    controls.push(panel);
};

/**
 * Fügt das SidePanel der Control-Liste hinzu.
 * @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
 *                                               eingefügt werden sollen.
 * @param {object} config - Konfiguration für das SidePanel (s.  BKGWebMap.Control.SidePanel).
 */
BKGWebMap.Control.FACTORIES['sidePanel'] = function(controls, config) {
    if (!config) return;

    config.size = config.size || 250;
    config.maximized = config.maximized || false;
    controls.push(new BKGWebMap.Control.SidePanel(config));
};

/**
 * Fügt eine ScaleLine der Control-Liste hinzu.
 * @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
 *                                               eingefügt werden sollen.
 * @param {boolean} enabled - <code>true</code> wenn ScaleLine verwendet werden soll
 */
BKGWebMap.Control.FACTORIES['scaleLine'] = function(controls, enabled) {
    if (!enabled) return;
    controls.push(new OpenLayers.Control.ScaleLine());
};