var MAPCONTROL = 'MapControl1';

var ADMIN_LEVEL = "";

var ZOOM_FACTOR = 3;
var ZOOM_BUFFER = 100;
var ZOOM_BUFFER_PLACE = 600;
var ZOOM_BUFFER_STREET = 200;
var ZOOM_BUFFER_POI = 300;

var ZOOM_LIMIT_LOW = 500;
var ZOOM_LIMIT_HIGH = 130000;

var DRAW_POI_MINSCALE = 75000;
var SHOW_POI = true;

var SEARCH_BUFFER = 50;

var MAP_WIDTH = 568;
var MAP_HEIGHT = 414;

//var EXTENT_LEFT = -23000;
//var EXTENT_RIGHT = 6000;
//var EXTENT_TOP = -271500;
//var EXTENT_BOTTOM = -288800;
var EXTENT_LEFT =  -120000;
var EXTENT_RIGHT = 90000;
var EXTENT_TOP = -220000;
var EXTENT_BOTTOM = -340000;   

var actNothing = 0;
var actShowRange = 1;
var actViewAll = 2;
var actFitToScale = 3;

var verSimple = 1;
var verSVG = 2;
var curVersion = verSimple;

var gIsBusy = false;

//Tempo de espera pela produção do mapa
var timeOutValue = 50000;
var timer;

///////////////////////////////////////////////////////////////////////////////

function DoBodyLoad()
{
	ChangeToLoading();	

	//if ( document.frmMap.txtHiddenSelectedTab.value != '' ) { showDetails(document.frmMap.txtHiddenSelectedTab.value); } else { showDetails("1"); }
	
	gMC.CallBackZoomBox = onZoomBox;
	gMC.CallBackPan = onPan;
	gMC.SetZoomBoxLineWidth( 2 );
	gMC.SetZoomBoxColor( "#ff0000" );
	
	MapRange=DoGetMapRange();
	gMC.SetMapRange(MapRange);
	
	curVersion = DetectMapVersion();

	switch (curVersion)
		{
			case verSVG:			
				{
					DoInitMapSVG();
				}				
				break;
			case verSimple:
				{
					DoInitMapSimple();
				}
				break;				
		}

		CheckIfDynLinesAreInserted()
		CheckIfDynPolygonsAreInserted()				
		
		ChangeToMain();

}
function DoBodyUnLoad()
{
	return;
}
function DoInitMapSimple()
{
	return;
}

///////////////////////////////////////////////////////////////////////////////
// FUNCTIONS                                                                 //
///////////////////////////////////////////////////////////////////////////////
function ChangeToLoading()
{
	document.getElementById("mapLoadingBar").className = "visible";

	gIsBusy=true;
	gMC.IsBusy=true;			
	
	timer=setTimeout("ChangeToMain()",timeOutValue)
}
function ChangeToMain()
{
    //hideLoadingBar();
    
    document.getElementById(gMC.mMapImageName).className = "visible show";
    document.getElementById("mapLoadingBar").className = "invisible";

    gMC.doClearGraphics();
	gIsBusy=false;
	gMC.IsBusy=false;
	
	gMC.SetModeMousePointer(gMC.mCurrentWorkMode);
			
	clearTimeout(timer);
}

function DetectMapVersion()
{
	return 1;
}
//Set the Map element Name
//Map control is dynamically created and the name is based on the control name: controlname_divMap
function SetMap(mapName)
{
	MAPCONTROL = mapName;
}
function DoGetMapScale()
{
	return document.getElementById(MAPCONTROL + "_txtHiddenScale").value;
}
function DoGetMapState()
{
	return document.getElementById(MAPCONTROL + "_map_state").value;
}
function DoShowMapScale(scale)
{
	if (document.getElementById("txtScale") != null)
	{
		document.getElementById("txtScale").value= parseInt(scale);
	}
}
function RangeAdjust(MapRange,f)
{
	var Delta;
	var Center;
	var deltaX;
	var deltaY;

	MapRange[0]=parseFloat(MapRange[0]);
	MapRange[1]=parseFloat(MapRange[1]);
	MapRange[2]=parseFloat(MapRange[2]);
	MapRange[3]=parseFloat(MapRange[3]);

	deltaX = Math.abs(MapRange[2]-MapRange[0]);
	deltaY = Math.abs(MapRange[3]-MapRange[1]);

	if (deltaX>deltaY)
	{
		Delta = deltaX * MAP_HEIGHT/MAP_WIDTH;
		Center = (MapRange[1]+MapRange[3])/2;
		MapRange[1] = Center - Delta/2;
		MapRange[3] = Center + Delta/2;
	}
	else
	{
		Delta = deltaY * MAP_WIDTH/MAP_HEIGHT;
		Center = (MapRange[0]+MapRange[2])/2;
		MapRange[0] = Center - Delta/2;
		MapRange[2] = Center + Delta/2;
	}

	deltaX = Math.abs(MapRange[2]-MapRange[0])*f;
	deltaY = Math.abs(MapRange[3]-MapRange[1])*f;

	Center = (MapRange[0]+MapRange[2])/2;
	MapRange[0] = Center - deltaX/2;
	MapRange[2] = Center + deltaX/2;

	Center = (MapRange[1]+MapRange[3])/2;
	MapRange[1] = Center - deltaY/2;
	MapRange[3] = Center + deltaY/2;

	return MapRange;
}
function DoGetMapRange()
{
	var MapRange = document.getElementById(MAPCONTROL + "_txtHiddenRange").value.split("|");

	MapRange[0] = parseFloat( MapRange[0] );
	MapRange[1] = parseFloat( MapRange[1] );
	MapRange[2] = parseFloat( MapRange[2] );
	MapRange[3] = parseFloat( MapRange[3] );
	
	return MapRange;
}
function DoShowMapByRealRange(left, top, right, bottom)
{	
	gMC.doClearGraphics();

	//MapRequest	
	zoomExtent(left, top, right, bottom);
	
	var MapRange=DoGetMapRange();
	gMC.SetMapRange(MapRange);	
}
function DoShowMapByPixelRange(left, top, right, bottom)
{

    MapCenteredRange = new Array();
	var MapRange = DoGetMapRange();
			    
	var X0 = getWorldFromPixel( gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  left,   false );
	var Y0 = getWorldFromPixel( gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, top,    true  );
	var X1 = getWorldFromPixel( gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth,  right,  false );
	var Y1 = getWorldFromPixel( gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, bottom, true  );


	
	var scale = DoGetMapScale();
	
	//if (ZOOM_LIMIT_LOW == scale){
	//alert("Já atingiu a aproximação máxima")
	//return false;
	//}
	
	
	
	scale = scale/(MAP_WIDTH/(right-left));
	

	if (X1 < (EXTENT_LEFT) || X0 > (EXTENT_RIGHT) || Y0 < (EXTENT_BOTTOM) || Y1 > (EXTENT_TOP))
	{
	    //O novo mapa está fora da extensão permitida. Cancela a operação
	    //LayerShow(gMC.mMapImageName);
	    LayerShow(gMC.mMapContentName);
	    
	    return false;
	}
	
	// Fred Modif 10-08-2006                       ------------------------------------------------
	if (ZOOM_LIMIT_LOW > scale) {
    MapCenteredRange[0] = X0;
	MapCenteredRange[1] = Y0;
	MapCenteredRange[2] = X1;
	MapCenteredRange[3] = Y1;
	MapCenteredRange = RangeAdjust(MapCenteredRange,ZOOM_LIMIT_LOW/scale);
	DoShowMapByRealRange(MapCenteredRange[0], MapCenteredRange[1], MapCenteredRange[2], MapCenteredRange[3]);
	
	
	return false
	}
	
	
	DoShowMapByRealRange(X0, Y0, X1, Y1);

}

function DoClearFeatures()
{
    if (gMC.IsBusy) return;
        
    for (var i=0; i<gMC.FeaturesCollection.length; i++)
    {
        var feaCol = gMC.FeaturesCollection[i];
        
        if (!feaCol.Persistent && feaCol.Clear != null)
        {
            feaCol.Clear();
        }
    }    

    gMC.Graphics = new Array();
	gMC.doClearGraphics();
	
	//MapRequest	
	clearFeatures();
}

///////////////////////////////////////////////////////////////////////////////
// OPERATIONS
function DesignLines(strLine){

	strLine = strLine.substring(0,strLine.length-1)
	var PointsArray  = strLine.split(";");
	
	var X1=PointsArray[0].split(",")[0];
	var Y1=PointsArray[0].split(",")[1];
	var X2=PointsArray[1].split(",")[0];
	var Y2=PointsArray[1].split(",")[1];
		
    jg_dynamic.setStroke(gMC.mDrawingWidth);
	jg_dynamic.setColor(gMC.mDrawingColor);
	jg_dynamic.drawLine(parseFloat(X1), parseFloat(Y1), parseFloat(X2), parseFloat(Y2));
	jg_dynamic.paint();		
	//jg_fix.setStroke(2);
	//jg_fix.setColor("#ff0000");
	//jg_fix.drawLine(parseFloat(X1), parseFloat(Y1), parseFloat(X2), parseFloat(Y2));
	//jg_fix.paint();	
}

//CHECK IF DYNAMIC POLYGONS ARE INSIDE THE RANGE
function CheckIfDynPolygonsAreInserted()
{
	if (document.getElementById(MAPCONTROL + "_txtHiddenDynPolygon").value != 0)
	{
		var PointsCounter;
		var PolyLinesCounter;
		var MapRange = DoGetMapRange();
		var PolyLinesArray  = document.getElementById(MAPCONTROL + "_txtHiddenDynPolygon").value.split("|");
		var strFinal = "";
		var LeftLine = new _Line();
		LeftLine.StartPoint.X = 0;
		LeftLine.StartPoint.Y = 0; 
		LeftLine.EndPoint.X = 0; 
		LeftLine.EndPoint.Y = MAP_HEIGHT;
		var RightLine = new _Line();
		RightLine.StartPoint.X = MAP_WIDTH;
		RightLine.StartPoint.Y = 0;
		RightLine.EndPoint.X = MAP_WIDTH;
		RightLine.EndPoint.Y = MAP_HEIGHT;
		var TopLine = new _Line();
		TopLine.StartPoint.X = 0;
		TopLine.StartPoint.Y = MAP_HEIGHT;
		TopLine.EndPoint.X = MAP_WIDTH;
		TopLine.EndPoint.Y = MAP_HEIGHT;
		var BottomLine = new _Line();
		BottomLine.StartPoint.X = 0;
		BottomLine.StartPoint.Y = 0;
		BottomLine.EndPoint.X = MAP_WIDTH;
		BottomLine.EndPoint.Y = 0;

		for( PolyLinesCounter=0; PolyLinesCounter<PolyLinesArray.length; PolyLinesCounter++ )
		{
			var PointsArray = PolyLinesArray[PolyLinesCounter].split(";");
			for(PointsCounter=0; PointsCounter<PointsArray.length-1; PointsCounter++ ){
				//All the Points of the array
				var pixelX1 = getPixelFromWorld( MapRange[0], MapRange[2], 0, MAP_WIDTH,  parseFloat(PointsArray[PointsCounter].split(",")[0]), false);
				var pixelY1 = getPixelFromWorld( MapRange[1], MapRange[3], 0, MAP_HEIGHT, parseFloat(PointsArray[PointsCounter].split(",")[1]), true);
				var pixelX2 = getPixelFromWorld( MapRange[0], MapRange[2], 0, MAP_WIDTH,  parseFloat(PointsArray[PointsCounter+1].split(",")[0]), false);
				var pixelY2 = getPixelFromWorld( MapRange[1], MapRange[3], 0, MAP_HEIGHT, parseFloat(PointsArray[PointsCounter+1].split(",")[1]), true);

				if((pixelX1>0) && (pixelY1>0) && pixelX1<MAP_WIDTH && pixelY1<MAP_HEIGHT){
					//first point is inside
					strFinal = strFinal + pixelX1 + "," + pixelY1 + ";";
					if((pixelX2>0) && (pixelY2>0) && pixelX2<MAP_WIDTH && pixelY2<MAP_HEIGHT){
						//both Points are inside
						strFinal = strFinal + pixelX2 + "," + pixelY2 + ";";
						
						DesignLines(strFinal)
						strFinal=""
					}
					else
					{
					//Second Point is not inside but first yes
						var DynLine = new _Line();
						DynLine.StartPoint.X= pixelX1;
						DynLine.StartPoint.Y= pixelY1;
						DynLine.EndPoint.X= pixelX2;
						DynLine.EndPoint.Y= pixelY2;
						var intersectPoint = new _Point();
						intersectBottom = GetIntersectPoint(DynLine, BottomLine);
						intersectTop = GetIntersectPoint(DynLine, TopLine);
						intersectLeft = GetIntersectPoint(DynLine, LeftLine);
						intersectRight = GetIntersectPoint(DynLine, RightLine)
						if (intersectBottom.X >= 0 && intersectBottom.Y >= 0)
							strFinal = strFinal + intersectBottom.X + "," + intersectBottom.Y + ";";
						if (intersectTop.X >= 0 && intersectTop.Y >= 0 ) 
							strFinal = strFinal + intersectTop.X + "," + intersectTop.Y + ";";
						if (intersectLeft.X >= 0 && intersectLeft.Y >= 0) 
							strFinal = strFinal  + intersectLeft.X + "," + intersectLeft.Y + ";";
						if (intersectRight.X >= 0 && intersectRight.Y >= 0) 
							strFinal = strFinal + intersectRight.X + "," + intersectRight.Y + ";";
						
							DesignLines(strFinal)
							strFinal=""
					}
				}
				else
				{
					if((pixelX2>0) && (pixelY2>0) && pixelX2<MAP_WIDTH && pixelY2<MAP_HEIGHT){
						//First Point is not inside, but second yes
						var DynLine = new _Line();
						DynLine.StartPoint.X= pixelX1;
						DynLine.StartPoint.Y= pixelY1;
						DynLine.EndPoint.X= pixelX2;
						DynLine.EndPoint.Y= pixelY2;
						strFinal = strFinal + pixelX2 + "," + pixelY2 + ";";
						var intersectBottom = new _Point();
						intersectBottom = GetIntersectPoint(DynLine, BottomLine);
						var intersectTop = new _Point();
						intersectTop = GetIntersectPoint(DynLine, TopLine);
						var intersectLeft = new _Point();
						intersectLeft =GetIntersectPoint(DynLine, LeftLine);
						var intersectRight = new _Point();
						intersectRight = GetIntersectPoint(DynLine, RightLine)
						if (intersectBottom.X >= 0 && intersectBottom.Y >= 0)
							strFinal = strFinal + intersectBottom.X + "," + intersectBottom.Y + ";";
						if (intersectTop.X >= 0 && intersectTop.Y >= 0 ) 
							strFinal = strFinal + intersectTop.X + "," + intersectTop.Y + ";";
						if (intersectLeft.X >= 0 && intersectLeft.Y >= 0) 
							strFinal = strFinal + intersectLeft.X + "," + intersectLeft.Y + ";";
						if (intersectRight.X >= 0 && intersectRight.Y >= 0) 
							strFinal = strFinal + intersectRight.X + "," + intersectRight.Y + ";";

							DesignLines(strFinal)
							strFinal=""
					}
					else
					{
						var DynLine = new _Line();
						DynLine.StartPoint.X= pixelX1;
						DynLine.StartPoint.Y= pixelY1;
						DynLine.EndPoint.X= pixelX2;
						DynLine.EndPoint.Y= pixelY2;
						var intersectBottom = new _Point();
						intersectBottom = GetIntersectPoint(DynLine, BottomLine);
						var intersectTop = new _Point();
						intersectTop = GetIntersectPoint(DynLine, TopLine);
						var intersectLeft = new _Point();
						intersectLeft =GetIntersectPoint(DynLine, LeftLine);
						var intersectRight = new _Point();
						intersectRight = GetIntersectPoint(DynLine, RightLine)
						if (intersectBottom.X >= 0 && intersectBottom.Y >= 0)
							strFinal = strFinal + intersectBottom.X + "," + intersectBottom.Y + ";";
						if (intersectTop.X >= 0 && intersectTop.Y >= 0 ) 
							strFinal = strFinal + intersectTop.X + "," + intersectTop.Y + ";";
						if (intersectLeft.X >= 0 && intersectLeft.Y >= 0) 
							strFinal = strFinal + intersectLeft.X + "," + intersectLeft.Y + ";";
						if (intersectRight.X >= 0 && intersectRight.Y >= 0) 
							strFinal = strFinal + intersectRight.X + "," + intersectRight.Y + ";";
						if (strFinal != ""){ 	
							DesignLines(strFinal)
							strFinal=""
						}
					}
				}
			}
		}	
	}
}
//CHECK IF DYNAMIC LINES ARE INSIDE THE RANGE
function CheckIfDynLinesAreInserted()
{
	if (document.getElementById(MAPCONTROL + "_txtHiddenDynLine").value != 0)
	{
		var PointsCounter;
		var PolyLinesCounter;
		var MapRange = DoGetMapRange();
		var PolyLinesArray  = document.frmMap.txtHiddenDynLine.value.split("|");
		var strFinal = "";
		var LeftLine = new _Line();
		LeftLine.StartPoint.X = 0;
		LeftLine.StartPoint.Y = 0; 
		LeftLine.EndPoint.X = 0; 
		LeftLine.EndPoint.Y = MAP_HEIGHT;
		var RightLine = new _Line();
		RightLine.StartPoint.X = MAP_WIDTH;
		RightLine.StartPoint.Y = 0;
		RightLine.EndPoint.X = MAP_WIDTH;
		RightLine.EndPoint.Y = MAP_HEIGHT;
		var TopLine = new _Line();
		TopLine.StartPoint.X = 0;
		TopLine.StartPoint.Y = MAP_HEIGHT;
		TopLine.EndPoint.X = MAP_WIDTH;
		TopLine.EndPoint.Y = MAP_HEIGHT;
		var BottomLine = new _Line();
		BottomLine.StartPoint.X = 0;
		BottomLine.StartPoint.Y = 0;
		BottomLine.EndPoint.X = MAP_WIDTH;
		BottomLine.EndPoint.Y = 0;

		for( PolyLinesCounter=0; PolyLinesCounter<PolyLinesArray.length; PolyLinesCounter++ )
		{
			var PointsArray = PolyLinesArray[PolyLinesCounter].split(";");
			for(PointsCounter=0; PointsCounter<PointsArray.length-1; PointsCounter++ ){
				//All the Points of the array
				var pixelX1 = getPixelFromWorld( MapRange[0], MapRange[2], 0, MAP_WIDTH,  parseFloat(PointsArray[PointsCounter].split(",")[0]), false);
				var pixelY1 = getPixelFromWorld( MapRange[1], MapRange[3], 0, MAP_HEIGHT, parseFloat(PointsArray[PointsCounter].split(",")[1]), true);
				var pixelX2 = getPixelFromWorld( MapRange[0], MapRange[2], 0, MAP_WIDTH,  parseFloat(PointsArray[PointsCounter+1].split(",")[0]), false);
				var pixelY2 = getPixelFromWorld( MapRange[1], MapRange[3], 0, MAP_HEIGHT, parseFloat(PointsArray[PointsCounter+1].split(",")[1]), true);

				if((pixelX1>0) && (pixelY1>0) && pixelX1<MAP_WIDTH && pixelY1<MAP_HEIGHT){
					//first point is inside
					strFinal = strFinal + pixelX1 + "," + pixelY1 + ";";
					if((pixelX2>0) && (pixelY2>0) && pixelX2<MAP_WIDTH && pixelY2<MAP_HEIGHT){
						//both Points are inside
						strFinal = strFinal + pixelX2 + "," + pixelY2 + ";";
						
						DesignLines(strFinal)
						strFinal=""
					}
					else
					{
					//Second Point is not inside but first yes
						var DynLine = new _Line();
						DynLine.StartPoint.X= pixelX1;
						DynLine.StartPoint.Y= pixelY1;
						DynLine.EndPoint.X= pixelX2;
						DynLine.EndPoint.Y= pixelY2;
						var intersectPoint = new _Point();
						intersectBottom = GetIntersectPoint(DynLine, BottomLine);
						intersectTop = GetIntersectPoint(DynLine, TopLine);
						intersectLeft = GetIntersectPoint(DynLine, LeftLine);
						intersectRight = GetIntersectPoint(DynLine, RightLine)
						if (intersectBottom.X >= 0 && intersectBottom.Y >= 0)
							strFinal = strFinal + intersectBottom.X + "," + intersectBottom.Y + ";";
						if (intersectTop.X >= 0 && intersectTop.Y >= 0 ) 
							strFinal = strFinal + intersectTop.X + "," + intersectTop.Y + ";";
						if (intersectLeft.X >= 0 && intersectLeft.Y >= 0) 
							strFinal = strFinal  + intersectLeft.X + "," + intersectLeft.Y + ";";
						if (intersectRight.X >= 0 && intersectRight.Y >= 0) 
							strFinal = strFinal + intersectRight.X + "," + intersectRight.Y + ";";
						
							DesignLines(strFinal)
							strFinal=""
					}
				}
				else
				{
					if((pixelX2>0) && (pixelY2>0) && pixelX2<MAP_WIDTH && pixelY2<MAP_HEIGHT){
						//First Point is not inside, but second yes
						var DynLine = new _Line();
						DynLine.StartPoint.X= pixelX1;
						DynLine.StartPoint.Y= pixelY1;
						DynLine.EndPoint.X= pixelX2;
						DynLine.EndPoint.Y= pixelY2;
						strFinal = strFinal + pixelX2 + "," + pixelY2 + ";";
						var intersectBottom = new _Point();
						intersectBottom = GetIntersectPoint(DynLine, BottomLine);
						var intersectTop = new _Point();
						intersectTop = GetIntersectPoint(DynLine, TopLine);
						var intersectLeft = new _Point();
						intersectLeft =GetIntersectPoint(DynLine, LeftLine);
						var intersectRight = new _Point();
						intersectRight = GetIntersectPoint(DynLine, RightLine)
						if (intersectBottom.X >= 0 && intersectBottom.Y >= 0)
							strFinal = strFinal + intersectBottom.X + "," + intersectBottom.Y + ";";
						if (intersectTop.X >= 0 && intersectTop.Y >= 0 ) 
							strFinal = strFinal + intersectTop.X + "," + intersectTop.Y + ";";
						if (intersectLeft.X >= 0 && intersectLeft.Y >= 0) 
							strFinal = strFinal + intersectLeft.X + "," + intersectLeft.Y + ";";
						if (intersectRight.X >= 0 && intersectRight.Y >= 0) 
							strFinal = strFinal + intersectRight.X + "," + intersectRight.Y + ";";

							DesignLines(strFinal)
							strFinal=""
					}
					else
					{
						var DynLine = new _Line();
						DynLine.StartPoint.X= pixelX1;
						DynLine.StartPoint.Y= pixelY1;
						DynLine.EndPoint.X= pixelX2;
						DynLine.EndPoint.Y= pixelY2;
						var intersectBottom = new _Point();
						intersectBottom = GetIntersectPoint(DynLine, BottomLine);
						var intersectTop = new _Point();
						intersectTop = GetIntersectPoint(DynLine, TopLine);
						var intersectLeft = new _Point();
						intersectLeft =GetIntersectPoint(DynLine, LeftLine);
						var intersectRight = new _Point();
						intersectRight = GetIntersectPoint(DynLine, RightLine)
						if (intersectBottom.X >= 0 && intersectBottom.Y >= 0)
							strFinal = strFinal + intersectBottom.X + "," + intersectBottom.Y + ";";
						if (intersectTop.X >= 0 && intersectTop.Y >= 0 ) 
							strFinal = strFinal + intersectTop.X + "," + intersectTop.Y + ";";
						if (intersectLeft.X >= 0 && intersectLeft.Y >= 0) 
							strFinal = strFinal + intersectLeft.X + "," + intersectLeft.Y + ";";
						if (intersectRight.X >= 0 && intersectRight.Y >= 0) 
							strFinal = strFinal + intersectRight.X + "," + intersectRight.Y + ";";
						if (strFinal != ""){ 	
							DesignLines(strFinal)
							strFinal=""
						}
					}
				}
			}
		}
			
	}
}
///////////////////////////////////////////////////////////////////////////////
// OPERATIONS
//////////////////////////////////////////////////////////////////////////////
function DoPanArrow(direction)
{
	if(gIsBusy) return;
	var MapRange = DoGetMapRange();
	var deltaX = Math.abs(MapRange[2]-MapRange[0])/2;
	var deltaY = Math.abs(MapRange[3]-MapRange[1])/2;
	var X0, X1, Y0, Y1;
	
	switch (direction)
	{
		case "NW":
			{
				X0 = MapRange[0] - deltaX;
				Y0 = MapRange[1] + deltaY;
				X1 = MapRange[2] - deltaX;
				Y1 = MapRange[3] + deltaY;
			}
			break;
		case "N":
			{
				X0 = MapRange[0];
				Y0 = MapRange[1] + deltaY;
				X1 = MapRange[2];
				Y1 = MapRange[3] + deltaY;
			}
			break;
		case "NE":
			{
				X0 = MapRange[0] + deltaX;
				Y0 = MapRange[1] + deltaY;
				X1 = MapRange[2] + deltaX;
				Y1 = MapRange[3] + deltaY;
			}
			break;
		case "E":
			{
				X0 = MapRange[0] + deltaX;
				Y0 = MapRange[1];
				X1 = MapRange[2] + deltaX;
				Y1 = MapRange[3];
			}
			break;
		case "SE":
			{
				X0 = MapRange[0] + deltaX;
				Y0 = MapRange[1] - deltaY;
				X1 = MapRange[2] + deltaX;
				Y1 = MapRange[3] - deltaY;
			}
			break;
		case "S":
			{
				X0 = MapRange[0];
				Y0 = MapRange[1] - deltaY;
				X1 = MapRange[2];
				Y1 = MapRange[3] - deltaY;
			}
			break;
		case "SW":
			{
				X0 = MapRange[0] - deltaX;
				Y0 = MapRange[1] - deltaY;
				X1 = MapRange[2] - deltaX;
				Y1 = MapRange[3] - deltaY;
			}
			break;
		case "W":
			{
				X0 = MapRange[0] - deltaX;
				Y0 = MapRange[1];
				X1 = MapRange[2] - deltaX;
				Y1 = MapRange[3];
			}
			break;
	}
	
	
	if (X0 < (EXTENT_LEFT)){
	    var difX0 = EXTENT_LEFT - X0;
	    X0 = X0 + difX0;
	    X1 = X1 + difX0;
	} else if
	(X1 > (EXTENT_RIGHT)){
	    var difX1 = X1 - EXTENT_RIGHT;
	    X0 = X0 - difX1;
	    X1 = X1 - difX1;
	}
	
	if (Y0 < (EXTENT_BOTTOM)){
	    var difY0 =  EXTENT_BOTTOM - Y0;
	    Y0 = Y0 + difY0;
	    Y1 = Y1 + difY0;
	} else if
	    (Y1 > (EXTENT_TOP)){
	    var difY1 = Y1 - EXTENT_TOP;
	    Y0 = Y0 - difY1;
	    Y1 = Y1 - difY1;
	}
	
	
	zoomExtent(X0, Y0, X1, Y1);

	
	
	//MapRequest
	
	
	//Foi retirado porque o range do mapa é atribuído depois da execução do MapReques (Ajax)
	//var MapRange=DoGetMapRange();
	//gMC.SetMapRange(MapRange);
}

function DoZoomIn()
{
	alert("teste");

	if(gIsBusy) return false;
	var Scale = DoGetMapScale();
	if (Math.round((Scale/ZOOM_FACTOR)) >= ZOOM_LIMIT_LOW)
	{
		var MapRange = DoGetMapRange();
		MapRange = RangeAdjust(MapRange,1/ZOOM_FACTOR);
		DoShowMapByRealRange(MapRange[0], MapRange[1], MapRange[2], MapRange[3]);
	} else {
		var MapRange = DoGetMapRange();
		MapRange = RangeAdjust(MapRange,ZOOM_LIMIT_LOW/Scale);
		DoShowMapByRealRange(MapRange[0], MapRange[1], MapRange[2], MapRange[3]);
	}

}
function DoZoomOut()
{
	if(gIsBusy) return;
	var Scale = DoGetMapScale();
	if (Math.round((Scale*ZOOM_FACTOR)) <= ZOOM_LIMIT_HIGH)
	{
		var MapRange = DoGetMapRange();
		MapRange = RangeAdjust(MapRange,ZOOM_FACTOR);
		DoShowMapByRealRange(MapRange[0], MapRange[1], MapRange[2], MapRange[3]);
	} else {

		var MapRange = DoGetMapRange();
		MapRange = RangeAdjust(MapRange,ZOOM_LIMIT_HIGH*Scale);
		DoShowMapByRealRange(MapRange[0], MapRange[1], MapRange[2], MapRange[3]);

	}
}
/*---------------------------------------------------
Autor: Ricardo Sena
Data: 2005/12/03
-----------------------------------------------------*/
function DoZoomInPoint()
{
	gMC.CallBackGetPoint = onZoomInPoint;
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POINT);
			break;
	}
	
	if(gMC.IsBusy) return;
}
/*---------------------------------------------------
Autor: Ricardo Sena
Data: 2005/12/03
-----------------------------------------------------*/
function DoZoomOutPoint()
{
	gMC.CallBackGetPoint = onZoomOutPoint;
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POINT);
			break;
	}
	
	if(gMC.IsBusy) return;
}
function DoZoomRectangle()
{	
	gMC.SetWorkMode( gMC.MODE_ZOOM_BOX );
	
	if(gMC.IsBusy) return;
}
function DoPan()
{
    gMC.SetWorkMode(gMC.MODE_PAN);
	
	if(gMC.IsBusy) return;		
}
/*---------------------------------------------------
Autor: Ricardo Sena
Data: 2006/02/13
-----------------------------------------------------*/
function DoMeasure()
{	
	jg_dynamic.clear();
		
	gMC.CallBackLine=onLineInserted;
		
	gMC.doAfterLineMouseMove = showLineSegmentLength;
	gMC.doAfterLineMouseDown = showLineTotalLength;
	
	gMC.doShowMeasureWindow(true);
	
	setMeasureWindowTitles("Segmento:", "Total:");
		
	document.getElementById("divMeasure").style.visibility = "visible";

	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_LINE);
			break;
	}
	
	if(gMC.IsBusy) return;
}
/*---------------------------------------------------
Autor: Ricardo Sena
Data: 2006/03/27
-----------------------------------------------------*/
function DoMeasureArea()
{	
	jg_dynamic.clear();	
	
	gMC.CallBackPolygon = onPolygonInserted;
		
	gMC.doAfterPolygonInserted = showPolygonTotalArea;
	
	gMC.doShowMeasureWindow(true);
	
	setMeasureWindowTitles("Per&#237;metro:", "&#193;rea:");
		
	document.getElementById("divMeasure").style.visibility = "visible";	
	
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POLYGON);
			break;
	}
	
	if(gMC.IsBusy) return;	
}
function DoCenterAt()
{
	if(gIsBusy) return;

	gMC.CallBackGetPoint = onCenterAt;					
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POINT);
			break;
	}
}
function DoFitView()
{
	if(gIsBusy) return false;
	DoShowMapByRealRange(EXTENT_LEFT, EXTENT_TOP, EXTENT_RIGHT, EXTENT_BOTTOM);
}

function DoFitToScale()
{
    if(gMC.IsBusy) return;
			
	if (document.getElementById("txtScale") != null)
	{
		var scale = document.getElementById("txtScale").value;				
				
		if (isNumber(scale) && (parseInt(scale) > 0))
		{		
			scale = parseInt(scale);

			if (scale < ZOOM_LIMIT_LOW)		scale = ZOOM_LIMIT_LOW;
			if (scale > ZOOM_LIMIT_HIGH)	scale = ZOOM_LIMIT_HIGH;
			
			zoomScale(scale);
		}
	}		
}

function DoSelectPoint()
{
	if(gIsBusy) return;

	gMC.CallBackGetPoint = onPointSelected;
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POINT);
			break;
	}		
}

function DoSelectByPolygon()
{
	if(gIsBusy) return;		
	
	gMC.CallBackPolygon = onPolygonInserted;
	
	gMC.doAfterPolygonInserted = onSelectByPolygon;
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POLYGON);
			break;
	}		
}
function DoClearSelection()
{
	if(gIsBusy) return false;
	DoShowMapByRealRange(EXTENT_LEFT, EXTENT_TOP, EXTENT_RIGHT, EXTENT_BOTTOM);
}

function DoCapturePoint()
{
	if(gIsBusy) return;

	gMC.CallBackGetPoint=onPointInserted;
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POINT);
			break;
	}	 
}

function DoCapturePolygon()
{
	if(gIsBusy) return;

	gMC.CallBackPolygon=onPolygonInserted;
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POLYGON);
			break;
	}	 
}

function DoCaptureLine()
{
	if(gIsBusy) return;

	gMC.CallBackLine=onLineInserted;
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_LINE);
			break;
	}	 
}

function DoCaptureInfoPoint()
{
	if(gIsBusy) return;

	gMV.CallBackGetPoint=onInfoPointInserted;
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMV.SetWorkMode(gMV.MODE_GET_POINT);
			break;
	}
	 
}
function DoPrint()
{
	if(gIsBusy) return;	
			
	var url = "forms/Print.aspx";
	
	if (document.getElementById("language") != null && document.getElementById("language").value != "")
	{
	    url += "?lang=" + document.getElementById("language").value;
	}
	
	if (!printWindow.closed && printWindow.location)
	{
		printWindow.location.href = url;
	}
	else
	{
		printWindow=window.open(url,"Imprimir","width=350,height=340");
		if (!printWindow.opener) printWindow.opener = self;
	}
	
	if (window.focus) {printWindow.focus()}
	
	return false;		
}

function DoDrawPolygon(clear)
{
	jg_dynamic.clear();
	
	if(clear)
	{
	    gMC.Graphics = new Array();
	    jg_fix.clear();	
	}
	
	gMC.CallBackPolygon = onPolygonInserted;
		
	gMC.doAfterPolygonInserted = onGeometryPolygonInserted;
		
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POLYGON);
			break;
	}
	
	if(gMC.IsBusy) return;	
}
function onGeometryPolygonInserted(geomstring)
{
    jg_dynamic.clear();
    jg_fix.clear();	
     
    gMC.Graphics = new Array();	          

    var i=0;
    var j=0;    
    
    var coords = geomstring.split(" ");    
    var numcoords = (coords.length-1)/2;
    
    var poly = new _Polygon();
    var pnt;
    
    for (i=0; i<numcoords; i++)
    {
        x = coords[(i*2)];
        y = coords[(i*2)+1];
    
        pnt = new _Point(x,y);
        
        poly.AddPoint(pnt);        
    }
    
    var graphicsCount = gMC.Graphics.length;    
    var symbol = new GraphicSymbol();       
    
    var g = new Graphic(graphicsCount, "graphics", poly, symbol);
        
    gMC.Graphics[graphicsCount] = g;
    
    var MapRange=DoGetMapRange();
	
	gMC.doDrawGraphics(MapRange[0], MapRange[1], MapRange[2], MapRange[3]);       
}


//
// New Function... Fred 06-12-2006  ######################################################
//


//function DoBookmark()
//{
//	if(gIsBusy) return;	
//	var url = "forms/bookmark.html";
//	
//	if (!BookmarkWindow.closed && BookmarkWindow.location)
//	{
//		BookmarkWindow.location.href = url;
//	}
//	else
//	{
//		BookmarkWindow=window.open(url,"Bookmak","width=200,height=400");
//		if (!BookmarkWindow.opener) BookmarkWindow.opener = self;
//	}
//	
//	if (window.focus) {BookmarkWindow.focus()}
//	
//	return false;		
//}

function DoCreateLink()
{
	gMC.CallBackGetPoint = onLinkInserted;
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POINT);
			break;
	}	
	
	if(gMC.IsBusy) return;
}
function DoTransCoords()
{
	if(gIsBusy) return;

	gMC.CallBackGetPoint = onTransCoordsInserted;
	switch (curVersion)
	{
		case verSVG:			
		case verSimple:
			gMC.SetWorkMode(gMC.MODE_GET_POINT);
			break;
	}	
}

///////////////////////////////////////////////////////////////////////////////
//                           EVENT HANDLERS                                  //
///////////////////////////////////////////////////////////////////////////////
function onLineInserted(xArray, yArray)
{
	var i=0;
	var strLine
	//design  the line by the JS Class
	jg_dynamic.setStroke(gMC.mGraphicsWidth);
	jg_dynamic.setColor(gMC.mGraphicsColor);
	jg_dynamic.drawPolyline(xArray,yArray);
	jg_dynamic.paint();
	
	//Save the points in the hidden
	strLine = document.getElementById(MAPCONTROL + "_txtHiddenDynLine").value;
	if (strLine !="")
	{
		strLine = document.getElementById(MAPCONTROL + "_txtHiddenDynLine").value + "|";
	}
	
	for(i=0;xArray.length>i;i++)
	{
		X=getWorldFromPixel(gMC.mMapRange[0], gMC.mMapRange[2], 0, MAP_WIDTH, xArray[i], false)
		Y=getWorldFromPixel(gMC.mMapRange[1], gMC.mMapRange[3], 0, MAP_HEIGHT, yArray[i], true)
		strLine= strLine + X + "," + Y + ";"
	}
	strLine = strLine.substring(0,strLine.length-1);

	document.getElementById(MAPCONTROL + "_txtHiddenDynLine").value = strLine;		
}

function onPolygonInserted(xArray, yArray)
{
	var strPolygon;
	var strPolygonGeom;
	var i=0;
	var X;
	var Y;
	var areaArray = new Array(xArray.length+1);
	var point = null;
		
	var teste = "";
		
//	//design the line by the JS Class	
	jg_dynamic.setStroke(gMC.mGraphicsWidth);
	jg_dynamic.setColor(gMC.mGraphicsColor);
	jg_dynamic.drawPolygon(xArray,yArray);
	jg_dynamic.paint();
	
	//Save the points in the hidden
	strPolygon = document.getElementById(MAPCONTROL + "_txtHiddenDynPolygon").value;
	strPolygonGeom = document.getElementById(MAPCONTROL + "_txtHiddenDynPolygon").value;
	if (strPolygon !="")
	{
		strPolygon = document.getElementById(MAPCONTROL + "_txtHiddenDynPolygon").value + "|";		
	}

	for(i=0;i<xArray.length;i++)
	{
		point = new _Point();
		
		point.X = getWorldFromPixel(gMC.mMapRange[0], gMC.mMapRange[2], 0, gMC.mMapWidth, xArray[i], false);
		point.Y = getWorldFromPixel(gMC.mMapRange[1], gMC.mMapRange[3], 0, gMC.mMapHeight, yArray[i], true);
		 
		
		areaArray[i] = point;
		strPolygon = strPolygon + point.X + "," + point.Y + ";"
		strPolygonGeom = strPolygonGeom + point.X + " " + point.Y + " "
		
		teste = teste + xArray[i] + " " + yArray[i] + " ";
	}
	//The first point is already in the end of the array
	//now, let's put the second in the end of the array
	point = new _Point()
	point.X = areaArray[1].X;
	point.Y = areaArray[1].Y;
	areaArray[xArray.length] = point;
	
	strPolygon = strPolygon.substring(0,strPolygon.length-1);

	document.getElementById(MAPCONTROL + "_txtHiddenDynPolygon").value = strPolygon;
	
	//Clear drawn polygon
	document.getElementById(MAPCONTROL + "_txtHiddenDynPolygon").value = "";
	
	if (gMC.doAfterPolygonInserted != null)
	{
		gMC.doAfterPolygonInserted(strPolygonGeom);
	}		
}

function onZoomBox(left, top, right, bottom)
{		
	DoShowMapByPixelRange(left, top, right, bottom);	
}
/*------------------------------------------------
Autor: Ricardo Sena
Data: 2005/12/03
Modified: Ricardo Sena, 9-08-2006
-------------------------------------------------*/
function onZoomInPoint(pixelX, pixelY, worldX, worldY)
{
	if (!gMC.mouseButtonDownLeft)
	{
		return false;
	}

	var Scale = DoGetMapScale();

	var MapRange = DoGetMapRange();
	var MapCenteredRange = new Array();

	var width=Math.abs(MapRange[2] - MapRange[0]);
	var height=Math.abs(MapRange[3] - MapRange[1]);
	
	MapCenteredRange[0] = worldX - width/2;
	MapCenteredRange[1] = worldY - height/2;
	MapCenteredRange[2] = worldX + width/2;
	MapCenteredRange[3] = worldY + height/2;


	if (Math.round((Scale/ZOOM_FACTOR)) >= ZOOM_LIMIT_LOW)
	{		    	    
		MapCenteredRange = RangeAdjust(MapCenteredRange,1/ZOOM_FACTOR);
	
	}
	else
	{
		MapCenteredRange = RangeAdjust(MapCenteredRange,ZOOM_LIMIT_LOW/Scale);
	}


	DoShowMapByRealRange(MapCenteredRange[0], MapCenteredRange[1], MapCenteredRange[2], MapCenteredRange[3]);		
}
/*------------------------------------------------
Autor: Ricardo Sena
Data: 2005/12/04
Modified: Fred, 9-08-2006
-------------------------------------------------*/
function onZoomOutPoint(pixelX, pixelY, worldX, worldY)
{
	if (!gMC.mouseButtonDownLeft)
	{
		return false;
	}

	    var MapRange = DoGetMapRange();
	    var MapCenteredRange = new Array();

	    var width=Math.abs(MapRange[2] - MapRange[0]);
	    var height=Math.abs(MapRange[3] - MapRange[1]);
	
	    MapCenteredRange[0] = worldX - width/2;
	    MapCenteredRange[1] = worldY - height/2;
	    MapCenteredRange[2] = worldX + width/2;
	    MapCenteredRange[3] = worldY + height/2;


	var Scale = DoGetMapScale();

	if (Math.round((Scale*ZOOM_FACTOR)) <= ZOOM_LIMIT_HIGH)
	{	    
		MapCenteredRange = RangeAdjust(MapCenteredRange,ZOOM_FACTOR);
		DoShowMapByRealRange(MapCenteredRange[0], MapCenteredRange[1], MapCenteredRange[2], MapCenteredRange[3]);
	}
	else   //Fred
	{
		DoFitView();	
	}		
}
function onPan(deltaX, deltaY)
{
	//DoShowMapByPixelRange(deltaX, deltaY, parseInt(parseInt(MAP_WIDTH)+parseInt(deltaX)), parseInt(parseInt(MAP_HEIGHT)+parseInt(deltaY)));
	DoShowMapByPixelRange(deltaX, deltaY, parseInt(parseInt(gMC.mMapWidth)+parseInt(deltaX)), parseInt(parseInt(gMC.mMapHeight)+parseInt(deltaY)));
	
}
function onCenterAt(pixelX, pixelY, worldX, worldY)
{
	var MapRange = DoGetMapRange();
	var MapCenteredRange = new Array();

	var width=Math.abs(MapRange[2] - MapRange[0]);
	var height=Math.abs(MapRange[3] - MapRange[1]);
	
	MapCenteredRange[0] = worldX - width/2;
	MapCenteredRange[1] = worldY - height/2;
	MapCenteredRange[2] = worldX + width/2;
	MapCenteredRange[3] = worldY + height/2;
	
	DoShowMapByRealRange(MapCenteredRange[0],MapCenteredRange[3],MapCenteredRange[2],MapCenteredRange[1]);
}
function onPointSelected(pixelX, pixelY, worldX, worldY)
{	
	if (!gMC.mouseButtonDownLeft)
	{
		return false;
	}

	gMC.doClearGraphics();

	queryLayersByPoint(worldX, worldY);	
}

function onSelectByPolygon(polyCoords)
{
	gMC.doClearGraphics();
	
	queryLayersByPolygon(polyCoords);
}

function onLinkInserted(pixelX, pixelY, worldX, worldY)
{
   if(gIsBusy) return;	
	
    var scale = "";
    var layers = "";

    
    scale = document.getElementById(MAPCONTROL + "_txtHiddenScale").value;
		
	var lang;
	
	if (document.getElementById("language") != null && document.getElementById("language").value != "")
	{
	    lang = document.getElementById("language").value;
	}
	
	var feature = worldX + ";" + worldY;
	
	addFeature(feature, true, null);	
	
	var layers = TBGetSelectedButtons();
	
	var data = eval("[{ 'id' : 'link', 'lang' : 'pt', 'scale' : scale, 'x' : worldX, 'y' : worldY, 'tema' : layers }]");
	
    var data = {
     id: 'link',
     lang: lang,
     scale: scale,
     x : worldX,
     y : worldY,
     tema : layers,
     label : ""
    };
	
	
	showPanel('link', data);
}

function onTransCoordsInserted(pixelX, pixelY, worldX, worldY)
{
   if(gIsBusy) return;	
			
   var feature = worldX + ";" + worldY;
	
   DoTransformCoordinates(worldX, worldY);	
}

function onPointInserted(pixelX, pixelY, worldX, worldY)
{
	jg_fix.setStroke(2);
	jg_fix.setColor("#ff0000");
	jg_fix.drawImage("images/alert.gif",parseInt(pixelX-16/2),parseInt(pixelY-16/2),16,16);
	jg_fix.paint();


	document.getElementById(MAPCONTROL + "_txtHiddenDynPoint").value = 
	document.getElementById(MAPCONTROL + "_txtHiddenDynPoint").value +
	worldX + '|' + worldY + '|';
}
function onInfoPointInserted(pixelX, pixelY, worldX, worldY)
{
	var layerID = document.frmMap.txtHiddenTemaActivo.value;
	
	if (layerID == '')
	{
		alert('Para pesquisar no mapa, active um dos temas da lista.')
	}
	else
	{
		//alert('aqui abre janela: layer activa=' + layerID + ' X:' + parseInt(worldX) + ' Y:' + parseInt(worldY));
		var WinSettings = "center=yes,resizable=no,scrollbars=yes";
		window.open('MapInfoForm.aspx?IDTema=' + layerID + '&X=' + parseInt(worldX) + '&Y=' + parseInt(worldY),'',WinSettings);
	}
}
