SIX.Tool.Query = function (parent, nQueryType, sImage, sToolTip, params)
{
	SIX.Tool.call(this, parent, SIX.eToolTypes.EXCLUSIVE, sImage, sToolTip, params);
	var toolData = {nQueryType : nQueryType};
	this.addCallback(SIX.eToolCallbacks.ONACTIVATE,
					function (map, data) {
						map.setPointerMode(PM_POINTER);
						map.initQuery(this);
						map.nQueryType = data.nQueryType;
						map.queryPoints = new Array();
						
						if (map.editLayer)
							map.setLayerParameter(map.editLayerName,"visibility=true;polygon1=");
						
						if (data.nQueryType == SIX.eQueryTypes.ZONES)
								map.promptQueryZonesParams(this);
						
						if (data.nQueryType == SIX.eQueryTypes.POLYGON)
						{
							var aServices = this.getAttachedServices();
							if (aServices)
							{
								for (var i=0; i<aServices.length; i++)
								{
									var service = aServices[i];
									service.performQueries(map);
								}	
							}
						}
					}, toolData);
	
	this.addCallback(SIX.eToolCallbacks.ONDEACTIVATE,
					function (map, data) {
						map.nQueryType = SIX.eQueryTypes.NONE;
						if (data.nQueryType == SIX.eQueryTypes.ZONES)
						{
							map.resetQueryZonesLayers();
							map.aQueryZones.length = 0;
						}
					}, toolData);
					
	this.addCallback(SIX.eToolCallbacks.ONMAPLOAD, 
					function (map, data) {
						if (data.nQueryType == SIX.eQueryTypes.ZONES)
						{
							if (map.aQueryZones.length)
								map.drawQueryZones(); 
						}
					}, toolData);						
	
	this.addCallback(SIX.eToolCallbacks.ONMAPMOUSEMOVE, 
					function (map) {
						map.drawQuery(map.dMouseWorldX, map.dMouseWorldY, map.dMouseScreenX, map.dMouseScreenY);
					});
	
	this.addCallback(SIX.eToolCallbacks.ONMAPMOUSEDOWN, 
					function (map) {
						map.checkVectorLayerExists();
						map.queryPoints = new Array();
						if (map.editLayer)
							map.setLayerParameter(map.editLayerName,"visibility=true;polygon1=");				

						switch (map.nQueryType)
						{
							case SIX.eQueryTypes.RECTANGLE :
							case SIX.eQueryTypes.POINT :
								map.addQueryPoint(map.dMouseWorldX, map.dMouseWorldY, map.dMouseScreenX, map.dMouseScreenY);
								map.drawQuery(map.dMouseWorldX, map.dMouseWorldY, map.dMouseScreenX, map.dMouseScreenY);
							break;
							case SIX.eQueryTypes.POINT_LABEL :
							case SIX.eQueryTypes.POINT_OR_RECTANGLE :	
								map.addQueryPoint(map.dMouseWorldX, map.dMouseWorldY, map.dMouseScreenX, map.dMouseScreenY);
							break;
							case SIX.eQueryTypes.ZONES :
								map.pointQueryZonesCenter = map.addQueryPoint(map.dMouseWorldX, map.dMouseWorldY, map.dMouseScreenX, map.dMouseScreenY);
								map.drawQueryZones(); 
								var aServices = this.getAttachedServices();
								if (aServices)
								{
									for (var i=0; i<aServices.length; i++)
									{
										var service = aServices[i];
										service.queries.setSelectedQueryZone(0);
										service.performQueries(map);
									}	
								}					
							break;
							default:
							break;
						}
					});
	
	this.addCallback(SIX.eToolCallbacks.ONMAPMOUSEUP,
					function (map) {
						switch(map.nQueryType)
						{
							case SIX.eQueryTypes.POINT :
							case SIX.eQueryTypes.POINT_LABEL :
								var aServices = this.getAttachedServices();
								for (var i=0; i<aServices.length; i++)
									aServices[i].performQueries(map);									
							break;							
							case SIX.eQueryTypes.POINT_OR_RECTANGLE :
							case SIX.eQueryTypes.RECTANGLE :					
								map.drawQuery(map.dMouseWorldX, map.dMouseWorldY, map.dMouseScreenX, map.dMouseScreenY);
								if (map.queryPoints.length == 1)
								{
									var point = map.queryPoints[0];
									if( Math.abs(map.dMouseScreenX - point.screenX) > 6 || Math.abs(map.dMouseScreenY - point.screenY) > 6 )
										map.addQueryPoint(map.dMouseWorldX, map.dMouseWorldY, map.dMouseScreenX, map.dMouseScreenY);
									var aServices = this.getAttachedServices();
									for (var i=0; i<aServices.length; i++)
										aServices[i].performQueries(map);
								}
							break;					
							default :
							break;
						}
						map.clearDrawingObjects();
					});
}
SIX.Util.extend(SIX.Tool.Query, SIX.Tool);
