var popup;
var previouslonlat;
var measureControls;

function setupMeasureControls(){
    
    // style the sketch fancy
    var sketchSymbolizers = {
        "Point": {
            pointRadius: 4,
            graphicName: "square",
            fillColor: "white",
            fillOpacity: 1,
            strokeWidth: 1,
            strokeOpacity: 1,
            strokeColor: "#333333"
        },
        "Line": {
            strokeWidth: 3,
            strokeOpacity: 1,
            strokeColor: "#666666",
            strokeDashstyle: "dash"
        },
        "Polygon": {
            strokeWidth: 2,
            strokeOpacity: 1,
            strokeColor: "#666666",
            fillColor: "white",
            fillOpacity: 0.3
        }
    };
    var style = new OpenLayers.Style();
    style.addRules([
        new OpenLayers.Rule({symbolizer: sketchSymbolizers})
    ]);
    var styleMap = new OpenLayers.StyleMap({"default": style});
    
    measureControls = {
        line: new OpenLayers.Control.Measure(
            OpenLayers.Handler.Path, {
                persist: true,
                handlerOptions: {
                    layerOptions: {styleMap: styleMap}
                }
            }
        ),
        polygon: new OpenLayers.Control.Measure(
            OpenLayers.Handler.Polygon, {
                persist: true,
                handlerOptions: {
                    layerOptions: {styleMap: styleMap}
                }
            }
        )
    };
    
    var control;
    for(var key in measureControls) {
        control = measureControls[key];
        control.events.on({
            "measure": handleMeasurements,
            "measurepartial": handleMeasurements
        });
        map.addControl(control);
    }
    document.getElementById('noneToggle').checked = true;
}

function handleMeasurements(event) {
    var geometry = event.geometry;
    var units = event.units;
    var order = event.order;
    var measure = event.measure;
    var element = document.getElementById('measureOutput');
    var out = "";
    var m = measure.toFixed(3).toString().replace(".",",");
    if(order == 1) {
        out += "Messung: " + m + " " + units;
    } else {
        out += "Messung: " + m + " " + units + "<sup>2</" + "sup>";
    }
    element.innerHTML = out;
}

function toggleControl(element) {
    for(key in measureControls) {
        var control = measureControls[key];        
        if(element.value == key && element.checked) {
            control.activate();
        } else {
            control.deactivate();
        }
    }
}

function toggleGeodesic(element) {
    for(key in measureControls) {
        var control = measureControls[key];
        control.geodesic = element.checked;
    }
}






function toggle_popup( e, lonlat ) {    
	if(popup_overlaps(e)) return;
	url = "/_interaktive_karte/planquery.php";
	params = { 
	stadt_id: map_config.stadt_id,     
	epsg: map_config.epsg,
	x: lonlat.lon,
	y: lonlat.lat };
	new OpenLayers.Ajax.Request(url, {
		method: 'get',
		parameters: params,
		onSuccess: function(transport) {			
			if(popup) map.removePopup(popup);
			popup = new OpenLayers.Popup("context_popup", 
				lonlat,
				new OpenLayers.Size(200,200),
				transport.responseText,
				true);	
			popup.autoSize = true;
			popup.panMapIfOutOfView = true;
			//popup.closeOnMove = true;
			popup.backgroundColor = "transparent";
			map.addPopup(popup);
		},
		onFailure : function(transport) {
			if(popup) map.removePopup(popup);
		}
	});	
}  	

function getPos(obj) {
	var output = new Object();
	var mytop=0, myleft=0;
	while( obj) {
		mytop+= obj.offsetTop;
		myleft+= obj.offsetLeft;
		obj= obj.offsetParent;
	}
	output.left = myleft;
	output.top = mytop;
	return output;
}

function popup_overlaps(evt) {
	if(typeof popup == "undefined") return false;
	if(!popup) return false;
	var popupPos = getPos(popup.div);
	var mapPos = getPos(document.getElementById("map"));
    var ol = popupPos.left;
    var or = ol+popup.size.w;
    var ot = popupPos.top;
    var ob = ot+popup.size.h;
    var x = evt.xy.x + mapPos.left;
    var y = evt.xy.y + mapPos.top;
    if(x > ol && x < or && y > ot && y < ob) return true;
	return false;
}

OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
    defaultHandlerOptions: {
        'single': true,
        'double': false,
        'pixelTolerance': 0,
        'stopSingle': false,
        'stopDouble': false
    },

    initialize: function(options) {
        this.handlerOptions = OpenLayers.Util.extend(
            {}, this.defaultHandlerOptions
        );
        OpenLayers.Control.prototype.initialize.apply(
            this, arguments
        ); 
        this.handler = new OpenLayers.Handler.Click(
            this, {
                'click': this.onClick
            }, this.handlerOptions
        );
    }, 

    onClick: function(evt) {
		var lonlat = map.getLonLatFromPixel( evt.xy );	
		//var output = document.getElementById(this.key);
		//output.innerHTML = output.innerHTML + lonlat + "<br>";				
		if(lonlat != previouslonlat && popup) {
			var ol = popup.div.offsetLeft;
			var or = ol+popup.size.w;
			var ot = popup.div.offsetTop;
			var ob = ot+popup.size.h;
			var x = evt.xy.x;
			var y = evt.xy.y;
			if(x > ol && x < or && y > ot && y < ob) return;
		}	
		previouslonlat = lonlat;
		toggle_popup( evt, lonlat );
    }
});


OpenLayers.Control.Hover = OpenLayers.Class(OpenLayers.Control, {                
	defaultHandlerOptions: {
		'delay': 500,
		'pixelTolerance': 10,
		'stopMove': false
	},

	initialize: function(options) {
		this.handlerOptions = OpenLayers.Util.extend(
			{}, this.defaultHandlerOptions
		);
		OpenLayers.Control.prototype.initialize.apply(
			this, arguments
		); 
		this.handler = new OpenLayers.Handler.Hover(
			this,
			{'pause': this.onPause, 'move': this.onMove},
			this.handlerOptions
		);
	}, 
	

	onPause: function(evt) {	
	    if(document.getElementById('noneToggle') && !document.getElementById('noneToggle').checked) return;		
		var lonlat = map.getLonLatFromPixel( evt.xy );
		var output = document.getElementById(this.key);
		if(output) output.innerHTML = output.innerHTML + lonlat + "<br>";
		if(popup) {
			var ol = popup.div.offsetLeft;
			var or = ol+popup.size.w;
			var ot = popup.div.offsetTop;
			var ob = ot+popup.size.h;
			var x = evt.xy.x;
			var y = evt.xy.y;
			if(x > ol && x < or && y > ot && y < ob) return;
		}	
		toggle_popup( evt, lonlat );
	},

	onMove: function(evt) {
		// if this control sent an Ajax request (e.g. GetFeatureInfo) when
		// the mouse pauses the onMove callback could be used to abort that
		// request.
	}
});

