OpenLayers.Control.wnoToolbar = OpenLayers.Class(
  OpenLayers.Control.Panel, {

    /**
     * Constructor: OpenLayers.Control.wnoToolbar
     * Create an editing toolbar for a given layer. 
     *
     * Parameters:
     * layer - {<OpenLayers.Layer.Vector>} 
     * options - {Object} 
     */
    initialize: function(layer, options) {
        OpenLayers.Control.Panel.prototype.initialize.apply(this, [options]);
        
        var path = new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Path, {'displayClass': 'olControlDrawFeaturePath'});
        path.panel = this;
        path.handler.freehandToggle = ''; // disable freehand mode.
        // End on single click, forceing single-part lines.
        path.handler.mousedown = function(evt) {
          if (!this.drawing) {
            if(this.lastDown == null) {
              if(this.persist) {
                this.destroyFeature();
              }
              this.createFeature(evt.xy);
            } else if((this.lastUp == null) || !this.lastUp.equals(evt.xy)) {
              this.addPoint(evt.xy);
            }
            this.mouseDown = true;
            this.lastDown = evt.xy;
            this.drawing = true;
            map.selectControl.deactivate();
            return false;
          } else if(!this.freehandMode(evt)) {
            var index = this.line.geometry.components.length - 1;
            this.line.geometry.removeComponent(this.line.geometry.components[index]);
            this.removePoint();
            this.finalize();
          }
          return false;
        };
        // Add distance label when done.
        path.handler.finalize = function(cancel) {
          var key = cancel ? "cancel" : "done";
          this.drawing = false;
          this.mouseDown = false;
          this.lastDown = null;
          this.lastUp = null;
          map.selectControl.activate();
          this.callback(key, [this.geometryClone()]);
          if (!cancel) {
            // Draw distance labels.
            var points = this.line.geometry.components;
            if (points.length > 1) {
              var start, end, mid, distance;
              for (var i = 1; i < points.length; i++) {
                start = points[i - 1];
                end = points[i];
                distance = this.line.geometry.getLength();
                mid = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(
                  end.x - (end.x - start.x) / 2,
                  end.y - (end.y - start.y) / 2
                ));
                mid.attributes = {label: distance > klinly ? (Math.round(distance / klinly * 100)/100 +" lightyears") : (parseInt(distance)+" kliks")};
                this.layer.map.labelLayer.addFeatures([mid]);
              }
            }
          };
          if(cancel || !this.persist) {
              this.destroyFeature();
          }
          this.control.panel.activateControl(this.control.panel.controls[0]);
        };
        
		point = new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Point, {'displayClass': 'olControlDrawFeaturePoint'});
		point.panel = this;
		point.handler.finalize = function(cancel) {
			var key = cancel ? "cancel" : "done";
	        this.drawing = false;
	        this.mouseDown = false;
	        this.lastDown = null;
	        this.lastUp = null;
	        this.callback(key, [this.geometryClone()]);
			if (!cancel) {
				var label = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(
					this.point.geometry.x,
					this.point.geometry.y
				));
				label.attributes = {label:this.point.geometry.y + " " + this.point.geometry.x};
				this.layer.map.labelLayer.addFeatures([label]);
			}
	        if(cancel || !this.persist) {
	            this.destroyFeature();
	        }
			this.control.panel.activateControl(this.control.panel.controls[0]);
		};
		
        this.addControls([ new OpenLayers.Control.Navigation() ]);  
        var controls = [point, path];
        this.addControls(controls);
    },

    /**
     * Method: draw
     * calls the default draw, and then activates mouse defaults.
     *
     * Returns:
     * {DOMElement}
     */
    draw: function() {
        var div = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);
        this.activateControl(this.controls[0]);
        return div;
    },

    CLASS_NAME: "OpenLayers.Control.EditingToolbar"
});    