// I am sorry for the bad coding... this is not Ricardo!... It is Fred and Fred do not care about this....
function getMapWindowSize()
{                      	
   var zsh = screen.height;
   var zsw = screen.width;  
    
   if (zsw >= 1600)
   {
        document.Form1.mapWindowWidth.value = 1480 - 480;
   }
   else if (zsw >= 1280)
   {
        document.Form1.mapWindowWidth.value = 1240 - 480;
   }
   else
   {
        document.Form1.mapWindowWidth.value = zsw - 500;
   }
    
   if (zsh >= 1024)
   {
        document.Form1.mapWindowHeight.value = 1024 - 450;
   }
   else
   {
        document.Form1.mapWindowHeight.value = zsh - 390;
   }
    
    document.Form1.submit();
    
    
} 

function setElementsPositions()
{            
   
   var zsh = screen.height;
   var zsw = screen.width;
         
   document.getElementById("mapWindow").style.width = document.getElementById("MapControl1").style.width;
   document.getElementById("mapWindow").style.height = document.getElementById("MapControl1").style.height;
   
   if (zsw >= 1600)
   {
    document.getElementById("mainArea").style.width = Math.abs(1480) + "px";
   }
   else if (zsw >= 1280)
   {
    document.getElementById("mainArea").style.width = Math.abs(1220) + "px";        
   }
   else
   {
    document.getElementById("mainArea").style.width = Math.abs(zsw * 0.96) + "px";
   }


   if (zsh >= 1024)
   {            
      document.getElementById("searchArea").style.height = zsh - (document.getElementById("header").offsetHeight + document.getElementById("footer").offsetHeight + document.getElementById("searchHeader").offsetHeight + 130) + "px";
   }
   else
   {
      document.getElementById("searchArea").style.height = zsh - (document.getElementById("header").offsetHeight + document.getElementById("footer").offsetHeight + document.getElementById("searchHeader").offsetHeight + 130) + "px";
   }

//    var mapPos = findPos(document.getElementById(MAPCONTROL + "_map"));
//    
//    document.getElementById("divNews").style.left = mapPos[0] +"px";
//    document.getElementById("divNews").style.top = mapPos[1] + "px";    
}

// end Fred bullshit

///////////////////////////////////////////////////////////////////////////////
// MAPVIEW                                                                   //
///////////////////////////////////////////////////////////////////////////////

function _MapControlObj()
{
	this.Initialize = _Initialize;
	
	//** Members
	this.mMapWidth = -1;	// This will be set from Initialize
	this.mMapHeight = -1;	// This will be set from Initialize
	this.mMapRange = null;
	this.SetMapRange = _SetMapRange;
	this.mMapImageName = 'MapImage';
	this.mHorizontalOffset = 0;
	this.mVerticalOffset = 0;
	this.mParentHorizontalOffset = 0;
	this.mParentVerticalOffset = 0;
	
	//** Functions
	this.SetMousePointer = _setMousePointer;
	this.SetModeMousePointer = _setModeMousePointer;
	
	//** Event Handlers
	this.TranslateMouseEvent = _TranslateMouseEvent;
	this.ShowMouseCoords = _ShowMouseCoords;
	this.EventOnMouseDown    = _evtOnMouseDown;
	this.EventOnMouseUp      = _evtOnMouseUp;
	this.EventOnMouseMove    = _evtOnMouseMove;
	
	this.EventOnWindowResize = _evtOnWindowResize;
	
	//** Mouse status
	this.mouseX=0;
	this.mouseY=0;
	this.mapX=0;
	this.mapY=0;
	this.mouseButtonDownLeft = false;
	this.mouseButtonDownRight = false;
	this.isOurEvent = false;
	
	//** Work modes
	this.MODE_IDLE      = 0;
	this.MODE_BUSY      = 1;
	this.MODE_ZOOM_BOX  = 2;
	this.MODE_GET_POINT = 3;
	this.MODE_PAN		= 4;
	this.MODE_GET_LINE	= 5;
	this.MODE_GET_POLYGON	= 6;
	this.SetWorkMode = _setWorkMode;
	this.mCurrentWorkMode = this.MODE_IDLE;
	
	//** Work status
	this.IsBusy = false;
	
	//** ZoomBox , Line
	this.CallBackZoomBox = null;
	this.CallBackLine = null;
	this.CallBackPolygon = null;
	
	this.doClearGraphics = _doClearGraphics;
	
	this.doShowMeasureWindow = _doShowMeasureWindow;		
	
	this.doZoomBoxMouseDown = _doZoomBoxMouseDown;
	this.doZoomBoxMouseUp   = _doZoomBoxMouseUp;
	this.doZoomBoxMouseMove = _doZoomBoxMouseMove;
	this.doPanMouseDown = _doPanMouseDown;
	this.doPanMouseUp   = _doPanMouseUp;
	this.doPanMouseMove = _doPanMouseMove;
	this.doLineMouseDown = _doLineMouseDown;
	this.doLineMouseMove = _doLineMouseMove;
	this.doAfterLineMouseDown = null;
	this.doAfterLineMouseMove = null;
	this.doPolygonMouseDown = _doPolygonMouseDown;
	this.doPolygonMouseMove = _doPolygonMouseMove;
	
	this.doAfterPolygonInserted = null;	
	
	this.SetZoomBoxColor = _SetZoomBoxColor;
	this.mZoomBoxColor = "#000000";
	this.SetZoomBoxLineWidth = _SetZoomBoxLineWidth;
	this.mZoomBoxLineWidth = 3;
	this.isZoomBox = false;
	this.isDrawing = false;
	this.x1=0;
	this.y1=0;
	this.x2=0;
	this.y2=0;
	this.mapX1=0;
	this.mapY1=0;
	this.mapX2=0;
	this.mapY2=0;	
	this.xArray;
	this.yArray;
	
	//Colecção de elementos para desenhar no mapa
	this.Features = new Array();
	
	this.doDrawFeatures = _doDrawFeatures;
	
	this.MaskLayersInit = _MaskLayersInit;
	this.MaskLayersShow = _MaskLayersShow;
	this.MaskLayersHide = _MaskLayersHide;	
	
	//** GetPoint
	this.CallBackGetPoint = null;
	
	//** Pan
	this.isPan = false;
	this.CallBackPan = null;
	
	//** Others
	this.hiddenDynX = null;
	this.hiddenDyny = null;
}

///////////////////////////////////////////////////////////////////////////////

var gMC = new _MapControlObj();

///////////////////////////////////////////////////////////////////////////////

function _SetMapRange(MapRange)
{
	gMC.mMapRange=MapRange;
}

function _SetZoomBoxLineWidth(newLineWidth)
{
	gMC.mZoomBoxLineWidth = newLineWidth;
}

function _SetZoomBoxColor(newColor)
{
	gMC.mZoomBoxColor = newColor;
	LayerBackgroundColorSet("zoomBoxTop", gMC.mZoomBoxColor);
	LayerBackgroundColorSet("zoomBoxLeft", gMC.mZoomBoxColor);
	LayerBackgroundColorSet("zoomBoxRight", gMC.mZoomBoxColor);
	LayerBackgroundColorSet("zoomBoxBottom", gMC.mZoomBoxColor);
}

function _Initialize(iMapWidth, iMapHeight, MapImageName, ZoomBoxColor)
{
	gMC.mMapWidth = iMapWidth;
	gMC.mMapHeight = iMapHeight;
	gMC.mMapImageName = MapImageName;

	var MapImg = document.getElementById(gMC.mMapImageName);
	if (MapImg == null) return;

	if( is5up )
	{
		var element = MapImg;

		gMC.mParentHorizontalOffset = element.offsetLeft;
		gMC.mParentVerticalOffset = element.offsetTop;
		
		gMC.mHorizontalOffset = findPosX(element);
		gMC.mVerticalOffset = findPosY(element);		
	}
	else
	{
		gMC.mHorizontalOffset = MapImg.x;
		gMC.mVerticalOffset = MapImg.y;
	}

	content = '<img name="zoomImageTop" src="images/pixel.gif" width=1 height=1>';
	LayerCreate("zoomBoxTop",0,0,gMC.mMapWidth,gMC.mMapHeight,false,content);
	content = '<img name="zoomImageLeft" src="images/pixel.gif" width=1 height=1>';
	LayerCreate("zoomBoxLeft",0,0,gMC.mMapWidth,gMC.mMapHeight,false,content);
	content = '<img name="zoomImageRight" src="images/pixel.gif" width=1 height=1>';
	LayerCreate("zoomBoxRight",0,0,gMC.mMapWidth,gMC.mMapHeight,false,content);
	content = '<img name="zoomImageBottom" src="images/pixel.gif" width=1 height=1>';
	LayerCreate("zoomBoxBottom",0,0,gMC.mMapWidth,gMC.mMapHeight,false,content);

	gMC.SetZoomBoxColor(gMC.mZoomBoxColor);

	if (isNav)
	{
		document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP );
	}
	
	var map = getObject(MAPCONTROL);
	if (map != null)
	{	
		map.onmousedown = gMC.EventOnMouseDown;
		map.onmouseup   = gMC.EventOnMouseUp;
		map.onmousemove = gMC.EventOnMouseMove;
		
		map.oncontextmenu = new Function("return false;");
	}	
	window.onresize = gMC.EventOnWindowResize;
		
	gMC.MaskLayersHide();
	
	gMC.xArray = new Array();
	gMC.yArray = new Array();
}

///////////////////////////////////////////////////////////////////////////////
// COMAND MANAGER FUNCTIONS                                                  //
///////////////////////////////////////////////////////////////////////////////

function _setWorkMode(newMode)
{
	switch(newMode)
	{
		case gMC.MODE_IDLE:
			break;
		case gMC.MODE_BUSY:
			break;
		case gMC.MODE_ZOOM_BOX:
			{
				gMC.mCurrentWorkMode = newMode;
			}
			break;		
		case gMC.MODE_GET_POINT:
			{
				gMC.mCurrentWorkMode = newMode;
			}
			break;		
		case gMC.MODE_PAN:
			{
				gMC.mCurrentWorkMode = newMode;
			}		
			break;
		case gMC.MODE_GET_LINE:
			{
				gMC.mCurrentWorkMode = newMode;
			}
			break;
		case gMC.MODE_GET_POLYGON:
			{
				gMC.mCurrentWorkMode = newMode;
			}
			break;
		default:
			{
				gMC.mCurrentWorkMode = gMC.MODE_IDLE;
			}
			break;
	}
	gMC.SetModeMousePointer(gMC.mCurrentWorkMode);
}

function _setModeMousePointer(currentMode)
{
	switch(currentMode)
	{
		case gMC.MODE_IDLE:
		{			
			gMC.SetMousePointer("default");
		}
		break;
		case gMC.MODE_BUSY:
		{
			gMC.SetMousePointer("wait");
		}
		break;
		case gMC.MODE_ZOOM_BOX:
		{
			gMC.SetMousePointer("crosshair");
		}
		break;
		case gMC.MODE_GET_LINE:
		{
			gMC.SetMousePointer("crosshair");
		}
		break;
		case gMC.MODE_GET_POLYGON:
		{
			gMC.SetMousePointer("crosshair");
		}
		break;
		case gMC.MODE_GET_POINT:
		{
			gMC.SetMousePointer("crosshair");
		}
		break;
		case gMC.MODE_PAN:
		{
			gMC.SetMousePointer("move");
		}
		break;
	}
}

function _setMousePointer(newCursor)
{
	if (!is5up) return;

	var map = getObject(MAPCONTROL);
	
	if (map != null)
		map.style.cursor = newCursor;
}

///////////////////////////////////////////////////////////////////////////////
// EVENT HANDLERS                                                            //
///////////////////////////////////////////////////////////////////////////////

function _ShowMouseCoords()
{
	if (gMC.mMapRange == null)
	{
		return false
	}
	else
	{
		if (gMC.mMapRange[0] == null)
		{
			return false;		
		}
	}

	var X = getWorldFromPixel(gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  gMC.mouseX, false );
	var Y = getWorldFromPixel(gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, gMC.mouseY,  true );

	var coords = document.getElementById(MAPCONTROL + "_coordinates");

	if (coords != null)
	{
		coords.innerHTML = "XY: " + parseInt((X*100))/100 + ", " + parseInt((Y*100))/100;
	}
	
	if (document.getElementById("txtHiddenRangeLatLon") != null && document.getElementById("txtHiddenRangeLatLon").value != "")
	{	
	    vCoords = document.getElementById("txtHiddenRangeLatLon").value.split("|");
	    
	    var latOrig = getWorldFromPixel(vCoords[1], vCoords[3], 0, gMC.mMapHeight, gMC.mouseY,  true );
	    var longOrig = getWorldFromPixel(vCoords[0], vCoords[2], 0, gMC.mMapWidth,  gMC.mouseX, false );	    
	    
	    // Change to absolute value
          lat = Math.abs(latOrig);
          lon = Math.abs(longOrig);
        
          // Convert to Degree Minutes Seconds Representation
          var LatDeg = Math.floor(lat);
          var LatMin = Math.floor((lat-LatDeg)*60);
          var LatSec =  (Math.round((((lat - LatDeg) - (LatMin/60)) * 60 * 60) * 100) / 100 ) ;
          var LonDeg = Math.floor(lon);
          var LonMin = Math.floor((lon-LonDeg)*60);
          var LonSec = (Math.round((((lon - LonDeg) - (LonMin / 60 )) * 60 * 60) * 100 ) / 100);
        
          var sLatLonDMS = "";       
        
          sLatLonDMS = LonDeg + "&#186;" + LonMin + "'" + LonSec + "''" + ((longOrig > 0) ? "E" : "O");
          sLatLonDMS += " " + LatDeg + "&#186;" + LatMin + "'" + LatSec + "''" + ((latOrig > 0) ? "N" : "S");
	    
	    coords.innerHTML += " (" + sLatLonDMS + ")";
	}	    
}

function _evtOnMouseDown(e)
{
	var retVal = true;
	gMC.TranslateMouseEvent(e);
		
	if(gMC.isOurEvent)
	{
		gMC.SetModeMousePointer(gMC.mCurrentWorkMode);
	}

	if(gMC.isOurEvent)
	{			
		switch(gMC.mCurrentWorkMode)
		{
			case gMC.MODE_ZOOM_BOX:
				{
					gMC.isZoomBox=is5up;
					gMC.MaskLayersShow();
					retVal = gMC.doZoomBoxMouseDown();
				}
				break;
			case gMC.MODE_GET_LINE:
				{
					gMC.isDrawing=is5up;
					retVal = gMC.doLineMouseDown();					
				}
				break;
			case gMC.MODE_GET_POLYGON:
				{
					gMC.isDrawing=is5up;
					retVal = gMC.doPolygonMouseDown();
				}
				break;
			case gMC.MODE_GET_POINT:
				{
					if(gMC.CallBackGetPoint!=null)
					{
						var X = getWorldFromPixel(gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  gMC.mouseX, false );
						var Y = getWorldFromPixel(gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, gMC.mouseY,  true );
						gMC.CallBackGetPoint(gMC.mouseX, gMC.mouseY, X, Y)
					}
				}
				break;
			case gMC.MODE_PAN:
				{
					gMC.isPan=is5up;
					retVal = gMC.doPanMouseDown();
				}
				break;
		}
	}

	return retVal;
}

function _evtOnMouseUp(e)
{
	var retVal = true;
	gMC.TranslateMouseEvent(e);

	if(gMC.isOurEvent)
	{
		gMC.SetModeMousePointer(gMC.mCurrentWorkMode);
	}

	switch(gMC.mCurrentWorkMode)
	{
		case gMC.MODE_ZOOM_BOX:
			{
				if( gMC.isZoomBox )
				{
					retVal = gMC.doZoomBoxMouseUp();
					gMC.MaskLayersHide();
					gMC.isZoomBox=false;
				}
			}
			break;
		case gMC.MODE_GET_POINT:
			{
			}
			break;
		case gMC.MODE_PAN:
			{
				if( gMC.isPan )
				{
					retVal = gMC.doPanMouseUp();
					gMC.isPan=false;
				}
			}
			break;
	}

	return retVal;
}

function _evtOnMouseMove(e)
{
	var retVal = false;
	gMC.TranslateMouseEvent(e);		

	if (gMC.IsBusy)
	{
		gMC.SetModeMousePointer(gMC.MODE_BUSY);
	} else {
		gMC.SetModeMousePointer(gMC.mCurrentWorkMode);
	}
	
	if(gMC.isOurEvent)
	{
		gMC.ShowMouseCoords();	
	}

	switch(gMC.mCurrentWorkMode)
	{
		case gMC.MODE_ZOOM_BOX:
			{
				retVal = gMC.doZoomBoxMouseMove();
			}
			break;
		case gMC.MODE_GET_LINE:
			{
				retVal = gMC.doLineMouseMove();
			}
			break;
		case gMC.MODE_GET_POLYGON:
			{
				retVal = gMC.doPolygonMouseMove();
			}
			break;
		case gMC.MODE_GET_POINT:
			{
			}
			break;
		case gMC.MODE_PAN:
			{
				if( gMC.isPan )
				{
					retVal = gMC.doPanMouseMove();
				}
			}
			break;
	}

	return retVal;
}

function _TranslateMouseEvent(e)
{
	gMC.isOurEvent = false;
	
	// Translate the coordinates
	if (isNav)
	{
		gMC.mouseX=e.pageX;
		gMC.mouseY=e.pageY;
	}
	else
	{	
		var scroll = getScrollXY();
	    
		gMC.mouseX=event.clientX + scroll[0];
		gMC.mouseY=event.clientY + scroll[1];
	}

	LayerMove( "zoomBoxTop", gMC.mHorizontalOffset, gMC.mVerticalOffset);
	LayerMove( "zoomBoxLeft", gMC.mHorizontalOffset, gMC.mVerticalOffset);
	LayerMove( "zoomBoxRight", gMC.mHorizontalOffset, gMC.mVerticalOffset);
	LayerMove( "zoomBoxBottom", gMC.mHorizontalOffset, gMC.mVerticalOffset);

	gMC.mouseX = gMC.mouseX-gMC.mHorizontalOffset;
	gMC.mouseY = gMC.mouseY-gMC.mVerticalOffset;
	
	if(	(gMC.mouseX >0) && (gMC.mouseX <gMC.mMapWidth) && (gMC.mouseY >0)&& (gMC.mouseY <gMC.mMapHeight) )
	{
		gMC.isOurEvent = true;
	}	
		
	// Translate the mouse buttons
	if(document.layers)
	{
		gMC.mouseButtonDownLeft = e.which==1;
		gMC.mouseButtonDownRight = e.which==3;
	}
	else 
	{
		if(isNav)
		{
			gMC.mouseButtonDownLeft = e.button == 0;
			gMC.mouseButtonDownRight = e.button == 2;
		}
		else
		{
			gMC.mouseButtonDownLeft = event.button==1;
			gMC.mouseButtonDownRight = event.button==2;
		}
	}

}

function _evtOnWindowResize(e)
{

	var MapImg = document.getElementById(gMC.mMapImageName);
	if (MapImg == null) return

	if( is5up )
	{	
		var element = MapImg;

		gMC.mParentHorizontalOffset = element.offsetLeft;
		gMC.mParentVerticalOffset = element.offsetTop;
		
		gMC.mHorizontalOffset = findPosX(element);
		gMC.mVerticalOffset = findPosY(element);		
	
		/*var element = MapImg;

		gMC.mParentHorizontalOffset = element.offsetLeft;
		gMC.mParentVerticalOffset = element.offsetTop;
		gMC.mVerticalOffset = 1;
		gMC.mHorizontalOffset = 1;

		do
		{
			gMC.mHorizontalOffset += element.offsetLeft;
			gMC.mVerticalOffset += element.offsetTop;
		}
		while( (element = element.offsetParent) )*/
	}
	else
	{
		gMC.mHorizontalOffset = MapImg.x;
		gMC.mVerticalOffset = MapImg.y;
	}

}


///////////////////////////////////////////////////////////////////////////////
// ZOOM BOX FUNCTIONS                                                        //
///////////////////////////////////////////////////////////////////////////////

function _doZoomBoxMouseDown()
{	
	if(gMC.mouseButtonDownLeft)
	{
		gMC.x1=gMC.mouseX;
		gMC.y1=gMC.mouseY
		gMC.x2=gMC.x1+1;
		gMC.y2=gMC.y1+1;

		drawBox(gMC.x1,gMC.y1,gMC.x2,gMC.y2);
	}
	
	return false;
}

function _doZoomBoxMouseMove()
{
	if(gMC.mouseButtonDownRight)
	{
		LayerHide("zoomBoxTop");
		LayerHide("zoomBoxLeft");
		LayerHide("zoomBoxRight");
		LayerHide("zoomBoxBottom");
		gMC.MaskLayersHide();
		
		gMC.isZoomBox = false;	
	
		return false
	}

	var retVal = true;
	
	if (gMC.isZoomBox)
	{
		gMC.x2=gMC.mouseX;
		gMC.y2=gMC.mouseY;		

		if (gMC.mouseX>=gMC.mMapWidth)  gMC.x2 = gMC.mMapWidth;
		if (gMC.mouseY>=gMC.mMapHeight) gMC.y2 = gMC.mMapHeight;
		if (gMC.mouseX<1)								gMC.x2 = 1;
		if (gMC.mouseY<1)								gMC.y2 = 1;
		
		var dynLeft   = Math.min(gMC.x1, gMC.x2);
		var dynTop    = Math.min(gMC.y1, gMC.y2); 
		var dynRight  = Math.max(gMC.x1, gMC.x2);
		var dynBottom = Math.max(gMC.y1, gMC.y2);
		var deltaX    = dynRight-dynLeft;
		var deltaY    = dynBottom-dynTop;

		drawBox(dynLeft, dynTop, dynRight, dynBottom);
		
		LayerMove(MAPCONTROL + "_MyLayer_TOP", dynLeft-1000+deltaX, dynTop-1000);
		LayerMove(MAPCONTROL + "_MyLayer_RIGHT", dynRight, dynTop-1000+deltaY);
		LayerMove(MAPCONTROL + "_MyLayer_BOTTOM", dynLeft, dynBottom);
		LayerMove(MAPCONTROL + "_MyLayer_LEFT", dynLeft-1000, dynTop);				
								
		retVal = false;
	}

	return retVal;
}

function _doZoomBoxMouseUp()
{		
	if(gMC.mouseButtonDownRight)
	{
		LayerHide("zoomBoxTop");
		LayerHide("zoomBoxLeft");
		LayerHide("zoomBoxRight");
		LayerHide("zoomBoxBottom");
		gMC.MaskLayersHide();
		
		gMC.isZoomBox = false;	
	
		return false
	}
	
	if (gMC.mouseX>=gMC.mMapWidth)  gMC.mouseX = gMC.mMapWidth - 1;
	if (gMC.mouseY>=gMC.mMapHeight) gMC.mouseY = gMC.mMapHeight - 1;
	if (gMC.mouseX<1)				gMC.mouseX = 1;
	if (gMC.mouseY<1)				gMC.mouseY = 1;

	LayerHide("zoomBoxTop");
	LayerHide("zoomBoxLeft");
	LayerHide("zoomBoxRight");
	LayerHide("zoomBoxBottom");
	gMC.MaskLayersHide();

	if ( (Math.abs(gMC.x1-gMC.x2)>2) || (Math.abs(gMC.y1-gMC.y2)>2) )
	{
		if(gMC.CallBackZoomBox!=null)
		{
			gMC.CallBackZoomBox(Math.min(gMC.x1,gMC.x2),  Math.min(gMC.y1,gMC.y2), Math.max(gMC.x1,gMC.x2), Math.max(gMC.y1,gMC.y2));
		}
	}
		
	return false;
}

///////////////////////////////////////////////////////////////////////////////
// PAN FUNCTIONS                                                             //
///////////////////////////////////////////////////////////////////////////////

function _doPanMouseDown()
{
	if(gMC.mouseButtonDownLeft)
	{
			gMC.doClearGraphics();
	
			gMC.x1 = gMC.mouseX;
			gMC.y1 = gMC.mouseY;
	}
	return false;
}
function _doPanMouseMove()
{
	if(gMC.mouseButtonDownRight)
	{
		if(gMC.CallBackPan!=null)
		{
			LayerMove(gMC.mMapImageName, gMC.mParentHorizontalOffset, gMC.mParentVerticalOffset);
			LayerClip(gMC.mMapImageName, "auto", "auto", "auto", "auto")
		}
		return false;
	}

	if (gMC.mouseX>=gMC.mMapWidth)  gMC.mouseX = gMC.mMapWidth - 1;
	if (gMC.mouseY>=gMC.mMapHeight) gMC.mouseY = gMC.mMapHeight - 1;
	if (gMC.mouseX<1)								gMC.mouseX = 1;
	if (gMC.mouseY<1)								gMC.mouseY = 1;

	var deltaX = gMC.mouseX - gMC.x1;
	var deltaY = gMC.mouseY - gMC.y1;
	var clipleft  = Math.abs(deltaX);
	var clipright = gMC.mMapWidth;
	var cliptop    = Math.abs(deltaY);
	var clipbottom = gMC.mMapHeight;

	if ( deltaX>0 )
	{
		clipleft  = 0;
		clipright = gMC.mMapWidth - deltaX;
	}
	
	if ( deltaY>0 )
	{
		cliptop    = 0;
		clipbottom = gMC.mMapHeight-deltaY;
	}

	LayerMove(gMC.mMapImageName, gMC.mParentHorizontalOffset + gMC.mouseX - gMC.x1, gMC.mParentVerticalOffset + gMC.mouseY - gMC.y1);
	LayerClip(gMC.mMapImageName, clipleft, cliptop, clipright, clipbottom)

	return false;
}
function _doPanMouseUp()
{

	if(gMC.mouseButtonDownRight)
	{
		if(gMC.CallBackPan!=null)
		{
			LayerMove(gMC.mMapImageName, gMC.mParentHorizontalOffset, gMC.mParentVerticalOffset);
			LayerClip(gMC.mMapImageName, "auto", "auto", "auto", "auto")
		}
		return false;
	}

	if (gMC.mouseX>=gMC.mMapWidth)  gMC.mouseX = gMC.mMapWidth - 1;
	if (gMC.mouseY>=gMC.mMapHeight) gMC.mouseY = gMC.mMapHeight - 1;
	if (gMC.mouseX<1)								gMC.mouseX = 1;
	if (gMC.mouseY<1)								gMC.mouseY = 1;

	if(gMC.CallBackPan!=null)
	{
		LayerHide(gMC.mMapImageName);
		LayerMove(gMC.mMapImageName, gMC.mParentHorizontalOffset, gMC.mParentVerticalOffset);
		LayerClip(gMC.mMapImageName, "auto", "auto", "auto", "auto")
	
		gMC.CallBackPan(gMC.x1 - gMC.mouseX, gMC.y1 - gMC.mouseY);
	}

	return false;
}

///////////////////////////////////////////////////////////////////////////////
// MASK LAYERS FOR ZOOMBOX                                                   //
///////////////////////////////////////////////////////////////////////////////

function _MaskLayersInit()
{
	/*
	LayerSizeSet(MAPCONTROL + "_MyLayer_LEFT", gMC.mMapWidth, gMC.mMapHeight );
	LayerMove(MAPCONTROL + "_MyLayer_LEFT", gMC.mHorizontalOffset, gMC.mVerticalOffset);
	LayerMove(MAPCONTROL + "_MyLayer_TOP",    -1000, -1000);
	LayerMove(MAPCONTROL + "_MyLayer_RIGHT",  -1000, -1000);
	LayerMove(MAPCONTROL + "_MyLayer_BOTTOM", -1000, -1000);
	gMC.MaskLayersShow();
	*/
}

function _MaskLayersShow()
{
	/*
	LayerShow(MAPCONTROL + "_MyLayer_LEFT");
	LayerShow(MAPCONTROL + "_MyLayer_TOP");
	LayerShow(MAPCONTROL + "_MyLayer_RIGHT");
	LayerShow(MAPCONTROL + "_MyLayer_BOTTOM");
	*/
}

function _MaskLayersHide()
{
	/*
	LayerMove(MAPCONTROL + "_MyLayer_LEFT",   -1000, -1000);
	LayerMove(MAPCONTROL + "_MyLayer_TOP",    -1000, -1000);
	LayerMove(MAPCONTROL + "_MyLayer_RIGHT",  -1000, -1000);
	LayerMove(MAPCONTROL + "_MyLayer_BOTTOM", -1000, -1000);
	LayerHide(MAPCONTROL + "_MyLayer_LEFT");
	LayerHide(MAPCONTROL + "_MyLayer_TOP");
	LayerHide(MAPCONTROL + "_MyLayer_RIGHT");
	LayerHide(MAPCONTROL + "_MyLayer_BOTTOM");
	*/
}

///////////////////////////////////////////////////////////////////////////////

function drawBox(theLeft, theTop, theRight, theBottom)
{
	if( (theLeft != theRight) && (theTop != theBottom) )
	{
		LayerClip("zoomBoxTop",theLeft,theTop,theRight,theTop+gMC.mZoomBoxLineWidth);
		LayerClip("zoomBoxLeft",theLeft,theTop,theLeft+gMC.mZoomBoxLineWidth,theBottom);
		LayerClip("zoomBoxRight",theRight-gMC.mZoomBoxLineWidth,theTop,theRight,theBottom);
		LayerClip("zoomBoxBottom",theLeft,theBottom-gMC.mZoomBoxLineWidth,theRight,theBottom);
		LayerShow("zoomBoxTop");
		LayerShow("zoomBoxLeft");
		LayerShow("zoomBoxRight");
		LayerShow("zoomBoxBottom");
	}
}

///////////////////////////////////////////////////////////////////////////////

function getWorldFromPixel(world0, world1, pixel0, pixel1, Value, corrected)
{
	var retVal;
	var worldDelta=(world1-world0);
	var pixelDelta=(pixel1-pixel0);
	
	if (corrected)
	{
		retVal = world1 - (Value-pixel0)*worldDelta/pixelDelta;
	}
	else
	{
		retVal = Number(world0) + Number((Value-pixel0)*worldDelta/pixelDelta);
	}

	return retVal;
}
function getPixelFromWorld(world0, world1, pixel0, pixel1, Value, corrected)
{
	var retVal;
	var worldDelta=(world1-world0);
	var pixelDelta=(pixel1-pixel0);
	
	if (corrected)
	{
		retVal = pixel1 - (Value-world0)*pixelDelta/worldDelta;
	}
	else
	{
		retVal = pixel0 + (Value-world0)*pixelDelta/worldDelta;
	}

	return parseInt(retVal);
}///////////////////////////////////////////////////////////////////////////////

function getPixelX(width, minx, maxx, coordx)
{
    if (coordx < minx || coordx > maxx)
        return -1
        
    pixelX = ((coordx - minx) * width) / (maxx-minx);
    
    return pixelX;
}
function getPixelY(height, miny, maxy, coordy)
{
    if (coordy < miny || coordy > maxy)
        return -1
        
    pixelY = ((maxy - coordy) * height) / (maxy-miny);
    
    return pixelY;
}

///////////////////////////////////////////////////////////////////////////////

function _doClearGraphics()
{   
	jg_dynamic.clear();
	jg_fix.clear();
	jg_news.clear();
		
	gMC.xArray = null;
	gMC.yArray = null;

	gMC.xArray = new Array
	gMC.yArray = new Array
}

function _doShowMeasureWindow(newWindow)
{
	var win = getObject("divMeasure");
	
	if (win == null) return;

	if (newWindow)
	{
		var lblSegm = getObject("lblMedicaoSegmento");		
		if (lblSegm != null)
			lblSegm.innerText = "0";
			
		var lblLine= getObject("lblMedicaoTotal");		
		if (lblLine != null)
			lblLine.innerText = "0";
			
		if (win.style.visibility != "visible")	
		{						
			win.style.top = gMC.mVerticalOffset;
			win.style.left = gMC.mHorizontalOffset;
		}
	}
	
	win.style.visibility = "visible";		
}

function showLineSegmentLength(pixelX1, pixelY1, pixelX2, pixelY2)
{
	setMeasureWindowTitles("Segmento:", "Total:")

	var X1 = getWorldFromPixel( gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  pixelX1, false );
	var Y1 = getWorldFromPixel( gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, pixelY1,  true );

	var X2 = getWorldFromPixel( gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  pixelX2, false );
	var Y2 = getWorldFromPixel( gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, pixelY2,  true );

	var line = new _Line();
		
	line.StartPoint.X = X1;
	line.StartPoint.Y = Y1;
		
	line.EndPoint.X = X2;
	line.EndPoint.Y = Y2;

	labelLength = getObject("lblMedicaoSegmento");
		
	if (labelLength != null)
	{		
		labelLength.innerHTML = roundNumber(line.GetLength(),2);
	}
}

function showLineTotalLength()
{

	setMeasureWindowTitles("Segmento:", "Total:")

	if (gMC.xArray.length == 1)
	{
		gMC.doShowMeasureWindow(true);
	} 
	else if (gMC.xArray.length>1)
	{
		var totalLength = 0;
	
		for (i=0;i<gMC.xArray.length-1;i++)
		{	
			var pixelX1 = gMC.xArray[i];
			var pixelY1 = gMC.yArray[i];
			var pixelX2 = gMC.xArray[i+1];
			var pixelY2 = gMC.yArray[i+1];
	
			var X1 = getWorldFromPixel( gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  pixelX1, false );
			var Y1 = getWorldFromPixel( gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, pixelY1,  true );

			var X2 = getWorldFromPixel( gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  pixelX2, false );
			var Y2 = getWorldFromPixel( gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, pixelY2,  true );

			var line = new _Line();
		
			line.StartPoint.X = X1;
			line.StartPoint.Y = Y1;
		
			line.EndPoint.X = X2;
			line.EndPoint.Y = Y2;
			
			totalLength += line.GetLength();	
		}
		
		labelLength = getObject("lblMedicaoTotal");
		
		if (labelLength != null)
		{		
			labelLength.innerHTML= roundNumber(totalLength,2);
		}
	}
}

function setMeasureWindowTitles(title1, title2)
{
	if (getObject("tdMedicaoTitle1") != null)
	{
		getObject("tdMedicaoTitle1").innerHTML = title1;
	}
	if (getObject("tdMedicaoTitle2") != null)
	{
		getObject("tdMedicaoTitle2").innerHTML = title2;
	}	
}

function showPolygonTotalArea()
{	
	setMeasureWindowTitles("Per&#237;metro:", "&#193;rea:");

	if (gMC.xArray.length == 1)
	{
		gMC.doShowMeasureWindow(true);				
	} 
	else if (gMC.xArray.length>1)
	{
		var areaArray = new Array(gMC.xArray.length);
		var point = null;	
		var totalLength = 0;
		var totalArea = 0;
	
		for (i=0;i<gMC.xArray.length;i++)
		{				
			var pixelX1 = gMC.xArray[i];
			var pixelY1 = gMC.yArray[i];
			
			var pixelX2 = gMC.xArray[i+1];
			var pixelY2 = gMC.yArray[i+1];
	
			var X1 = getWorldFromPixel( gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  pixelX1, false );
			var Y1 = getWorldFromPixel( gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, pixelY1,  true );

			var X2 = getWorldFromPixel( gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  pixelX2, false );
			var Y2 = getWorldFromPixel( gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, pixelY2,  true );
			
			if (i<gMC.xArray.length-1)
			{
				var line = new _Line();
						
				line.StartPoint.X = X1;
				line.StartPoint.Y = Y1;
		
				line.EndPoint.X = X2;
				line.EndPoint.Y = Y2;
			
				totalLength += line.GetLength();
			}
			
			point = new _Point();
			point.X = X1;
			point.Y = Y1;
			areaArray[i] = point;
		}
	
		labelLength = getObject("lblMedicaoSegmento");		
		if (labelLength != null)
		{		
			labelLength.innerHTML = roundNumber(totalLength,2);
		}
		
		var totalArea = roundNumber(Math.abs(AreaCalculate(gMC.xArray.length-1, areaArray)), 2);
		
		labelLength = getObject("lblMedicaoTotal");
		if (labelLength != null)
		{		
			labelLength.innerHTML = totalArea + 'm2';
		}		
	}
}

// Line functions
function _doLineMouseDown()
{
	if(gMC.mouseButtonDownLeft)
	{
		if (gMC.xArray.length<1)
		{			
			jg_fix.clear();
		}
	
		// gMV.x1 and gMV.y1 are the points where mouse event happened
		gMC.x1=gMC.mouseX;
		gMC.y1=gMC.mouseY
		
		var X = getWorldFromPixel( gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  gMC.mouseX, false );
		var Y = getWorldFromPixel( gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, gMC.mouseY,  true );

		gMC.xArray[gMC.xArray.length]= gMC.x1;
		//gMC.hiddenDynX.value = gMC.hiddenDynX.value+ X + ';'
		gMC.hiddenDynX = gMC.hiddenDynX+ X + ';'
		gMC.yArray[gMC.yArray.length]= gMC.y1;
		//gMC.hiddenDynY.value = gMC.hiddenDynY.value+ Y + ';'
		gMC.hiddenDynY = gMC.hiddenDynY+ Y + ';'		
	}
	else
	{
		gMC.SetWorkMode( gMC.MODE_IDLE );
		gMC.isDrawing=false;
		
		document.getElementById(MAPCONTROL + "_txtHiddenDynY").value = ""
		document.getElementById(MAPCONTROL + "_txtHiddenDynX").value = ""
		
		gMC.xArray[gMC.xArray.length]= gMC.mouseX;
		gMC.yArray[gMC.yArray.length]= gMC.mouseY;

		if (gMC.mouseX>=gMC.mMapWidth)  gMC.mouseX = gMC.mMapWidth - 1;
		if (gMC.mouseY>=gMC.mMapHeight) gMC.mouseY = gMC.mMapHeight - 1;
		if (gMC.mouseX<1)								gMC.mouseX = 1;
		if (gMC.mouseY<1)								gMC.mouseY = 1;

		if(gMC.CallBackLine!=null)
		{
			jg_dynamic.clear();
			gMC.CallBackLine(gMC.xArray,gMC.yArray);
		}
	}
	
	if (gMC.doAfterLineMouseDown != null)
	{
		gMC.doAfterLineMouseDown();							
	}	
	
	if(!gMC.mouseButtonDownLeft)
	{						
		gMC.xArray = null;
		gMC.yArray = null;

		gMC.xArray = new Array
		gMC.yArray = new Array		
	}
		
	return false;
}

function _doLineMouseMove()
{
	var retVal = true;

	// are we in line mode?
	if (gMC.isDrawing)
	{
		var oldx = gMC.xArray[gMC.xArray.length-1];
		var oldy = gMC.yArray[gMC.yArray.length-1];
	
		// asigne the current position to x2 and y2
		gMC.x2=gMC.mouseX;
		gMC.y2=gMC.mouseY;
		// are we in the div (map)
		if (gMC.mouseX>=gMC.mMapWidth)  gMC.x2 = gMC.mMapWidth - 1;
		if (gMC.mouseY>=gMC.mMapHeight) gMC.y2 = gMC.mMapHeight - 1;
		if (gMC.mouseX<1)								gMC.x2 = 1;
		if (gMC.mouseY<1)								gMC.y2 = 1;

		jg_dynamic.clear();
		jg_dynamic.drawPolyline(gMC.xArray,gMC.yArray);
		jg_dynamic.setStroke(2);
		jg_dynamic.setColor("#ffff00");
		jg_dynamic.drawLine(oldx, oldy, gMC.x2, gMC.y2);
		jg_dynamic.paint();
		
		if (gMC.doAfterLineMouseMove != null)
		{
			gMC.doAfterLineMouseMove(oldx, oldy, gMC.x2, gMC.y2);							
		}		
		
		retVal = false;
	}

	return retVal;
}

///////////////////////////////////////////////////////////////////////////////
// Polygon functions                                                         //
///////////////////////////////////////////////////////////////////////////////

function _doPolygonMouseDown()
{
	if(gMC.mouseButtonDownLeft)
	{	
		if (gMC.xArray.length<1)
		{			
			jg_fix.clear();
		}	
	
		// gMV.x1 and gMV.y1 are the points where mouse event happened
		gMC.x1=gMC.mouseX;
		gMC.y1=gMC.mouseY
		
		var X = getWorldFromPixel( gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  gMC.mouseX, false );
		var Y = getWorldFromPixel( gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, gMC.mouseY,  true );
		
		gMC.xArray[gMC.xArray.length]= gMC.x1;
		//gMC.hiddenDynX.value = gMC.hiddenDynX.value+ X + ';'
		gMC.hiddenDynX = gMC.hiddenDynX+ X + ';'
		gMC.yArray[gMC.yArray.length]= gMC.y1;
		//gMC.hiddenDynY.value = gMC.hiddenDynY.value+ Y + ';'
		gMC.hiddenDynY = gMC.hiddenDynY+ Y + ';'
	}
	else
	{
		gMC.SetWorkMode( gMC.MODE_IDLE );
		gMC.isDrawing=false;
		
		document.getElementById(MAPCONTROL + "_txtHiddenDynY").value = ""
		document.getElementById(MAPCONTROL + "_txtHiddenDynX").value = ""
		
		gMC.xArray[gMC.xArray.length]= gMC.mouseX;
		gMC.yArray[gMC.yArray.length]= gMC.mouseY;
		gMC.xArray[gMC.xArray.length]= gMC.xArray[0];
		gMC.yArray[gMC.yArray.length]= gMC.yArray[0];

		if (gMC.mouseX>=gMC.mMapWidth)  gMC.mouseX = gMC.mMapWidth - 1;
		if (gMC.mouseY>=gMC.mMapHeight) gMC.mouseY = gMC.mMapHeight - 1;
		if (gMC.mouseX<1)								gMC.mouseX = 1;
		if (gMC.mouseY<1)								gMC.mouseY = 1;

		if(gMC.CallBackPolygon!=null)
		{
			jg_dynamic.clear();
			gMC.CallBackPolygon(gMC.xArray,gMC.yArray);
		}
		
		gMC.xArray = null;
		gMC.yArray = null;

		gMC.xArray = new Array
		gMC.yArray = new Array		
		
	}
	return false;
}

function _doPolygonMouseMove()
{
	var retVal = true;

	// are we in line mode?
	if (gMC.isDrawing)
	{
		//var oldx = gMV.x1;
		//var oldy = gMV.y1;
		var oldx = gMC.xArray[gMC.xArray.length-1];
		var oldy = gMC.yArray[gMC.yArray.length-1];
		
		// asigne the current position to x2 and y2
		gMC.x2=gMC.mouseX;
		gMC.y2=gMC.mouseY;
		// are we in the div (map)
		if (gMC.mouseX>=gMC.mMapWidth)  gMC.x2 = gMC.mMapWidth - 1;
		if (gMC.mouseY>=gMC.mMapHeight) gMC.y2 = gMC.mMapHeight - 1;
		if (gMC.mouseX<1)								gMC.x2 = 1;
		if (gMC.mouseY<1)								gMC.y2 = 1;

		jg_dynamic.clear();
		jg_dynamic.drawPolyline(gMC.xArray,gMC.yArray);
		jg_dynamic.setStroke(2);
		jg_dynamic.setColor("#ffff00");
		jg_dynamic.drawLine(oldx, oldy, gMC.x2, gMC.y2);
		jg_dynamic.drawLine(gMC.xArray[0], gMC.yArray[0], gMC.x2, gMC.y2);
		jg_dynamic.paint();

		retVal = false;
	}

	return retVal;
}

///////////////////////////////////////////////////////////////////////////////
// Features functions                                                         //
///////////////////////////////////////////////////////////////////////////////
function _doDrawFeatures(minx, miny, maxx, maxy)
{
    jg_features.clear();
    
    for (i=0; i < gMC.Features.length; i++)
    {
	  try
	  {
        	feature = gMC.Features[i];
        
            pixelX = getPixelX(gMC.mMapWidth, minx, maxx, feature.X);
        	pixelY = getPixelY(gMC.mMapHeight, miny, maxy, feature.Y);
      
	      if (pixelX > 0 && pixelY > 0)
       	{
            	feature.Draw(pixelX, pixelY);
	      } 
	 } catch (err) {
	 }
    }
    
    jg_features.paint();   
}
