/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


(function($, undefined) {


	$.widget("gcTool.drawFeature", $.ui.gcTool, {

		widgetEventPrefix: "drawFeature",

		options: {
			label: OpenLayers.i18n('Draw'),
			icons: {
				primary: 'draw_feature' // TODO: choose better name
			},
			text: false,
			geometryType: 'line',
			controls: {},
			initControls: ['polygon','line','point'],
			control: null // the active control, because gctool.js wants to activate self.options.control
			// TODO: add vector layer
		},
		
		internalVars: {
			lastPoint: null
		},

		_create: function() {
			var self = this;

			$.ui.gcTool.prototype._create.apply(self, arguments);
			// create controls (one for each geometry type) and add to map
			var vectorLayer = gisclient.componentObjects.gcLayersManager.getEditingLayer();
			if($.inArray('polygon', self.options.initControls) >= 0) {
				self.options.controls.polygon = new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Polygon);
				self.options.controls.polygon.widgetObject = self;
				self.options.controls.polygon.callbacks.point = self._distanceFromLastPoint;
				gisclient.map.addControl(self.options.controls.polygon);
			}
			if($.inArray('line', self.options.initControls) >= 0) {
				self.options.controls.line = new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Path);
				self.options.controls.line.widgetObject = self;
				self.options.controls.line.callbacks.point = self._distanceFromLastPoint;
				gisclient.map.addControl(self.options.controls.line);
			}
			if($.inArray('point', self.options.initControls) >= 0) {
				self.options.controls.point = new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Point);
				gisclient.map.addControl(self.options.controls.point);				
			}
			self.options.controls.modify = new OpenLayers.Control.ModifyFeature(vectorLayer);
			self.options.controls.modify.events.register("beforefeaturehighlighted", self, self._checkFeature);
			self.options.controls.transform = new OpenLayers.Control.TransformFeature(vectorLayer);
			self.options.controls.transform.events.register("beforefeaturehighlighted", self, self._checkFeature);
			self.options.controls.remove = new OpenLayers.Control.SelectFeature(vectorLayer);
			self.options.controls.remove.events.register("beforefeaturehighlighted", self, self._checkFeature);
			self.options.controls.remove.events.register("featurehighlighted", self, self._removeFeature);
			gisclient.map.addControls([self.options.controls.modify, self.options.controls.transform, self.options.controls.remove]);
			
			self.options.control = self.options.controls[self.options.geometryType];
			
		},
		
		_click: function(event) {
			var self = event.data.self;
			
			$.ui.gcTool.prototype._click.apply(self, arguments);

			var dialog = gisclient.componentObjects.editingDialog;
			dialog.toggleTool('drawFeature');
			dialog.openDialog();
		},
		
		_deactivate: function() {
			var self = this;
			
			var dialog = gisclient.componentObjects.editingDialog;
			dialog.closeDialog();
		},
		
		_removeFeature: function(event) {
			var self = this;
			self.options.controls.remove.unselectAll();
			
			var mpControl = gisclient.map.getControlsByClass('OpenLayers.Control.MousePosition');
			var lastLonLat = gisclient.map.getLonLatFromPixel(mpControl[0].lastXy);
			var point = new OpenLayers.Geometry.Point(lastLonLat.lon, lastLonLat.lat);
			
			var string = OpenLayers.i18n('Are you sure you want to delete this geometry?');
			if(confirm(string)) {
				var self = this;
				
				var vectorLayer = gisclient.componentObjects.gcLayersManager.getEditingLayer();
				var feature = vectorLayer.getFeatureById(event.feature.id).clone();
				vectorLayer.destroyFeatures([vectorLayer.getFeatureById(event.feature.id)]);
				
				if(feature.geometry.id.indexOf('Multi') > -1 && feature.geometry.components.length > 1) {
					var minDistance = null;
					var selectedComponent = null;
					$.each(feature.geometry.components, function(e, component) {
						var distance = component.distanceTo(point);
						if(minDistance == null || minDistance > distance) {
							minDistance = distance;
							selectedComponent = component;
						}
					});
					if(selectedComponent != null) {
						self.options.controls.remove.unselectAll();
						feature.geometry.removeComponent(selectedComponent);
						vectorLayer.addFeatures(feature);
					}
				}
			}
		},
		
		_save: function() {
			var self = this;
			
			var vectorLayer = gisclient.componentObjects.gcLayersManager.getEditingLayer();
			var uiHash = self._getUIHash();
			uiHash.features = vectorLayer.features;
			
			self._trigger( "save", null, uiHash);
		},
		
		_distanceFromLastPoint: function(point) {
			var self = this.widgetObject;
			
			if(self.internalVars.lastPoint != null) {
				var distance = self.internalVars.lastPoint.distanceTo(point);
				gisclient.componentObjects.editingDialog.updateFromLastPointDistance(distance.toFixed(3))
			}
			self.internalVars.lastPoint = point.clone();
		},
		
		_checkFeature: function(event) {
			if(event.feature.attributes.redline == 1) OpenLayer.Event.stop(event);
		}
		
	});

	$.extend($.gcTool.drawFeature, {
		version: "3.0.0"
	});
})(jQuery);
