﻿///////////////////////////////////////////////////////////////////////////////
// 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.mMapContentName = 'MapContent';
	this.mHorizontalOffset = 0;
	this.mVerticalOffset = 0;
	this.mParentHorizontalOffset = 0;
	this.mParentVerticalOffset = 0;
	
	this.mMapScale = 1;
	
	//** 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.EventOnMouseWheel  = _evtOnMouseWheel;
	this.EventOnDblClick    = _evtOnMouseDblClick;
	
	this.EventOnWindowResize = _evtOnWindowResize;
	
	//** Mouse status
	this.mouseX=0;
	this.mouseY=0;
	this.mapX=0;
	this.mapY=0;
	this.mouseButtonDownLeft = false;
	this.mouseButtonDownRight = false;
	this.mouseButtonDownMiddle = false;
	this.isOurEvent = false;
	
	 //** Pan animation
    this.rate_x = 0;
    this.rate_y = 0;
    this.rate = 0;
	
	//** 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;
	
	this.SetGraphicsColor = _SetGraphicsColor;
	this.mGraphicsColor = "#000000";
	this.SetGraphicsWidth = _SetGraphicsWidth;
	this.mGraphicsWidth = 3;	
	this.SetDrawingColor = _SetDrawingColor;
	this.mDrawingColor = "#000000";
	this.SetDrawingWidth = _SetDrawingWidth;
	this.mDrawingWidth = 3;	
	
	//Colecção de elementos para desenhar no mapa
	this.FeaturesCollection = new Array();
	this.doGetFeaturesCollection = _doGetFeatureCollectionByIndex;
	this.doGetFeaturesCollectionById = _doGetFeatureCollectionById;
	this.doDrawFeaturesCollection = _doDrawFeaturesCollection;
	
	this.mapImageUrl = "";
	this.legendImageUrl = "";
	this.scalebarImageUrl = "";					
    
    //Colecção de gráficos desenhados no mapa
    this.Graphics = new Array();
    this.doDrawGraphics = _doDrawGraphics;
	
	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;
	
	//MouseWheel
	this.mouseWheelTimeOutId = null;
	this.mouseWheelDelta = 0;	
}

///////////////////////////////////////////////////////////////////////////////

var gMC = new _MapControlObj();

///////////////////////////////////////////////////////////////////////////////

function _SetMapRange(MapRange)
{
	gMC.mMapRange=MapRange;
}

function _SetGraphicsColor(newColor)
{
	gMC.mGraphicsColor = newColor;
}
function _SetGraphicsWidth(newWidth)
{
	gMC.mGraphicsWidth = newWidth;
}

function _SetDrawingColor(newColor)
{
	gMC.mDrawingColor = newColor;
}
function _SetDrawingWidth(newWidth)
{
	gMC.mDrawingWidth = newWidth;
}


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, MapContentName, ZoomBoxColor)
{
	gMC.mMapWidth = iMapWidth;
	gMC.mMapHeight = iMapHeight;
	gMC.mMapImageName = MapImageName;
	gMC.mMapContentName = MapContentName;

	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;
	}
		    
    var content = "";
    if ($("#zoomBoxTop").html() == null)
    {
        var content = "<div id='zoomBoxTop' style='position:absolute; overflow:hidden; left:0px; top:0px; width:" + gMC.mMapWidth + "px; height:" + gMC.mMapHeight + "px; z-index:6010; visibility: hidden;'>"; 
	    content += "<img name='zoomImageTop' src='images/pixel.gif' width=1 height=1>";
	    content += "</div>";	    		
	    //container
	    //$("#mapContent").append(content);
	    $("#" + gMC.mMapContentName).append(content);
	} else { 
	    $("#zoomBoxTop").css("width", gMC.mMapWidth + "px");
	    $("#zoomBoxTop").css("height", gMC.mMapHeight + "px");
	}
	
    if ($("#zoomBoxLeft").html() == null)
    {	
        content = "<div id='zoomBoxLeft' style='position:absolute; overflow:hidden; left:0px; top:0px; width:" + gMC.mMapWidth + "px; height:" + gMC.mMapHeight + "px; z-index:6010; visibility: hidden;'>"; 
	    content += "<img name='zoomImageLeft' src='images/pixel.gif' width=1 height=1>";
	    content += "</div>";		
	    //$("#mapContent").append(content);
	    $("#" + gMC.mMapContentName).append(content);
	} else {
	    $("#zoomBoxLeft").css("width", gMC.mMapWidth + "px");
	    $("#zoomBoxLeft").css("height", gMC.mMapHeight + "px");	
	}
    
    if ($("#zoomBoxRight").html() == null)
    {    
        content = "<div id='zoomBoxRight' style='position:absolute; overflow:hidden; left:0px; top:0px; width:" + gMC.mMapWidth + "px; height:" + gMC.mMapHeight + "px; z-index:6010; visibility: hidden;'>"; 
	    content += "<img name='zoomImageRight' src='images/pixel.gif' width=1 height=1>";
	    content += "</div>";		
	    //$("#mapContent").append(content);
	    $("#" + gMC.mMapContentName).append(content);
	} else {
	    $("#zoomBoxRight").css("width", gMC.mMapWidth + "px");
	    $("#zoomBoxRight").css("height", gMC.mMapHeight + "px");		
	}
	
    if ($("#zoomBoxBottom").html() == null)
    {	
        content = "<div id='zoomBoxBottom' style='position:absolute; overflow:hidden; left:0px; top:0px; width:" + gMC.mMapWidth + "px; height:" + gMC.mMapHeight + "px; z-index:6010; visibility: hidden;'>"; 
	    content += "<img name='zoomImageBottom' src='images/pixel.gif' width=1 height=1>";
	    content += "</div>";		
	    //$("#mapContent").append(content);
	    $("#" + gMC.mMapContentName).append(content);
	} else {
	    $("#zoomBoxBottom").css("width", gMC.mMapWidth + "px");
	    $("#zoomBoxBottom").css("height", gMC.mMapHeight + "px");			
	}

//  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 (ZoomBoxColor != null)
	{
	    gMC.SetZoomBoxColor(ZoomBoxColor);
	}

	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.onmousewheel = gMC.EventOnMouseWheel;
		map.ondblclick = gMC.EventOnDblClick;
		
		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");
    var coords = document.getElementById("txtCoordinates");	

	if (coords != null)
	{
	    try
	    {
		    coords.innerHTML = "XY: " + parseInt((X*100))/100 + ", " + parseInt((Y*100))/100;
		} catch(err) {}
	}
	
	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 = LatDeg + "&#186;" + LatMin + "'" + LatSec + "''" + ((latOrig > 0) ? "N" : "S");
        sLatLonDMS +=  " " + LonDeg + "&#186;" + LonMin + "'" + LonSec + "''" + ((longOrig > 0) ? "E" : "O");
	    
	    coords.innerHTML += " (" + sLatLonDMS + ")";

	}	    
}

function _evtOnMouseDown(e)
{
	var retVal = true;
	
	if (gMC.IsBusy)
	{
	    retVal = false;
	    
	    return retVal;
	}
	
	
	gMC.TranslateMouseEvent(e);
		
	if(gMC.isOurEvent)
	{
		gMC.SetModeMousePointer(gMC.mCurrentWorkMode);
	}

	if(gMC.isOurEvent)
	{		
        if (gMC.mouseButtonDownMiddle)
	    {
		    var panX = getWorldFromPixel(gMC.mMapRange[0], gMC.mMapRange[2],0,gMC.mMapWidth,  gMC.mouseX, false );
		  
		    var panY = getWorldFromPixel(gMC.mMapRange[1], gMC.mMapRange[3],0, gMC.mMapHeight, gMC.mouseY,true );
		  
		    if (!gMC.IsBusy) doWheelPan(gMC.mouseX, gMC.mouseY, panX, panY);
		  
	    } else {
		    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 _evtOnMouseDblClick(e)
{
	// Translate the mouse buttons
	if(document.layers)
	{
		gMC.mouseButtonDownLeft = false;
		gMC.mouseButtonDownRight = true;
	}
	else 
	{
		if(isNav)
		{
			gMC.mouseButtonDownLeft = false;
			gMC.mouseButtonDownRight = true;
		}
		else
		{
			gMC.mouseButtonDownLeft = false;
			gMC.mouseButtonDownRight = true;
		}
	}

	if(gMC.isOurEvent)
	{			
		switch(gMC.mCurrentWorkMode)
		{
			case gMC.MODE_GET_LINE:
				{
					gMC.isDrawing=is5up;
					retVal = gMC.doLineMouseDown();					
				}
				break;
			case gMC.MODE_GET_POLYGON:
				{
					gMC.isDrawing=is5up;
					retVal = gMC.doPolygonMouseDown();
				}
				break;
		}
	}

	return retVal;

}

function _evtOnMouseWheel(event)
{
    if (gMC.IsBusy) return;

    var delta = 0;
	if (!event) event = window.event;

    if (event != null)    
    {
        window.clearTimeout(gMC.mouseWheelTimeOutId);                   
     
        gMC.mouseWheelTimeOutId = window.setTimeout('stopMouseWheel();', 500); 
    }

	var delta = 0;
	if (!event) event = window.event;
	if (event.wheelDelta) {
		delta = event.wheelDelta/60; 
		if (window.opera) delta = -delta;
	} else if (event.detail) {
		delta = -event.detail/3;
	}
	if (delta)
		handle(delta);
        if (event.preventDefault)
                event.preventDefault();
        event.returnValue = false;
}
function handle(delta)
{   
  gMC.mouseWheelDelta = gMC.mouseWheelDelta + delta;

  var width = gMC.mMapWidth * (1 + (gMC.mouseWheelDelta/10));
  var height = gMC.mMapHeight * (1 + (gMC.mouseWheelDelta/10));                            
      
  if (width  >= 50) 
  {         
    var m =  (gMC.mMapWidth - width)/2;
    var h =  (gMC.mMapHeight - height)/2;
              
	LayerMove(gMC.mMapImageName, m, h);
	
    $("#" + gMC.mMapImageName).width(width);
    $("#" + gMC.mMapImageName).height(height);

  } else { 
    stopMouseWheel();
  }	            
}
function stopMouseWheel()
{
    gMC.mouseWheelDelta = 0;
    
    var MapRange = DoGetMapRange();

    var deltax = ($("#" + gMC.mMapImageName).width() / gMC.mMapWidth);
    var deltay = ($("#" + gMC.mMapImageName).height() / gMC.mMapHeight);
    
    var centerx = (MapRange[0] + MapRange[2])/2;
    var centery = (MapRange[3] + MapRange[1])/2;

    var zdeltax = (MapRange[2] - centerx) / deltax;
    var zdeltay = (MapRange[3] - centery) / deltay;

    var xmin = centerx - zdeltax;
    var xmax = centerx + zdeltax;
    var ymin = centery - zdeltay;
    var ymax = centery + zdeltay;
    
    if (xmin <= EXTENT_LEFT) xmin = EXTENT_LEFT;
    if (xmax >= EXTENT_RIGHT) xmax = EXTENT_RIGHT;
    if (ymin <= EXTENT_BOTTOM) ymin = EXTENT_BOTTOM;
    if (ymax >= EXTENT_TOP) ymax = EXTENT_TOP;

    zoomExtent(xmin, ymin, xmax, ymax);

}

function doWheelPan(mouseX,mouseY,worldX,worldY)
{
    ChangeToLoading();

    var MapRange = DoGetMapRange();
    var wdeltax = ((MapRange[0] + MapRange[2])/2) - worldX;
    var wdeltay = ((MapRange[3] + MapRange[1])/2) - worldY;
    
    var xmin = MapRange[0] - wdeltax;
    var xmax = MapRange[2] - wdeltax;
    var ymin = MapRange[1] - wdeltay;
    var ymax = MapRange[3] - wdeltay;

    zoomExtent(xmin, ymin, xmax, ymax);

    gMC.rate_x = (gMC.mMapWidth / 2) - mouseX;
    gMC.rate_y = (gMC.mMapHeight / 2) - mouseY;    
    gMC.rate = 0;    
        
    doAnimPan();
}

function doAnimPan()
{
  // grande fred !!!
  if (gMC.rate >= (Math.PI)) {
    clearTimeout(zt);
    return;
  } else {
    var timerXpos = (((- Math.cos(gMC.rate) + 1) / 2) * gMC.rate_x);
    var timerYpos = (((- Math.cos(gMC.rate) + 1) / 2) * gMC.rate_y);

    LayerMove(gMC.mMapImageName, timerXpos, timerYpos);
    //LayerMove(gMC.mMapContentName, timerXpos, timerYpos);
    gMC.rate = gMC.rate + (Math.PI / 30);
    var zt = setTimeout('doAnimPan()',5);
  }
}

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];
	}


    //ATENÇÃO: Adaptar conforme o elemento em que seja associado o zoomBox
    //	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;
			gMC.mouseButtonDownMiddle = event.button==4;
		}
	}

}

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 - 0;
	if (gMC.mouseY>=gMC.mMapHeight) gMC.mouseY = gMC.mMapHeight - 0;
	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.mouseButtonDownMiddle)
	{
			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");
			LayerMove(gMC.mMapContentName, gMC.mParentHorizontalOffset, gMC.mParentVerticalOffset);
			LayerClip(gMC.mMapContentName, "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);		
	LayerMove(gMC.mMapContentName, gMC.mParentHorizontalOffset + gMC.mouseX - gMC.x1, gMC.mParentVerticalOffset + gMC.mouseY - gMC.y1);
	LayerClip(gMC.mMapContentName, 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")			
			LayerMove(gMC.mMapContentName, gMC.mParentHorizontalOffset, gMC.mParentVerticalOffset);
			LayerClip(gMC.mMapContentName, "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");
		
		
		//LayerHide(gMC.mMapContentName);
		//LayerMove(gMC.mMapContentName, gMC.mParentHorizontalOffset, gMC.mParentVerticalOffset);
		//LayerClip(gMC.mMapContentName, "auto", "auto", "auto", "auto");
		
          if ((Math.abs(gMC.mouseX - gMC.x1) <= 3) && (Math.abs(gMC.mouseY - gMC.y1) <= 3 ))
          {
            if (!isNav)           
            {
                var panX = getWorldFromPixel(gMC.mMapRange[0], gMC.mMapRange[2],0,gMC.mMapWidth,  gMC.mouseX, false );            
                var panY = getWorldFromPixel(gMC.mMapRange[1], gMC.mMapRange[3],0, gMC.mMapHeight, gMC.mouseY,true );
            
                if (!gMC.IsBusy) doWheelPan(gMC.mouseX, gMC.mouseY, panX, panY);
            }
            
            return false;
           }				
			
		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();		

	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 + "px";
			win.style.left = gMC.mHorizontalOffset + "px";
		}
	}
	
	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()
{

	var lang = "pt";
	
	if (document.getElementById("language") != null && document.getElementById("language").value!= "")
	{	
	    lang = document.getElementById("language").value;
	}
    
    if (lang == "pt")
    {
	    setMeasureWindowTitles("Segmento:", "Total:");
    } else if (lang == "en") { 	    
	    setMeasureWindowTitles("Segment:", "Total:");
    } else {
        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()
{	
	var lang = "pt";
	
	if (document.getElementById("language") != null && document.getElementById("language").value!= "")
	{	
	    lang = document.getElementById("language").value;
	}
    
    if (lang == "pt")
    {
        setMeasureWindowTitles("Per&#237;metro:", "&#193;rea:");
    } else if (lang == "en") {	    
	    setMeasureWindowTitles("Perimeter:", "Total:");
    } else {
        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)
	{	
		// 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(gMC.mDrawingWidth);
		jg_dynamic.setColor(gMC.mDrawingColor);		
		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)
	{		
		// 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(gMC.mDrawingWidth);
		jg_dynamic.setColor(gMC.mDrawingColor);		
		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 _doGetFeatureCollectionByIndex(index)
{
    return gMC.FeaturesCollection[index];
}
function _doGetFeatureCollectionById(id)
{
    var retVal = null;

    for (i=0;i<gMC.FeaturesCollection.length; i++)
    {
        if (gMC.FeaturesCollection[i].Id == id)
        {
            retVal = gMC.FeaturesCollection[i];
            break;
        }
    }
    
    return retVal;
}
function _doDrawFeaturesCollection(minx, miny, maxx, maxy)
{
    var features;
    
    var j=0;
    
    for (j=0;j<gMC.FeaturesCollection.length;j++)
    {
        features = gMC.FeaturesCollection[j];
        
        features.Draw(minx, miny, maxx, maxy);
    }
}
function _doDrawFeatures(minx, miny, maxx, maxy)
{
    var graphics = this.GraphicsLayer;
    //graphics.clear();
     $("[group=" + this.Id + "]").remove();
    
    var features = this.Features;
    
    for (i=0; i < features.length; i++)
    {
        try
        {
            feature = 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, graphics, this.Id);
            } 
        } catch (err) {            
        }
    }
    
    graphics.paint();
            
    if (tooltip.showFunction != null)
    {
      $("a.tipSource").hoverIntent({
        sensitivity: 1, // number = sensitivity threshold (must be 1 or higher)
        interval: 250, // number = milliseconds for onMouseOver polling interval        
        over: tooltip.showFunction, //over: showTooltip -> function = onMouseOver callback (required)
        timeout: 0, // number = milliseconds delay before onMouseOut        
        out: tooltip.hideFunction //out: hideTooltip -> function = onMouseOut callback (required)
      }).click(function() {});                   
    }             
}
function _doClearFeatures()
{    
    this.Features = new Array();
    var graphics = this.GraphicsLayer;
    
    $("[group=" + this.Id + "]").remove();
    //graphics.clear();
}

function _doDrawFeaturesHotPOI(minx, miny, maxx, maxy)
{
    var graphics = this.GraphicsLayer;
    
    $("[group=" + this.Id + "]").remove(); 
    
    var features = this.Features;
    
    for (i=0; i < features.length; i++)
    {
        try
        {
            feature = 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, graphics, this.Id);
            } 
        } catch (err) {            
        }
    }
    
    graphics.paint();
    
    var tlp = this.Tooltip;
                
    if (tlp.showFunction != null)
    {
      $("a.tipSourceHotPOI").hoverIntent({
        sensitivity: 1, // number = sensitivity threshold (must be 1 or higher)
        interval: 250, // number = milliseconds for onMouseOver polling interval
        over: tlp.showFunction,
        timeout: 0, // number = milliseconds delay before onMouseOut        
        out: tlp.hideFunction //out: hideTooltip -> function = onMouseOut callback (required)
      }).click(function() {});                   
    }             
}

function _doDrawMeteoFeatures(minx, miny, maxx, maxy)
{
    var graphics = this.GraphicsLayer;
    graphics.clear();
    
    var features = this.Features;
    
    for (i=0; i < features.length; i++)
    {
        try
        {
            feature = 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, graphics, this.Id);
            } 
        } catch (err) {            
        }
    }
    
    graphics.paint();                        
}
function _doClearMeteoFeatures()
{
    this.Features = new Array();
    var graphics = this.GraphicsLayer;
    
    graphics.clear();
}

///////////////////////////////////////////////////////////////////////////////
// Graphics functions                                                         //
///////////////////////////////////////////////////////////////////////////////
function _doDrawGraphics(minx, miny, maxx, maxy)
{
    jg_dynamic.clear();
    jg_fix.clear();
    
    for (var i=0; i < gMC.Graphics.length; i++)
    {
        try
        {
            var graphic = gMC.Graphics[i];            
            var geom = graphic.Geometry;;
                                    
            if (geom.geometryType = 2)
            {    
                var xArray = Array(geom.m_pointCount);
                var yArray = Array(geom.m_pointCount);
    
                for (var j=0;j<geom.m_pointCount;j++)
                {                                                          
	                xArray[j] = getPixelX(gMC.mMapWidth, minx, maxx, geom.pointsArray[j].X);
	                yArray[j] = getPixelY(gMC.mMapHeight, miny, maxy, geom.pointsArray[j].Y);
                }

	            //design  the line by teh JS Class
	            jg_fix.setStroke(graphic.Symbol.Width);
	            jg_fix.setColor(graphic.Symbol.Color);
	            jg_fix.drawPolygon(xArray,yArray);
            } 
        } catch (err) {            
        }
    }
    
    jg_fix.paint();   
}