//********************** constants ******************************

// tool numbers
var ZOOM_IN_AREA = 0;
var ZOOM_OUT_AREA = 1;
var PAN = 2;
var ATTRIBUTE = 3;
var GET_COORDINATE = 4;
var MEASURE_DISTANCE = 5;
var MEASURE_AREA = 6;

// panning direction
var PAN_WEST = 0;
var PAN_EAST = 1;
var PAN_NORTH = 2;
var PAN_SOUTH = 3;

// mouse button
var LEFT_BUTTON = 0;
var RIGHT_BUTTON = 2;

// highlight color
var HIGHLIGHT_COLOR = "yellow";
// URLs
var SVG_IMAGE_URL = "GetSvgMap.aspx";

// map size limit
var MAX_MAP_WIDTH = 1200;
var MAX_MAP_HEIGHT = 1200;
var MIN_MAP_WIDTH = 100;
var MIN_MAP_HEIGHT = 100;

// map scale limit
var MAX_SCALE = 800000;
var MIN_SCALE = 10;

// action interval
var SVG_ACTION_INTERVAL = 500;	// ms

// coordinate update interval
var COORDINATE_INTERVAL = 500;	// ms

// default selected tool
var DEFAULT_TOOL = ZOOM_IN_AREA;

// overview map size
var OVERVIEW_MAP_WIDTH = 233;
var OVERVIEW_MAP_HEIGHT = 140;

// default size for main map
var DEFAULT_MAP_WIDTH = 850;
var DEFAULT_MAP_HEIGHT = 650;
var MAP_UNIT = 'ft';
var AREA_UNIT = 'acres';

var FOOT_PER_METER = 3937.0/1200.0;

var CITY_LAYER_ID = "300235";
var COAST_WATER_ID = "1013";
var COUNTY_BOUNDARY_ID = "1008";
var COUNTY_BOUNDARY_TEXT_ID = "1009";
var GPS_HORIZONTAL_ID = "2000";
var GPS_VERTICAL_ID = "2002";
var NORTH_ARROW_ID = "NorthArrow";
var BACKGROUND_LAYER_ID = "Background";
var MAP_TIP_ID = "MapTip";
var LOCATION_INDICATOR_ID = "overViewIndicator";
var SCALE_BAR_ID = "scaleBar";
var SEARCH_SHAPE_ID = "shape";
var GEO_TIFF_LAYER_ID = "GeoreferencedTiffs";
var GEO_TIFF_GROUP_NAME = "Georeferenced Tiffs";

//********************** end of constants ***********************

var g_strTipRectStyle = "stroke:black;fill:#edefc2;stroke-width:1";

// map size
var vMapWidth = DEFAULT_MAP_WIDTH;
var vMapHeight = DEFAULT_MAP_HEIGHT;

var vScale = vInitialScale;
var vCenterLong = vInitialX;
var vCenterLat  = vInitialY;

var vOverMapHeight = OVERVIEW_MAP_HEIGHT;
var vOverMapWidth = OVERVIEW_MAP_WIDTH;

var vStartLong = 0
var vEndLong = 0
var vStartLat = 0
var vEndLat = 0
var vStartMouseX = 0
var vEndMouseX = 0
var vStartMouseY = 0
var vEndMouseY = 0

var vTool = DEFAULT_TOOL;

var g_nMaxViewParcelScale = 6000 - 1;
var g_nMinViewParcelScale = 10;

var ori_x = 0;
var ori_y = 0;
var mul_x = 0;
var mul_y = 0;

var bMouseDown = false;
var bOverviewMousedown = false;

var LocationIndicator = null;
var ZoomInBox = null;

var inActiveLayer = "";	// holds inactive layers which is separated by comma ','

var g_strVisibleLayers = "";	//  Initial Visible Layer IDs which is separated by comma ','
var gLayerParams = "";
var g_bFill = true;

// for map tip
var tipRec = null;
var tipTxt = null;
var tipGrp = null;
var nTipTxtOffsetX = -0.25 * 12;
var nTipTxtOffsetY = -0.9 * 12;

var bShowToolTip = false;
var bHighlight = false;
var bUseMeter = false;
var bReloadGImage = false;

var loadingMapWin = null;	// for handle of the waiting window of the main map
var bFullyloaded = false;	// for keeping track of the main map status
var bMapLoaded = false;		// for determining which map is load first, overview or main

var SVGDocument = null;
var g_nLastCoordUpdateTime = 0;

var ImageClipOriginAry = new Array();
var ImageClipMultiplierAry = new Array();
var ImageClipSizeAry = new Array();

var pagePath;
pagePath = window.location.href.toLowerCase();
pagePath = pagePath.replace(/\?.*/, "");		// remove query string
pagePath = pagePath.substr(0, pagePath.lastIndexOf("/"));

function initPageSVG(evt)
{
	SVGDocument = GetDocumentRoot(evt);

	// initialize ori_x, ori_y, mul_x, mul_y
    GetSvgMapParameters(null); 

	if (g_strHiliteParcelID != null)
		HiliteParcel(SVGDocument);

	AddScaleBar(SVGDocument);	

/* hw100121 the ghost draw of additional triangle.
	if (strDrawGeodetic == 1) {
		var x = (strGeodeticX-ori_x)*mul_x;
		var y = (strGeodeticY-ori_y)*mul_y;  
		if(x>0 && y>0 && x<vMapWidth && y<vMapHeight)
		{
			var star = null;
			if (g_strGeodeticIsVertical == "horizontal")
			{
				if (g_strVisibleLayers.match(GPS_HORIZONTAL_ID+","))
				{
					star = _newuse(SVGDocument,"#gpshp",x,y,0,"0.1");
					star.setAttribute("style", "fill:none;stroke:green;stroke-width:30px");
				}
			}
			else
			{
				if (g_strVisibleLayers.match(GPS_VERTICAL_ID+","))
				{
					star = _newuse(SVGDocument,"#gpsvp",x,y,0,"0.1");
					star.setAttribute("style", "fill:none;stroke:blue;stroke-width:30px");
				}
			}
			if (star)
				SVGDocument.getDocumentElement().appendChild(star);    
		}
		strDrawGeodetic = 0;
	}
*/	
	//Get NorthArrow layer and adjust position	
	var NorthArrow = SVGDocument.getElementById(NORTH_ARROW_ID);	
	if(NorthArrow != null)
	{
		var translate = "translate(" + (vMapWidth - 70) + ",10)" ;
		NorthArrow.setAttribute("transform",  translate);
	}	

	bOverviewMousedown = false;
	bMouseDown = false;

	AddEventListeners();

	// prepare shape
	prepareShape(SVGDocument);

	if (LocationIndicator != null)
	{		    
		LocationIndicator.getStyle().setProperty("display", "none");
		// reset the transform for the overview map
		LocationIndicator.setAttribute("transform", "translate(0,0)");
		drawAreaRec();
		LocationIndicator.getStyle().setProperty("display", "inline");
	}

	//For map tip 
	tipRec = SVGDocument.createElement("rect"); 
	tipRec.setAttribute("y", nTipTxtOffsetY);
	tipRec.setAttribute("x", nTipTxtOffsetX);
	tipRec.setAttribute("width", "1");
	tipRec.setAttribute("height", 1.25*12);
	tipRec.setAttribute("style", g_strTipRectStyle); 
	tipTxt = SVGDocument.createElement("text")
	tipTxt.setAttribute("style", "font-family:Arial; font-size:" + 12 + ";fill:black;"); 
	tipGrp = SVGDocument.createElement("g"),
	tipGrp.setAttribute("id", MAP_TIP_ID);
	tipGrp.setAttribute("transform", "translate(0,0)");
	tipGrp.setAttribute("visibility", "hidden");
	tipGrp.appendChild(tipRec);
	tipGrp.appendChild(tipTxt);
	SVGDocument.getDocumentElement().appendChild(tipGrp); 
	// end for map tip

	bMapLoaded = true;
	
	closeWaitWin();
}

function UpdateScaleValue(svgRoot, strText)
{
	var scaleText = svgRoot.getElementById("scaleText");
	if (scaleText == null) {
		alert("Please add scaleText Layer");
		return 0;
	}
	
	if (scaleText.getFirstChild() == null)
	{
		var textNode = svgRoot.createTextNode(strText)
		scaleText.appendChild(textNode);
	}
	else
		scaleText.getFirstChild().setNodeValue(strText);

	return scaleText.getComputedTextLength();
}

function AddScaleBar(svgRoot)
{
	var nLen = 0;
	var scale = 100.0 / mul_x;
	if (bUseMeter) {
		if (scale < 1000.0) {
			if (scale > 100)
				scale = Math.round(scale);
			else
				scale = Math.round(scale * 100) / 100.0;	// keep 2 decimal digits
			nLen = UpdateScaleValue(svgRoot, scale + " m");
		}	
		else {
			scale /= 1000.0;
			if (scale > 100)
				scale = Math.round(scale);
			else
				scale = Math.round(scale * 100) / 100.0;	// keep 2 decimal digits
			nLen = UpdateScaleValue(svgRoot, scale + " km");
		}
	}
	else {
		scale *= FOOT_PER_METER;
		if (scale < 5279.79) {
			if (scale > 100)
				scale = Math.round(scale);
			else
				scale = Math.round(scale * 100) / 100.0;	// keep 2 decimal digits
			nLen = UpdateScaleValue(svgRoot, scale + " ft");
		}	
		else {
			scale /= 5279.79;
			if (scale > 100)
				scale = Math.round(scale);
			else
				scale = Math.round(scale * 100) / 100.0;	// keep 2 decimal digits
			nLen = UpdateScaleValue(svgRoot, scale + " mile");
		}
	}

	var x = svgRoot.getDocumentElement().getAttribute("width") * 1.0 - 120 - nLen;
	var y = svgRoot.getDocumentElement().getAttribute("height") * 1.0 - 25;

	svgRoot.getElementById("scaleText").getParentNode().setAttribute("transform", "translate(" + x + "," + y + ")");
}

//Mouse down event
ELdown = function MouseDown(evt)
{
	if (evt.button != LEFT_BUTTON)	// only response to left mouse button
	{
		// disable right click on map
		if (evt.button == RIGHT_BUTTON)
			evt.preventDefault();
		return false;
	}

    if(!bFullyloaded)
		return;
		
    var tagValue = evt.getTarget();
    if(tagValue == null)
		return false;
    
    var idName = tagValue.getParentNode().getAttribute('id')	
	if(idName == null)
       return;
    
	if (idName == NORTH_ARROW_ID)
		return;

    vStartMouseX = evt.getClientX()    
    vStartMouseY = evt.getClientY()
    vEndMouseX = vStartMouseX;
    vEndMouseY = vStartMouseY;
    
    vStartLong = ori_x + (vStartMouseX*1.0/mul_x);
    vStartLat = ori_y + (vStartMouseY*1.0/mul_y);
    vEndLong = vStartLong;
    vEndLat = vStartLat;  
    
    if (g_bPlaceShape)
    {
		// hide old shape
		if (g_strGeometryType == "rectangle")
		{
			CircleShape.getStyle().setProperty("display", "none");
			PolygonShape.getStyle().setProperty("display", "none");
			closeShapeCircle.getStyle().setProperty("display", "none");
		}
		else if (g_strGeometryType == "circle")
		{
			RectangleShape.getStyle().setProperty("display", "none");
			PolygonShape.getStyle().setProperty("display", "none");
			closeShapeCircle.getStyle().setProperty("display", "none");
		}
		else if (g_strGeometryType == "polygon")
		{
			RectangleShape.getStyle().setProperty("display", "none");
			CircleShape.getStyle().setProperty("display", "none");
		}
	}

    bMouseDown = true;        	    
}

ELup = function MouseUp(evt,flag)
{
	if (evt.button != LEFT_BUTTON)	// only response to left mouse button
		return false;
	
	var tagValue = evt.getTarget();
	if (tagValue.getParentNode().getAttribute('id') != null)
	{
		if (tagValue.getParentNode().getAttribute('id') == NORTH_ARROW_ID)
		{       
			var arrowId = tagValue.getAttribute('id');
			if (arrowId == 'north')
				ArrowPanTo(PAN_NORTH);
			else if (arrowId == 'south')
				ArrowPanTo(PAN_SOUTH);
			else if (arrowId == 'west')
				ArrowPanTo(PAN_WEST);
			else if (arrowId == 'east')
				ArrowPanTo(PAN_EAST);

			bMouseDown = false;
			return;
		}
	}

	if (!bMouseDown) return false;
	
	bMouseDown = false;

	if(!bFullyloaded)
		return;   	

	if (evt.detail > 1)		// double click, end measuring
	{
		// remove the last point
		switch (vTool)
		{
			case MEASURE_DISTANCE:
			case MEASURE_AREA:
				RemoveLastMeaPoint();
				RestartMeasuring();
				break;
		
			default:
				break;
		}

		return;
	}
	
	if(tagValue.getParentNode().getAttribute('id') == null)
       return;
    
    var MouseX = evt.getClientX();
    var MouseY = evt.getClientY();

    var bClick = false;
    if (Math.abs(MouseX - vStartMouseX) < 5 && Math.abs(MouseY - vStartMouseY) < 5)
		bClick = true;

    vEndLong = ori_x + (evt.getClientX()*1.0/mul_x);
    vEndLat = ori_y + (evt.getClientY()*1.0/mul_y);
    
    if (g_bPlaceShape)
    {
		// stop measuring
		RestartMeasuring();
		
		
		if (!bUseMeter)	//pfsun
		{
			vStartLong = vStartLong * FOOT_PER_METER; 
			vStartLat = vStartLat * FOOT_PER_METER;
			vEndLong = vEndLong * FOOT_PER_METER;
			vEndLat = vEndLat * FOOT_PER_METER;
		}
		
		
		if(g_strGeometryType == 'rectangle')
		{			
			pickedPoint = new Array();
			pickedPointNum = 0;				
				
			pickedPoint[pickedPointNum] = new PointCoor(vStartLong,vStartLat );
			pickedPointNum++;
			
			pickedPoint[pickedPointNum] = new PointCoor(vEndLong ,vStartLat);
			pickedPointNum++;
			
			pickedPoint[pickedPointNum] = new PointCoor(vEndLong,vEndLat);
			pickedPointNum++;
			
			pickedPoint[pickedPointNum] = new PointCoor(vStartLong,vEndLat);
			pickedPointNum++;
			
			pickedPoint[pickedPointNum] = new PointCoor(vStartLong,vStartLat);
			pickedPointNum++;
			
			g_bPlaceShape = false;
		}
		else if(g_strGeometryType == 'circle')
		{
			pickedPoint = new Array();
			pickedPointNum = 0;				
			pickedPoint[pickedPointNum] = new PointCoor(vStartLong,vStartLat);
			pickedPointNum++;
			
			g_bPlaceShape = false;
		}
		else if(g_strGeometryType == 'polygon')		
		{
			if(bPolygonShapeBegin == true)
			{
				var num = pickedPoint.length;				
				pickedPoint = new Array();
				pickedPointNum = 0;				
				
				pickedPoint[pickedPointNum] = new PointCoor(vEndLong,vEndLat);
				pickedPointNum++;
				
				PolygonShapeSX = MouseX;
				PolygonShapeSY = MouseY;				
				PolygonShape.setAttribute( 'd', 'M ' + MouseX + ' ' + MouseY + ' L ' + MouseX + ' ' + MouseY );
				PolygonShape.getStyle().setProperty("fill","none")						
				
				//Draw the starting point as a circle									
				closeShapeCircle.setAttribute("cx", MouseX);
				closeShapeCircle.setAttribute("cy", MouseY);
								
				bPolygonShapeBegin = false;
				PolygonShape.getStyle().setProperty("display",   "inline");
				closeShapeCircle.getStyle().setProperty("display",   "inline");										
			}
			else
			{
				// maximum points reached, close the shape and show message
				if (pickedPointNum >= g_nMaxPoints)
				{
					MouseX = PolygonShapeSX;
					MouseY = PolygonShapeSY;
					
					alert("Maximum number of points reached.\n\nShape is closed automatically.");
				}
				
				if (closeToEnd(MouseX,MouseY,PolygonShapeSX,PolygonShapeSY))
				{
					MouseX = PolygonShapeSX;
					MouseY = PolygonShapeSY;
					PolygonShape.getStyle().setProperty("fill","red");
					PolygonShape.getStyle().setProperty("display","inline");				
					closeShapeCircle.getStyle().setProperty("display","none");
					pickedPoint[pickedPointNum] = new PointCoor(pickedPoint[0].x,pickedPoint[0].y);						
			
					g_bPlaceShape = false;
				}
				else
				{						
					pickedPoint[pickedPointNum] = new PointCoor(vEndLong,vEndLat);
				}
					
				PolygonShape.setAttribute( 'd', PolygonShape.getAttribute('d') + " " + MouseX + " " + MouseY );				
				pickedPointNum++;
			}
		}
		return;
    }
    
    switch (vTool)
    {
		case PAN:		//Pan
			// reset view box
			SVGDocument.getElementsByTagName("svg").item(0).setAttribute("viewBox", "");

			Pan(bClick);
			break;
		
		case ZOOM_IN_AREA:	//Zoom in area		    
			ZoomInBox.getStyle().setProperty("display",   "none");		
			ZoomInArea(evt,true);			
			break;
			
		case ZOOM_OUT_AREA:	//Zoom in area
		    ZoomInBox.getStyle().setProperty("display",   "none");
			ZoomInArea(evt,false);			
			break;		

		case ATTRIBUTE:
			ShowAttributes(evt);
			break;

		case GET_COORDINATE:
			top.SelectMenu(MENU_MEASURE);		// measuring tool panel
			ShowCoordinate(vEndLong, vEndLat);
			break;
	
		case MEASURE_DISTANCE:		// measure distance
			top.SelectMenu(MENU_MEASURE);		// measuring tool panel
			AddMeaDisPoint(MouseX, MouseY, vEndLong, vEndLat);
			break;
	
		case MEASURE_AREA:		// measure area
			top.SelectMenu(MENU_MEASURE);		// measuring tool panel
			AddMeaAreaPoint(MouseX, MouseY, vEndLong, vEndLat);
			break;
	
		default:
		   return true;
	}	
}

OverviewELdown = function OverviewMouseDown(evt)
{	
	if (evt.button != LEFT_BUTTON)	// only response to left mouse button
	{
		// disable right click on map
		if (evt.button == RIGHT_BUTTON)
			evt.preventDefault();
		return false;
	}

	if (!bFullyloaded)
		return false;

	var target = evt.getTarget();
	if (!target)
		return;
		
	var idName = null;
	while (target && target.nodeName != "#document")
	{
		idName = target.getAttribute('id');
		
		if(idName && idName == LOCATION_INDICATOR_ID)
		{
			vStartMouseX = evt.getClientX();
			vStartMouseY = evt.getClientY();		
			bOverviewMousedown = true;
			break;
		}

		target = target.getParentNode();
	}
}

function createTooltip(svgDoc)
{
	var tooltip = null;
	var textSize = 12;
	
	var str = svgDoc.createTextNode("Location Map");

	var txt = svgDoc.createElement("text")
	txt.setAttribute("style", "font-family:Arial; font-size:" + textSize + ";fill:black;");
	txt.appendChild(str);

	var rec = svgDoc.createElement("rect");
	rec.setAttribute("y", -0.9*textSize);
	rec.setAttribute("x", -0.25*textSize);
	rec.setAttribute("width", txt.getComputedTextLength() + 0.5 * textSize);
	rec.setAttribute("height", 1.25 * textSize);
	rec.setAttribute("style", g_strTipRectStyle);

	var tooltip = svgDoc.createElement("g");
	tooltip.setAttribute("id", "tooltip");
	tooltip.setAttribute("visibility", "hidden");
	tooltip.appendChild(rec);
	tooltip.appendChild(txt);

	svgDoc.getDocumentElement().appendChild(tooltip);
	
	return tooltip;
}

OverviewELover = function OverviewMouseOver(evt)
{
	var svgDoc = GetDocumentRoot(evt);
	var tooltip = svgDoc.getElementById("tooltip");
	if (!tooltip)
		tooltip = createTooltip(svgDoc);
	
	if (tooltip)
	{
		var nRecWidth = 1.0 * tooltip.firstChild.getAttribute("width");
		var nRecHeight = 1.0 * tooltip.firstChild.getAttribute("height");
		var x = evt.getClientX() + 5 - 1.0 * tooltip.firstChild.getAttribute("x");
		var y = evt.getClientY() - 5 - nRecHeight - 1.0 * tooltip.firstChild.getAttribute("y");

		if (x + nRecWidth > vOverMapWidth)
			x = x - 2*5 - nRecWidth;

		if (y < -1.0 * tooltip.firstChild.getAttribute("y"))
			y = y + 2*5 + nRecHeight;

		tooltip.setAttribute("transform", "translate(" + x + "," + y + ")");

		tooltip.setAttribute("visibility", "visible");
	}
}

OverviewELout = function OverviewMouseOut(evt)
{
	var svgDoc = GetDocumentRoot(evt);
	var tooltip = svgDoc.getElementById("tooltip");
	if (!tooltip)
		tooltip = createTooltip(svgDoc);
	
	if (tooltip)
		tooltip.setAttribute("visibility", "hidden");
}

OverviewELmove = function OverviewMouseMove(evt)
{    
    if(bOverviewMousedown)
    {
		var idName = evt.getTarget().getAttribute('id')	
		
		vEndMouseX = evt.getClientX();
		vEndMouseY = evt.getClientY();
		var offsetX = vEndMouseX - vStartMouseX;
		var offsetY = vEndMouseY - vStartMouseY;
		
		LocationIndicator.setAttribute("transform", "translate(" + offsetX + ", " + offsetY +")");
    }
}

OverviewELup = function OverviewMouseUp(evt)
{
	if (evt.button != LEFT_BUTTON)
		return;

	if (!bFullyloaded)
		return false;

    if(!bOverviewMousedown)    return;  	

	bOverviewMousedown = false;

	if(evt.getTarget().getParentNode().getAttribute('id') == null)
       return;     
    	
	var oSVGRoot = GetDocumentRoot(evt);   
    
	// get ori_x, ori_y, mul_x, mul_y of overview map
    GetSvgMapParameters(evt);
    
	vEndMouseX = evt.getClientX();
	vEndMouseY = evt.getClientY();	

    var offsetX = vEndMouseX*1.0 - vStartMouseX*1.0;
	var offsetY = vEndMouseY*1.0 - vStartMouseY*1.0;

    vOffsetLong = offsetX*1.0/mul_x;
    vOffsetLat = offsetY*1.0/mul_y; 
    
	// reset ori_x, ori_y, mul_x, mul_y of main map
    GetSvgMapParameters(null)
    
	vCenterLong += vOffsetLong;
	vCenterLat += vOffsetLat;
	
	var vSVGImage = getSvgURL(SVG_IMAGE_URL, SVG_TEMPLATE, vMapWidth, vMapHeight, vCenterLong, vCenterLat, vScale, g_strVisibleLayers);
    
	RefreshSVG(parent.MainMapFrame.MapImageID, vSVGImage);
}

ELmove = function MouseMove(evt,flag)
{
	if(!bFullyloaded)
		return;

	var tagValue = evt.getTarget();
    if(tagValue == null)
		return false;
    
    // this block of code is for updating the XY frame
    UpdateCoordinate(evt);
	// **************************************************

	if(bMouseDown)
	{
		vEndMouseX = evt.getClientX()
		vEndMouseY = evt.getClientY()
	    
		x = ori_x + (vEndMouseX*1.0/mul_x);
		y = ori_y + (vEndMouseY*1.0/mul_y);	
    
	    if (g_bPlaceShape)
	    {
			if (g_strGeometryType == "rectangle")
			{
				RectangleShape.getStyle().setProperty("display",   "inline");		
				with (Math)
				{
					RectangleShape.setAttribute("x", min(vStartMouseX, vEndMouseX));
					RectangleShape.setAttribute("y", min(vStartMouseY, vEndMouseY));
					RectangleShape.setAttribute("width", abs(vStartMouseX - vEndMouseX));
					RectangleShape.setAttribute("height", abs(vStartMouseY - vEndMouseY));
				}
			}
			else if (g_strGeometryType == "circle")
			{
				CircleShape.getStyle().setProperty("display",   "inline");		
				with (Math)
				{
					CircleShape.setAttribute("cx", vStartMouseX);
					CircleShape.setAttribute("cy", vStartMouseY);
					CircleShapeRadius = sqrt((vStartMouseX - vEndMouseX)*(vStartMouseX - vEndMouseX)+(vStartMouseY - vEndMouseY)*(vStartMouseY - vEndMouseY));
					CircleShapeRadius = round(CircleShapeRadius)
					CircleShape.setAttribute("r", CircleShapeRadius);
					CircleRadius = CircleShapeRadius/mul_x;
				}
			}	
			return;
	    }
	    
	    switch (vTool)
	    {
		    case ZOOM_IN_AREA:
		    case ZOOM_OUT_AREA:
				with (Math)
				{
					ZoomInBox.setAttribute("x", min(vStartMouseX, vEndMouseX));
					ZoomInBox.setAttribute("y", min(vStartMouseY, vEndMouseY));
					ZoomInBox.setAttribute("width", abs(vStartMouseX - vEndMouseX));
					ZoomInBox.setAttribute("height", abs(vStartMouseY - vEndMouseY));						
				}
				ZoomInBox.getStyle().setProperty("display",   "inline");
				break;
			
			case PAN:
				// mouse pointer is out of the viewer area, treat it as mouse up
				if (vEndMouseX <= 0 || vEndMouseX >= vMapWidth || vEndMouseY <= 0 || vEndMouseY >= vMapHeight)
				{
					bMouseDown = false;
					// reset view box
					SVGDocument.getElementsByTagName("svg").item(0).setAttribute("viewBox", "");
					
					// update vEndLong and vEndLat
					vEndLong = ori_x + (evt.getClientX()*1.0/mul_x);
					vEndLat = ori_y + (evt.getClientY()*1.0/mul_y);
					
					Pan(false);
				}
				else
				{
					var vbX = vStartMouseX - vEndMouseX;
					var vbY = vStartMouseY - vEndMouseY;
					SVGDocument.getElementsByTagName("svg").item(0).setAttribute("viewBox", vbX + " " + vbY + " " + vMapWidth + " " + vMapHeight);
				}
				break;
			
			default:
				break;
		}
	}		
}

function FindLayerElement(target)
{
	var retTarget = target;
	while (retTarget && retTarget.nodeName != "g" && retTarget.nodeName != "#document")
	{
		retTarget = retTarget.getParentNode();
	}
	return retTarget;
}

ELout = function MouseOut(evt,flag)
{
	if(!bFullyloaded)
		return;

	if (tipGrp)
		tipGrp.setAttribute("visibility", "hidden");

	var target = evt.getTarget();
	if (target == null)
		return;

    var idName = null;
	if (target.nodeName == "text" || target.nodeName == "textPath")		// annotation layer
	{
		var layer = FindLayerElement(target);
		idName = layer.getAttribute("id");
	}
	else		
		idName = target.getParentNode().getAttribute('id')
    
	if (idName == NORTH_ARROW_ID)
    {       	
       	target.getStyle().setProperty("opacity", 0.5);
       	return;    
    }

	if(bHighlight)
	{    
		// ignore background & city boundary & Coast Water Lines & map tip group
		if (idName == BACKGROUND_LAYER_ID || idName == CITY_LAYER_ID || idName == COAST_WATER_ID || idName == MAP_TIP_ID || idName == COUNTY_BOUNDARY_TEXT_ID || idName == SCALE_BAR_ID || idName == SEARCH_SHAPE_ID)
			 return false;
			 
		if(inActiveLayer != null)
		{
			if(inActiveLayer.match(idName + ","))
			   return false;
		}
			
		var oldStyle = target.getAttribute("OrigStyle");
		if (oldStyle != null)
			target.setAttribute("style", oldStyle);		
	}	
}

ELover = function MouseOver(evt,flag)
{   
	if(!bFullyloaded)
		return;
		
	var target = evt.getTarget();
	if (target == null)
		return;
	
    var idName = null;
	if (target.nodeName == "text" || target.nodeName == "textPath")		// annotation layer
	{
		var layer = FindLayerElement(target);
		idName = layer.getAttribute("id");
	}
	else		
		idName = target.getParentNode().getAttribute('id')
    
	if (bShowToolTip || idName == NORTH_ARROW_ID)
	{
		if (idName != BACKGROUND_LAYER_ID)
		{
			// remove old map tip
			while (tipTxt.hasChildNodes())
				tipTxt.removeChild(tipTxt.getLastChild());
			tipGrp.setAttribute("visibility", "hidden");

			//For map tip
			var tip = null;
			var tmpTarget = target;
			while (!tip && tmpTarget && tmpTarget.nodeName != "#document")
			{
				tip = tmpTarget.getAttribute('tip');
				tmpTarget = tmpTarget.getParentNode();
			}
			
			if (tip && tip.length > 0)
			{
				if (!tip.match(/^\s*$/) && !tip.match(/\*/))
				{
					// window.svgTitle.element = evt.getCurrentTarget();
					var nameAry = tip.split(";");
					var strLen = 0 ;
					var nLines = 0;
					for(var i=0 ; i< nameAry.length; i++)
					{
						var strMapTip = nameAry[i].replace(/^\s*(\S+.*\S+)\s*$/, "$1");
						if (strMapTip == "")
							continue;

						var tspan = SVGDocument.createElement('tspan'); 
						if (nLines > 0)
						{
							tspan.setAttribute('x', '0');
							tspan.setAttribute('dy', '1em');
						}
						else
							tspan.setAttribute('y', '3');
						tspan.appendChild(SVGDocument.createTextNode(strMapTip));
						tipTxt.appendChild(tspan);
						var len = tspan.getComputedTextLength();
						if(len > strLen)
						{
							strLen = len;
						}
						
						nLines++
					} 

					if (nLines > 0)
					{
						var nRecWidth = strLen + 0.5*12;
						var nRecHeight = 12*nLines + 0.5*12;
						tipRec.setAttribute("width", nRecWidth);
						tipRec.setAttribute("height", nRecHeight);

						var x = evt.getClientX() + 5 - nTipTxtOffsetX;
						var y = evt.getClientY() - 5 - nRecHeight - nTipTxtOffsetY;

						if (x + nRecWidth > vMapWidth)
							x = x - 2*5 - nRecWidth;

						if (y < -1 * nTipTxtOffsetY)
							y = y + 2*5 + nRecHeight;

						tipRec.setAttribute("style", g_strTipRectStyle);
						tipRec.getStyle().setProperty("display", "inline");
						tipGrp.setAttribute("transform", "translate(" + x + "," + y + ")");
						tipGrp.setAttribute("visibility", "visible");
					}
					//For map tip 
				}
			}
		}
	}

    if (idName == NORTH_ARROW_ID)
    {
       	target.getStyle().setProperty("opacity", 1);
       	return;
    } 

	if(bHighlight)
	{	
		// ignore background & city boundary & Coast Water Lines & map tip group, etc
		if (idName == BACKGROUND_LAYER_ID || idName == CITY_LAYER_ID || idName == COAST_WATER_ID || idName == MAP_TIP_ID || idName == COUNTY_BOUNDARY_TEXT_ID || idName == SCALE_BAR_ID || idName == SEARCH_SHAPE_ID)
			 return false;
			 
		if(inActiveLayer != null)
		{
			if(inActiveLayer.match(idName + ","))
			   return false;
		}
		
		var style = target.getAttribute("style");
		if(style == null)
			return false;

		if (target.getAttribute("OrigStyle") == null)	// set the attribute only at the first time
			target.setAttribute("OrigStyle", style);
		
		target.getStyle().setProperty("stroke", HIGHLIGHT_COLOR);		

		if(target.getParentNode() && target.getParentNode().getStyle().getPropertyValue("fill") != "none")
			target.getStyle().setProperty("fill", HIGHLIGHT_COLOR);
	}			
}

function GetSvgMapParameters(evt)
{
   var root;

    if(evt == null)
		root = parent.MainMapFrame.MapImageID.getSVGDocument();
	else
	    root = evt.getTarget().getOwnerDocument();

	var originAry = GetOrigin(root);
	ori_x = originAry[0];
	ori_y = originAry[1];
	
	var multiplierAry = GetMultiplier(root);
	mul_x = multiplierAry[0];
	mul_y = multiplierAry[1];
}

function drawAreaRec()
{
	var DocRoot = null;
	var svgViewer = top.LocationMapFrame.document.OverviewMap;

	if (!svgViewer)
		return;

	DocRoot = svgViewer.getSVGDocument();

    if(DocRoot == null) 
      return false

    EleOrigin = DocRoot.getElementsByTagName("origin").item(0);
    if(EleOrigin == null)
		return false;    

	var x = ori_x + (vMapWidth*1.0/mul_x);
    var y = ori_y + (vMapHeight*1.0/mul_y);

    var omp_ori_x = 1.0 * EleOrigin.getAttribute("x");
    var omp_ori_y = 1.0 * EleOrigin.getAttribute("y");

    EleMul = DocRoot.getElementsByTagName("scale").item(0);
    if(EleMul == null)
		return false;

    var omp_mul_x = 1.0 / EleMul.getAttribute("x");
    var omp_mul_y = 1.0 / EleMul.getAttribute("y");

    var x0 = (ori_x-omp_ori_x)*omp_mul_x
    var x1 = (x-omp_ori_x)*omp_mul_x

    var y0 = (ori_y-omp_ori_y)*omp_mul_y
    var y1 = (y-omp_ori_y)*omp_mul_y

    var x2 = x0-x1;
    if(x2<0)
       x2 = 0-x2;

	var par;
    if(x2>6)
		par = x0 + ',' + y0 + ',' + x0 + ',' +  y1 + ',' +  x1 + ',' + y1 + ',' + x1 + ',' + y0 + ',' + x0 +','+y0    
	else
	{
	    x0 = (x0 + x1)/2
	    y0 = (y0 + y1)/2
	    yTop = y0+5;
	    yBottom = y0-5;
	    xTop = x0+5;
	    xBottom = x0-5;

		par = xBottom + ',' + y0 + ',' + x0 + ',' +  y0 + ',' +  x0 + ',' + yBottom + ',' + x0 + ',' + y0 + ',' + x0 +','+yTop + ',' + x0 + ',' + y0 +','+ xTop +','+y0;
	}

	if(LocationIndicator != null)
	{
	    var LocationIndicatorStyle = LocationIndicator.getStyle();

		LocationIndicator.setAttribute("points", par);
		LocationIndicatorStyle.setProperty("display", "inline");
		if(x2>6)
		{
			LocationIndicatorStyle.setProperty("stroke-width", 1);
			LocationIndicatorStyle.setProperty("opacity", 0.4);
		}
		else
		{
			LocationIndicatorStyle.setProperty("stroke-width", 3);
			LocationIndicatorStyle.setProperty("opacity", 1);
		}
	}
}

function SetTool(vToolNum)
{
	// clear measuring shapes
	ClearMeasuringShapes();
	RestartMeasuring();
	
	// clear searching shapes
	DeleteShape();
	
	vTool = vToolNum
}

function Zoom(bZoomin)
{
	if (bZoomin && vScale <= MIN_SCALE)
	{
		alert("Minimum scale reached.");
		return;
	}
	else if (!bZoomin && vScale >= MAX_SCALE)
	{
		alert("Maximum scale reached.");
		return;
	}

    if(bZoomin)
		vScale = vScale / 2;		
	else
		vScale = vScale * 2;		
		
	if(vScale<MIN_SCALE)
		vScale = MIN_SCALE;
		
	if(vScale > MAX_SCALE)
	   vScale =  MAX_SCALE;

	vCenterLong = vEndLong;
	vCenterLat = vEndLat;

	var vSVGImage = getSvgURL(SVG_IMAGE_URL, SVG_TEMPLATE, vMapWidth, vMapHeight, vCenterLong, vCenterLat, vScale, g_strVisibleLayers);
	
	RefreshSVG(top.MainMapFrame.MapImageID, vSVGImage);
}

function Pan(bClick)
{
	if (bClick)
	{
		vCenterLong = vEndLong;
		vCenterLat = vEndLat;
	}
	else
	{
		vCenterLong -= vEndLong - vStartLong;
		vCenterLat -= vEndLat - vStartLat;
	}

	var vSVGImage = getSvgURL(SVG_IMAGE_URL, SVG_TEMPLATE, vMapWidth, vMapHeight, vCenterLong, vCenterLat, vScale, g_strVisibleLayers);

	RefreshSVG(top.MainMapFrame.MapImageID, vSVGImage);
}

function ShowAttributes(evt)
{
	if (!bFullyloaded)
		return false;

	if (evt.button != LEFT_BUTTON)	// only response to left mouse button
		return false;

	var target = evt.getTarget();
	if (target == null)
		return false;						
	
	var strFEntNum = target.getParentNode().getAttribute('id');
	var strFMslink = target.getAttribute('id');

	if (strFEntNum == "13030" 
	  || strFEntNum == "13031"
	  || strFEntNum == "13032"
	  || strFEntNum == "13033"
	  || strFEntNum == "13034"
	  || strFEntNum == "13035"
	  || strFEntNum == "13036"
	  || strFEntNum == "13037"
	  || strFEntNum == "13038"
	  || strFEntNum == "13039"
	  || strFEntNum == "13040"
	  || strFEntNum == "13041"
	  || strFEntNum == "13042"
	  || strFEntNum == "13043"
	  || strFEntNum == "13044"
	  || strFEntNum == "13045"
	  || strFEntNum == "13046"
	  || strFEntNum == "13047"
	  || strFEntNum == "13029" || strFEntNum == "59002" || strFEntNum == "59003"  || strFEntNum == "59004"
	  || strFEntNum == "59005" || strFEntNum == "59006"  || strFEntNum == "59010"  || strFEntNum == "59011"  || strFEntNum == "59012" 
	  || strFEntNum == "59013"  || strFEntNum == "59014"  || strFEntNum == "104025"  || strFEntNum == "104026"  || strFEntNum == "104027" 
	  || strFEntNum == "104028"  ||strFEntNum == "104029"  || strFEntNum == "104030"  ||strFEntNum == "2000"
	  || strFEntNum == "2001" || strFEntNum == "2002"  || strFEntNum == "2003"  || strFEntNum == "300221"  || strFEntNum == "300222"
	  || strFEntNum == "10000236" || strFEntNum == "10000237")
	{
		var winURL = "ShowAttribute.aspx?fentnum=" + strFEntNum + "&fmslink=" + strFMslink;
		var win = window.open(winURL,"Attribute",'height=600,width=500 scrollbars=1 resizable=1');
		win.focus();
		AddWindow(win);
	}
}

// 090827 the caller was blocked, so this function no longer to be used
/*
function DetailedCondoInfo(MSLINK, strToProperty, objHideCondoReport)
{
	var winURL = "ShowAttribute.aspx?fentnum=condo&mslink=" + MSLINK + "&fmslink=" + strToProperty;
	if (objHideCondoReport)
		winURL += "&hideCondoReport=1";
	var win = window.open(winURL,"Attribute",'height=600,width=500 scrollbars=1 resizable=1');
	win.focus();
	AddWindow(win);
}
*/

function ZoomInArea(evt, bZoomIn) //Zoom out when bZoomIn = false
{
	var tmpX = vStartMouseX-vEndMouseX;
	if(tmpX<0)
		tmpX = 0- tmpX
		
	tmpY = vStartMouseY-vEndMouseY;
	if(tmpY<0)
	tmpY= 0- tmpY	
	
	if(tmpX < 5 && tmpY < 5)
	{
		Zoom(bZoomIn);	
		return;
	}

	var oSVGRoot = GetDocumentRoot(evt);
          
	if(bZoomIn)    
    {
		scale = vScale*(tmpX+tmpY)/(vMapHeight+vMapWidth);
		vCenterLong = ori_x + ((vStartMouseX+vEndMouseX)*0.5/mul_x);	
		vCenterLat = ori_y + ((vStartMouseY+vEndMouseY)*0.5/mul_y); 
	}
	else
	{
	    scale = vScale*(vMapHeight+vMapWidth)/(tmpX+tmpY);	    
	}
	
	if(scale <= MIN_SCALE) 
	{
	   scale = MIN_SCALE;
	   alert("Minimum scale reached.");
	}
	else if(scale >= MAX_SCALE)
	{
		scale = MAX_SCALE;
		alert("Maximum scale reached.");
	}		
		
	if(!bZoomIn)
	{
		var cx = ori_x + vMapWidth*0.5/mul_x ;
		var cy = ori_y + vMapHeight*0.5/mul_y ;
		
		var new_mul_x = mul_x * vScale/scale;
		var new_mul_y = mul_y * vScale/scale;
		vCenterLong = cx + (vMapWidth-vStartMouseX-vEndMouseX)*0.5 / new_mul_x ;
		vCenterLat = cy + (vMapHeight-vStartMouseY-vEndMouseY)*0.5 / new_mul_y ;  
	}
	
	vScale = scale;				

	var vSVGImage = getSvgURL(SVG_IMAGE_URL, SVG_TEMPLATE, vMapWidth, vMapHeight, vCenterLong, vCenterLat, vScale, g_strVisibleLayers);

	RefreshSVG(top.MainMapFrame.MapImageID, vSVGImage);
}

function GetDocumentRoot(oEvt)
{
	return oEvt.getTarget().getOwnerDocument();
}

function GetDocumentScale(oSVGRoot)
{
	var oMapSpec = oSVGRoot.getElementsByTagName("imageSpec").item(0);
	return oMapSpec.getAttribute("Scale");
}

function AddEventListeners()
{   
	var oElement = SVGDocument.getElementsByTagName("svg").item(0);
	if(oElement == null) return;
	var bUseCapture = false;
	
	//Mouse up
	oElement.addEventListener("mouseup",ELup,bUseCapture);

	//Mouse move
	oElement.addEventListener("mousemove",ELmove,bUseCapture);

	//Mouse down
	oElement.addEventListener("mousedown",ELdown,bUseCapture);

	//Mouse over	
	oElement.addEventListener("mouseover",ELover,bUseCapture);	
	
	//Mouse out	
	oElement.addEventListener("mouseout",ELout,bUseCapture);			  
}

function AddOverviewEventListeners(oElement, bUseCapture)
{   	
	//Mouse up
	oElement.addEventListener("mouseup",OverviewELup,bUseCapture);

	//Mouse move
	oElement.addEventListener("mousemove",OverviewELmove,bUseCapture);

	//Mouse down
	oElement.addEventListener("mousedown",OverviewELdown,bUseCapture);

	//Mouse over
	oElement.addEventListener("mouseover",OverviewELover,bUseCapture);

	//Mouse out
	oElement.addEventListener("mouseout",OverviewELout,bUseCapture);
}
/*
function Addg_strVisibleLayers(layerName, bVisible)
{
	layerName = layerName.replace("___", ".");

	if (bVisible)	// remove invisible layer
	{
		if(g_strVisibleLayers == null || g_strVisibleLayers == "")	// empty
			return;
	
		g_strVisibleLayers = g_strVisibleLayers.replace(layerName + ",", '');	
	}
	else	// add invisible layer
	{
		if(g_strVisibleLayers == null || g_strVisibleLayers == "")	// empty
			g_strVisibleLayers = layerName + ',';
		else if(!g_strVisibleLayers.match(layerName + ","))	// not existing
			g_strVisibleLayers = g_strVisibleLayers + layerName + ',';
	}
}

function AddInactiveLayer(layerName)
{
	layerName = layerName.replace("___", ".");

	if(inActiveLayer == null || inActiveLayer == "")	// empty
		inActiveLayer = layerName + ',';
	else if(!inActiveLayer.match(layerName + ","))	// not existing
		inActiveLayer = inActiveLayer + layerName + ',';
}

function RemoveInactiveLayer(layerName)
{
	layerName = layerName.replace("___", ".");

	if(inActiveLayer == null || inActiveLayer == "")	// empty
		return;
	
	inActiveLayer = inActiveLayer.replace(layerName + ",", '');	
}
*/
function UpdateCoordinate(evt)
{
    var vStartLong1 = ori_x + (evt.getClientX()*1.0/mul_x);
    var vStartLat1 = ori_y + (evt.getClientY()*1.0/mul_y);
	if (!bUseMeter) {
		vStartLong1 *= FOOT_PER_METER;
		vStartLat1 *= FOOT_PER_METER;
		MAP_UNIT = "ft";
	//	AREA_UNIT = "acres";
	}
	else {
		MAP_UNIT = "m";
//		AREA_UNIT = "hectares";
	}
    
    var text = "Scale:&nbsp;" + Math.round(vScale) + ";&nbsp;N:&nbsp;"+Math.round(vStartLat1) + ",&nbsp;E:&nbsp;"+ Math.round(vStartLong1) ; 

	var time = new Date();
	if (time.getTime() - g_nLastCoordUpdateTime >= COORDINATE_INTERVAL)
	{
		if (top.fraCoordinate && top.fraCoordinate.coordText)
			top.fraCoordinate.coordText.innerHTML = text;
	
		g_nLastCoordUpdateTime = time.getTime();
	}
}

function openWaitWin()
{
	bFullyloaded = false;

	var nLeft, nTop;
	with (top.MainMapFrame.document.body)
	{
		nLeft = top.MainMapFrame.screenLeft + Math.round((clientWidth - 250) / 2);
		nTop = top.MainMapFrame.screenTop + Math.round((clientHeight - 130) / 2);
	}
			
	loadingMapWin = window.open("wait.htm","wait","left=" + nLeft + ",top=" + nTop + ",height=130,width=250");
}

function closeWaitWin()
{
	if (loadingMapWin != null && !loadingMapWin.closed)
	{
		loadingMapWin.close();
		loadingMapWin = null;
	}		

	bFullyloaded = true;
}

function RefreshSVG(oSVGObj, strURL)
{	
	if (oSVGObj != null && bFullyloaded)
	{			
		// end measuring
		aryMeaPointObjs = new Array();		// important!!! this determines whether to hide points, which may cause problem in Netscape
		RestartMeasuring();

		bFullyloaded = false;
		openWaitWin();
		
		var group = FindGroupByName(GEO_TIFF_GROUP_NAME);
		if (group != null && g_strImageID != null && !group.bVisible)
			bReloadGImage = true;

		oSVGObj.setsrc(strURL);
	}
}

//Load SVG page with old URL
function RefreshSvgView()
{
	var root = top.MainMapFrame.MapImageID;          	
	if(root != null)
	{
		//root.setsrc(root.getsrc())
		root.reload();
	}   
}

function ReloadBaseMap()
{
	vScale = vInitialScale * DEFAULT_MAP_HEIGHT/vMapHeight ; 
	vCenterLong = vInitialX;
	vCenterLat = vInitialY;
	g_strImageID = null;		// remove geo-tiff if there is any.
	var vSVGImage = getSvgURL(SVG_IMAGE_URL, SVG_TEMPLATE, vMapWidth, vMapHeight, vInitialX, vInitialY, vScale, g_strVisibleLayers);
	RefreshSVG(parent.MainMapFrame.MapImageID, vSVGImage);
}

function GetOrigin(oSVGRoot)
{
	var originAry = [0.0, 0.0];

    with (oSVGRoot.getElementsByTagName("origin").item(0))
    {
		originAry[0] = getAttribute("x")*1.0;
		originAry[1] = getAttribute("y")*1.0;
	}
	
	return originAry;
}

function GetMultiplier(oSVGRoot)
{
	var multiplierAry = [0.0, 0.0];

    with (oSVGRoot.getElementsByTagName("scale").item(0))
    {
	    multiplierAry[0] = 1.0 / getAttribute("x");
		multiplierAry[1] = 1.0 / getAttribute("y");
    }
    
    return multiplierAry;
}

function UpdateMapSize(nWidth, nHeight)
{
	parent.MainMapFrame.MapImageID.height = vMapHeight = nHeight;
	parent.MainMapFrame.MapImageID.width = vMapWidth = nWidth;
}

function _newuse( root,symbol,x, y, angle ,scale) {
		var use = root.createElement( 'use' );			
		
		var trans = "translate(" + x + ", " + y + ") rotate(" + angle+") scale(" + scale + ")" ;
		
		use.setAttributeNS('http://www.w3.org/1999/xlink','xlink:href',symbol); 	
		use.setAttribute('transform',trans);
				
		return use;
}

// For the pan arrows
function ArrowPanTo(direction) 
{
    var offsetX = (vMapWidth*0.5/mul_x);
    var offsetY = (vMapHeight*0.5/mul_y);
    
    switch (direction)
	{
		case PAN_WEST:	//Pan west
			vCenterLong = vCenterLong - offsetX;
			break;		
		case PAN_EAST:	//pan east
			vCenterLong = vCenterLong + offsetX;
			break;
		case PAN_NORTH:	//Pan north
			vCenterLat = vCenterLat - offsetY;
			break;		
		case PAN_SOUTH:	//Pan south
			vCenterLat = vCenterLat + offsetY;
			break;		
		default:
		  return false;
	}
	
	var vSVGImage = getSvgURL(SVG_IMAGE_URL, SVG_TEMPLATE, vMapWidth, vMapHeight, vCenterLong, vCenterLat, vScale, g_strVisibleLayers);
	RefreshSVG(top.MainMapFrame.MapImageID, vSVGImage);
}

function ResizeMap()
{
    // recalculate the frame size and adjust the SVG size accordingly
	UpdateMapSize(parent.MainMapFrame.document.body.clientWidth, parent.MainMapFrame.document.body.clientHeight);

	var vSVGImage = getSvgURL(SVG_IMAGE_URL, SVG_TEMPLATE, vMapWidth, vMapHeight, vCenterLong, vCenterLat, vScale, g_strVisibleLayers);

	RefreshSVG(top.MainMapFrame.MapImageID, vSVGImage);
}

function _newrect(root, x, y, width, height, stroke, strokeWidth)
{
	var rect = root.createElement('rect');
	rect.setAttribute("width", width);
	rect.setAttribute("height", height);
	rect.setAttribute("x", x);
	rect.setAttribute("y", y);
	rect.getStyle().setProperty("stroke", stroke);
	rect.getStyle().setProperty("stroke-width", strokeWidth);
	rect.getStyle().setProperty("fill",   "none");
	return rect;
}

function _newpath(root, x, y , opacity) {
	var path = root.createElement( 'path' );			
	path.getStyle().setProperty("stroke", "red");
	path.getStyle().setProperty("fill",   "none");				
	path.getStyle().setProperty("opacity",opacity)

	path.setAttribute( 'd', 'M ' + x + ' ' + y + ' L ' + x + ' ' + y );
	return path;
}

function _newcircle( root,x, y ,r,fill,stroke,opacity) {
	var circle = root.createElement( 'circle' );
	
	circle.setAttribute("cx", x);
	circle.setAttribute("cy", y);					
	circle.setAttribute("r", r);		
	
	circle.getStyle().setProperty("stroke", stroke);
	circle.getStyle().setProperty("fill",   fill);				
	circle.getStyle().setProperty("opacity",opacity)
	return circle; 
}

function _newRectangle( root,x, y ,width,height,stroke_color,fill_color,opacity) {
	var rectangle = root.createElement( 'rect' );
	
	rectangle.setAttribute("x",x);
	rectangle.setAttribute("y", y);					
	rectangle.setAttribute("width", width);
	rectangle.setAttribute("height", height);		
	
	rectangle.getStyle().setProperty("stroke", stroke_color);
	rectangle.getStyle().setProperty("stroke-width", 3);
	rectangle.getStyle().setProperty("fill",   fill_color);				
	rectangle.getStyle().setProperty("opacity",opacity);		

	return rectangle; 
}

function _newpolyline( root,stroke, stroke_width, fill_color, opacity)
{
	var path = root.createElement( 'polyline' );
	path.getStyle().setProperty("stroke", stroke);
	path.getStyle().setProperty("stroke-width", stroke_width);
	path.getStyle().setProperty("fill", fill_color);
	path.getStyle().setProperty("opacity", opacity);
	path.getStyle().setProperty("stroke-linecap",   "round");				
	path.getStyle().setProperty("stroke-linejoin",   "round");			
	return path;
}

function PointCoor(x,y)
{    
	this.x = Math.round((x*10))/10;
	this.y = Math.round((y*10))/10;
}

function getSvgURL(wdsName, templateName, w, h, cx, cy, s, visibleLayers)
{
	UpdateLayerStatusStrings();

	wdsName = wdsName.replace(/\?$/, '');
	var width = w*s*0.000868045/FOOT_PER_METER;
	var height = Math.abs(h*s*0.000868045/FOOT_PER_METER);
	var urx = cx + width/2.0;
	var ury = cy + height/2.0;
	var llx = cx - width/2.0;
	var lly = cy - height/2.0;
	var bbox = llx+","+lly+","+urx+","+ury;
	if (templateName == SVG_OVERVIEW_TEMPLATE)
		visibleLayers = gOverviewLayersOrder;
	else
		visibleLayers = g_strVisibleLayers;

	var strURL = wdsName + '?BBOX=' + bbox + '&WIDTH=' + w + '&HEIGHT=' + h + '&LAYERS=' + visibleLayers;
	if (templateName != SVG_OVERVIEW_TEMPLATE)
		strURL += "&LAYERVARS="+gLayerParams;
	else
		strURL += "&LAYERVARS=";
	strURL += "&TEMPLATE="+templateName;

	return strURL;
}
