/* ***********************************************************
DHTMLmapviewer.js
Javascript for viewer.asp page in Map Viewer 3rd Edition
by Howie Sternberg (howies@snet.net)

Map Viewer is placed in the public domain and is "Freeware". 
Map Viewer may be freely used and redistributed, is provided 
"AS-IS" without warranty of any kind, and there is no technical 
support provided.
--------------------------------------------------------------
Browser compatibility - Supports W3C DOM compatible browsers such
as IE 5, 5.5, and 6; Netscape 7 and Mozilla FireFox 1. Does not 
support IE 4 and Netscape Navigator 4. Support is based on browser
capabilities rather than browser version. Compatibility detected 
by testing for the presence of an object, property or method before
using it in a script. Includes DHTML for draggable pan, rubberbanding
zoom, feature selection, placement of a point on map where user
clicks to identify features, and positionable zoom to scale menu 
comprised of a drop down list of map scales to choose from.
--------------------------------------------------------------
Dependencies - jsdomenu.js, jsdomenubar.js, config_menubar_map.js,
config_zoomtoscale.js, DHTML.js, viewer.js  
--------------------------------------------------------------
Acknowledgements - jsDOMenuBar Version 1.1.1, Copyright (C) 2004
- 2005 Toh Zhiqiang Released on 12 February 2005. jsDOMenuBar is
distributed under the terms of the GNU GPL license. This program 
is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or 
(at your option) any later version. Download jsDOMenuBar at 
http://www.tohzhiqiang.per.sg/projects/jsdomenubar/ and refer to
license.txt and readme.txt included in the download for more 
information.
--------------------------------------------------------------
History
May 2004, Initial code
Sep 2004, Revised for Map Viewer 2nd Edition
May 2005, Revised for Map Viewer 3rd Edition to only support  
		  W3C DOM compatible browsers 
************************************************************ */

// Array of images for inactive (off) zoom, pan, select, and identify tools
var aImg = new Array();
aImg[0] = new Image(16,16);
aImg[1] = new Image(16,16);
aImg[2] = new Image(16,16);
aImg[3] = new Image(16,16);
aImg[4] = new Image(16,16);
aImg[5] = new Image(16,16);
aImg[0].src = "images/zoomin_1.gif";
aImg[1].src = "images/zoomout_1.gif";
aImg[2].src = "images/pan_1.gif";
aImg[3].src = "images/select_1.gif";
aImg[4].src = "images/identify_1.gif";
//	added by Kevin for Public Records PLAT PAGE Search
aImg[5].src = "images/platsearch.gif";
//	added by Kevin for Public Records PLAT PAGE Search


// Array of images for active (on) zoom, pan, select, and identify tools
var aImgOn = new Array();
aImgOn[0] = new Image(16,16);
aImgOn[1] = new Image(16,16);
aImgOn[2] = new Image(16,16);
aImgOn[3] = new Image(16,16);
aImgOn[4] = new Image(16,16);
aImgOn[5] = new Image(16,16);
aImgOn[0].src = "images/zoomin_2.gif";
aImgOn[1].src = "images/zoomout_2.gif";
aImgOn[2].src = "images/pan_2.gif";
aImgOn[3].src = "images/select_2.gif";
aImgOn[4].src = "images/identify_2.gif";
//	added by Kevin for Public Records PLAT PAGE Search
aImgOn[5].src = "images/platsearch_2.gif";
//	added by Kevin for Public Records PLAT PAGE Search


// Global variables
var zMapAction = new String ("");	// map action
var zMapTool = new String ("");		// current map tool
var zMapCursor = new String ("")	// current mouse pointer, based on map tool
var zMouseButton = new Number (0);	// mouse button number. 1=left mouse
var zUsingMapTool					// boolean indicating map tool in use - set to true by onmousedown event handler, set to false by onmouseup event handler.
var zImgScreenX = new Number (0);	// X (left) position of map image in screen space (screen pixels)
var zImgScreenY = new Number (0);	// Y (top) position of map image in screen space (screen pixels)
var zImgX = new Number (0);			// current mouse event X coord (pixels)
var zImgY = new Number (0);			// current mouse event Y coord (pixels)
var zImgCenX = new Number (0);		// map center X coord resulting from draggable pan (pixels)
var zImgCenY = new Number (0);		// map center Y coord resulting from draggable pan (pixels)
var zImgStartX = new Number (0);	// mouse down X coord (pixels)
var zImgStartY = new Number (0);	// mouse down Y coord (pixels)
var zImgDeltaX = new Number (0);	// horizontal distance mouse moved (pixels)
var zImgDeltaY = new Number (0);	// vertical distance mouse moved (pixels)
var zImgMinX = new Number (0);		// draggable box min X coord (pixels)
var zImgMaxX = new Number (0);		// draggable box max X coord (pixels)
var zImgMinY = new Number (0);		// draggable box min Y coord (pixels)
var zImgMaxY = new Number (0);		// draggable box max Y coord (pixels)
var zImgW = new Number (0);			// image width (pixels)		
var zImgH = new Number (0);			// image height (pixels)
var zMapX = new Number (0);			// current mouse event X coord (map units)
var zMapY = new Number (0);			// current mouse event Y coord (map units)
var zMapBoxMinX = new Number (0);	// draggable box min X coord (map units)
var zMapBoxMaxX = new Number (0);	// draggable box max X coord (map units)
var zMapBoxMinY = new Number (0);	// draggable box min Y coord (map units)
var zMapBoxMaxY = new Number (0);	// draggable box max Y coord (map units)
var zMapBoxWidth = new Number (0);	// draggable box width (map units)
var zMapBoxHeight = new Number (0);	// draggable box height (map units)
var zMapMinX = new Number (0);		// map envelope min X coord (map units)
var zMapMaxX = new Number (0);		// map envelope max X coord (map units)
var zMapMinY = new Number (0);		// map envelope min Y coord (map units)
var zMapMaxY = new Number (0);		// map envelope max Y coord (map units)
var zMapUnits = new String ("")		// map units
var zMapScaleDenominator = new Number (0);  // map scale denominator
// container object
var objMapViewer
// html form
var objMapForm
// interactive map objects
var objMap
var objMapEvent
var objZoomBoxTop
var objZoomBoxBottom
var objZoomBoxLeft
var objZoomBoxRight
var objSelectBoxTop
var objSelectBoxBottom
var objSelectBoxLeft
var objSelectBoxRight
var objPoint
// map tool objects
var objZoomInToolImg
var	objZoomOutToolImg
var	objPanToolImg
var objAutoSelectToolImg
var	objSelectToolImg
var	objIdentifyToolImg
// zoom to scale object
var objZoomToScaleMenu
//	added by Kevin for Public Records PLAT PAGE Search
var objPlatSearchImg

zUsingMapTool = Boolean(false);

// set event handler to test for browser capabilities and initialize API
window.onload = initMapDHTML;

// Set mouse event handlers, create DOM objects, load menus
function initMapDHTML() {
	if (canSupportDHTML()) {
		// event handlers	
		document.getElementById("mapEvent").onmousemove = movemouse;
		document.getElementById("mapEvent").onmousedown = startmouse;
		document.getElementById("mapEvent").onmouseout = outmouse;
		document.onmouseup = stopmouse;
		// regular html element objects (forms and images)
		objMapForm = getObject("mapFormId");
		objZoomInToolImg = getObject("zoomin");
		objZoomOutToolImg = getObject("zoomout");
		objPanToolImg = getObject("pan");
		objSelectToolImg = getObject("select");
		objIdentifyToolImg = getObject("identify");
		//added by kevin for plat page search
		objPlatSearchImg = getObject("platsearch");
		// style objects (positionable)
		objMapViewer = getObjectStyle("mapViewer");
		objMap = getObjectStyle("mapImg");
		objMapEvent = getObjectStyle("mapEvent");
		objZoomBoxTop = getObjectStyle("mapZoomBoxTop");
		objZoomBoxBottom = getObjectStyle("mapZoomBoxBottom");
		objZoomBoxLeft = getObjectStyle("mapZoomBoxLeft");
		objZoomBoxRight = getObjectStyle("mapZoomBoxRight");
		objSelectBoxTop = getObjectStyle("mapSelectBoxTop");
		objSelectBoxBottom = getObjectStyle("mapSelectBoxBottom");
		objSelectBoxLeft = getObjectStyle("mapSelectBoxLeft");
		objSelectBoxRight = getObjectStyle("mapSelectBoxRight");
		objPoint = getObjectStyle("mapPoint");
		// get map image dimensions and set to globals
		zImgW = getObjectWidth("mapImg");
		zImgH = getObjectHeight("mapImg");
		// get map envelope values from form and set to globals
		zMapMinX = parseFloat(objMapForm.mapminx.value);
		zMapMaxX = parseFloat(objMapForm.mapmaxx.value);
		zMapMinY = parseFloat(objMapForm.mapminy.value);
		zMapMaxY = parseFloat(objMapForm.mapmaxy.value);
		// get map units from form and set to global, replacing the "_" in "decimal_degrees" with " " (a space), if necessary
		zMapUnits = objMapForm.servicemapunits.value;
		var re = /_/gi;
		zMapUnits = zMapUnits.replace (re, " ");
		zMapUnits = zMapUnits.toLowerCase();
		// set map tool and cursor
		setMapTool(zMapTool);
		// load menubar
		initjsDOMenu();
		// load map scale menubar
		zMapScaleDenominator = parseInt(objMapForm.mapscaledenominator.value);		
		zMapScaleDenominator = parseInt(objMapForm.mapscaledenominator.value);
		zMapScaleMenuLeft = parseInt(objMapForm.styleleft.value) + 45 + parseInt(objMapForm.mapimgwidth.value) - 110;
		zMapScaleMenuTop = parseInt(objMapForm.styletop.value);
		createZoomToScaleMenu(zMapScaleDenominator,zMapScaleMenuLeft,zMapScaleMenuTop);
		// hide download message
		hideDownloadMessage()
	} else {
		window.alert("update your browser");
	}
}

// Set Map Action - set global variables to form elements and submit mapForm
function setMapAction(s) {
	// show download message
	showDownloadMessage()
	// set map tool to nothing
	zUsingMapTool = Boolean(false);
	// submit form
	objMapForm.reset();
	objMapForm.mapaction.value = s;
	objMapForm.maptool.value = zMapTool;
	objMapForm.mapimgx.value = zImgMinX;
	objMapForm.mapimgy.value = zImgMaxY;
	objMapForm.mapimgx2.value = zImgMaxX;
	objMapForm.mapimgy2.value = zImgMinY;
	objMapEvent.cursor = "wait";
	objMapForm.submit();
}

// Set current map tool when user clicks it. Swap tool images and set cursor.
function setMapTool(v) {
	zMapTool = v;
	var s = new String("");
	var mapscale = new Number(0);
	var activeminscale = new Number(0);
	var activemaxscale = new Number(0);
	var identifyminscale = new Number(0);
	var identifymaxscale = new Number(0);
	s = objMapForm.mapscale.value;
	mapscale = parseFloat(s);
	s = objMapForm.activeminscale.value;
	activeminscale = parseFloat(s);
	s = objMapForm.activemaxscale.value;
	activemaxscale = parseFloat(s);
	s = objMapForm.identifyminscale.value;
	identifyminscale = parseFloat(s);
	s = objMapForm.identifymaxscale.value;
	identifymaxscale = parseFloat(s);
	objZoomInToolImg.src = aImg[0].src;
	objZoomOutToolImg.src = aImg[1].src;
	objPanToolImg.src = aImg[2].src;
	if ((activeminscale < mapscale) & (mapscale < activemaxscale)) {
		objSelectToolImg.src = aImg[3].src;
	}
	if ((identifyminscale < mapscale) & (mapscale < identifymaxscale)) {
		objIdentifyToolImg.src = aImg[4].src;
	}
	if (zMapTool == "zoomin") { 
		objZoomInToolImg.src = aImgOn[0].src;
		zMapCursor = getMapCursor(zMapTool);
	}
	if (zMapTool == "zoomout") {
		objZoomOutToolImg.src = aImgOn[1].src;
		zMapCursor = getMapCursor(zMapTool);
	}
	if (zMapTool == "pan") { 
		objPanToolImg.src = aImgOn[2].src;
		zMapCursor = getMapCursor(zMapTool);
	}
	if ((activeminscale < mapscale) & (mapscale < activemaxscale)) {
		if (zMapTool == "select") {
			objSelectToolImg.src = aImgOn[3].src;
			zMapCursor = getMapCursor(zMapTool);
		}
	}
	if ((identifyminscale < mapscale) & (mapscale < identifymaxscale)) {
		if (zMapTool == "identify") {
			objIdentifyToolImg.src = aImgOn[4].src;
			zMapCursor = getMapCursor(zMapTool);
		}
	}
//	added by Kevin for Public Records PLAT PAGE Search
	if (objPlatSearchImg) {
		objPlatSearchImg.src = aImg[5].src;
	}
	if (zMapTool == "platsearch") {
		objPlatSearchImg.src = aImgOn[5].src;
		zMapCursor = getMapCursor(zMapTool);
	}
//	added by Kevin for Public Records PLAT PAGE Search

	objMapEvent.cursor = zMapCursor;
}

// set mouse cursor according to tool and browser support for icon file format 
function getMapCursor(v){
	var s
	if (v == "zoomin") {s = "url(cursors/ZoomIn.cur), default;"}
	if (v == "zoomout") {s = "url(cursors/ZoomOut.cur), default;"}
	if (v == "pan") {s = "url(cursors/Pan.cur), move;"}
	if (v == "select") {s = "crosshair"}
	if (v == "identify") {s = "url(cursors/IdentCur.cur), crosshair;"}
	//	added by Kevin for Public Records PLAT PAGE Search
	if (v == "platsearch") {s = "url(cursors/SelectFeatures.cur), crosshair;"}	
	return s;
}
			
// onmousedown event handler - initialize global variables
function startmouse(evt) {
	zMouseButton = (evt) ? evt.which : event.button
	evt = (evt) ? evt : event;
	if (zMouseButton == 1) {
		zUsingMapTool = Boolean(true);
		zImgMinX = 0;
		zImgMinY = 0;
		zImgMaxX = 0;
		zImgMaxY = 0;
		zImgDeltaX = 0;
		zImgDeltaY = 0;
		zImgStartX = getEventX(evt);
		zImgStartY = getEventY(evt);
		zImgX = zImgStartX;
		zImgY = zImgStartY;
		zImgScreenX = evt.screenX - zImgStartX;
		zImgScreenY = evt.screenY - zImgStartY;
		sizeObject(objZoomBoxTop,0,0);
		sizeObject(objZoomBoxBottom,0,0);
		sizeObject(objZoomBoxLeft,0,0);
		sizeObject(objZoomBoxRight,0,0);
		sizeObject(objSelectBoxTop,0,0);
		sizeObject(objSelectBoxBottom,0,0);
		sizeObject(objSelectBoxLeft,0,0);
		sizeObject(objSelectBoxRight,0,0);
		hideObject(objPoint);
		zMapAction = zMapTool;				
		if (zMapTool == "zoomin") {
			showObject(objZoomBoxTop);
			showObject(objZoomBoxBottom);
			showObject(objZoomBoxLeft);
			showObject(objZoomBoxRight);
		} else if (zMapTool == "zoomout") {
			showObject(objZoomBoxTop);
			showObject(objZoomBoxBottom);
			showObject(objZoomBoxLeft);
			showObject(objZoomBoxRight);
		} else if (zMapTool == "pan") {
			zImgCenX = zImgStartX;
			zImgCenY = zImgStartY;
			zImgDeltaX = 0;
			zImgDeltaY = 0;
		} else if (zMapTool == "select") {
			showObject(objSelectBoxTop);
			showObject(objSelectBoxBottom);
			showObject(objSelectBoxLeft);
			showObject(objSelectBoxRight);
		}
	} 
	return false;
}

// onmousemove event handler - change global variable values and move objects
function movemouse(evt) {
	evt = (evt) ? evt : event;
	if (zMouseButton == 1) {
		if (zUsingMapTool) {
			if ((evt.screenX) > zImgScreenX) {
				if ((evt.screenX) < (zImgScreenX + zImgW)) {
					if ((evt.screenY) > zImgScreenY) {
						if ((evt.screenY) < (zImgScreenY + zImgH)) {			
							if (evt.x) {				
								zImgX = evt.x;
								zImgY = evt.y;
							} else {
								zImgX = evt.layerX;
								zImgY = evt.layerY;		
							}
						}
					}
				}
			}		
			if ((zMapAction == "zoomin") || (zMapAction == "zoomout")) { // zoom in and out	
				if (zImgX > zImgStartX) {
					zImgMinX = zImgStartX;
					zImgMaxX = Math.min(zImgW,zImgX);
				} else {
					zImgMinX = Math.max(0,zImgX);
					zImgMaxX = zImgStartX;
				}
				if (zImgY > zImgStartY) {
					zImgMinY = zImgStartY;
					zImgMaxY = Math.min(zImgH,zImgY);
				} else {
					zImgMinY = Math.max(0,zImgY);
					zImgMaxY = zImgStartY;
				}
				zImgDeltaX = zImgMaxX - zImgMinX;
				zImgDeltaY = zImgMaxY - zImgMinY;
				zMapBoxMinX = getMapCoordX(zImgMinX,zImgW,zMapMinX,zMapMaxX,zMapUnits);	
				zMapBoxMaxX = getMapCoordX(zImgMaxX,zImgW,zMapMinX,zMapMaxX,zMapUnits);	
				zMapBoxMaxY = getMapCoordY(zImgMinY,zImgH,zMapMinY,zMapMaxY,zMapUnits);	
				zMapBoxMinY = getMapCoordY(zImgMaxY,zImgH,zMapMinY,zMapMaxY,zMapUnits);
				zMapBoxWidth = getMapCoordLength(zMapBoxMinX,zMapBoxMaxX,zMapUnits);
				zMapBoxHeight	= getMapCoordLength(zMapBoxMinY,zMapBoxMaxY,zMapUnits);					
				placeObject(objZoomBoxTop, zImgMinX, zImgMinY, zImgDeltaX, 3);
				placeObject(objZoomBoxBottom, zImgMinX, Math.min(zImgMaxY,zImgH - 3), zImgDeltaX, 3);
				placeObject(objZoomBoxLeft, zImgMinX, zImgMinY, 3, zImgDeltaY);
				placeObject(objZoomBoxRight, Math.min(zImgMaxX,zImgW - 3), zImgMinY, 3, zImgDeltaY);
				// map coordinates for draggable box used to map zoom in or out
				window.status = "Zoom to MinX: " + zMapBoxMinX + ", MinY: " + zMapBoxMinY + ", MaxX: " + zMapBoxMaxX + ", MaxY: " + zMapBoxMaxY + ", Size: (" + zMapBoxWidth + " x " + zMapBoxHeight + " " + zMapUnits +")";			
			} else if (zMapAction == "pan") { // pan
				if ((evt.screenX) > zImgScreenX) {
					if ((evt.screenX) < (zImgScreenX + zImgW)) {
						if ((evt.screenY) > zImgScreenY) {
							if ((evt.screenY) < (zImgScreenY + zImgH)) {
								if (zImgX > zImgStartX ) {
									zImgMaxX = Math.min(zImgW,zImgX);
									zImgDeltaX = zImgMaxX - zImgStartX;
								} else {
									zImgDeltaX = zImgX - zImgStartX;
								}
								if (zImgY > zImgStartY) {
									zImgMaxY = Math.min(zImgH,zImgY);
									zImgDeltaY = zImgMaxY - zImgStartY;
								} else {
									zImgDeltaY = zImgY - zImgStartY;
								}
								moveObject(objMap,zImgDeltaX,zImgDeltaY);				
								zImgCenX = ((zImgW / 2) - zImgDeltaX);
								zImgCenY = ((zImgH / 2) - zImgDeltaY);
								zMapX = getMapCoordX(zImgCenX,zImgW,zMapMinX,zMapMaxX,zMapUnits);	
								zMapY = getMapCoordY(zImgCenY,zImgH,zMapMinY,zMapMaxY,zMapUnits);
								// map coordinates for center of map while dragging image to pan map
								window.status = "Center at X: " + zMapX + " Y: " + zMapY + " (" + zMapUnits +")";
							}
						}
					}
				}
			} else if (zMapAction == "select") {	// select		
				if (zImgX > zImgStartX) {
					zImgMinX = zImgStartX;
					zImgMaxX = Math.min(zImgW,zImgX);
				} else {
					zImgMinX = Math.max(0,zImgX);
					zImgMaxX = zImgStartX;
				}
				if (zImgY > zImgStartY) {
					zImgMinY = zImgStartY;
					zImgMaxY = Math.min(zImgH,zImgY);
				} else {
					zImgMinY = Math.max(0,zImgY);
					zImgMaxY = zImgStartY;
				}
				zImgDeltaX = zImgMaxX - zImgMinX;
				zImgDeltaY = zImgMaxY - zImgMinY;				
				zMapBoxMinX = getMapCoordX(zImgMinX,zImgW,zMapMinX,zMapMaxX,zMapUnits);	
				zMapBoxMaxX = getMapCoordX(zImgMaxX,zImgW,zMapMinX,zMapMaxX,zMapUnits);	
				zMapBoxMaxY = getMapCoordY(zImgMinY,zImgH,zMapMinY,zMapMaxY,zMapUnits);	
				zMapBoxMinY = getMapCoordY(zImgMaxY,zImgH,zMapMinY,zMapMaxY,zMapUnits);
				zMapBoxWidth = getMapCoordLength(zMapBoxMinX,zMapBoxMaxX,zMapUnits);
				zMapBoxHeight	= getMapCoordLength(zMapBoxMinY,zMapBoxMaxY,zMapUnits);											
				placeObject(objSelectBoxTop, zImgMinX, zImgMinY, zImgDeltaX, 3);
				placeObject(objSelectBoxBottom, zImgMinX, Math.min(zImgMaxY,zImgH - 3), zImgDeltaX, 3);
				placeObject(objSelectBoxLeft, zImgMinX, zImgMinY, 3, zImgDeltaY);
				placeObject(objSelectBoxRight, Math.min(zImgMaxX,zImgW - 3), zImgMinY, 3, zImgDeltaY);
				// map coordinates for draggable box used to select features
				window.status = "Select area MinX: " + zMapBoxMinX + ", MinY: " + zMapBoxMinY + ", MaxX: " + zMapBoxMaxX + ", MaxY: " + zMapBoxMaxY + ", Size: (" + zMapBoxWidth + " x " + zMapBoxHeight + " " + zMapUnits +")";		
			} 
		} 
	} else {	// hover mouse over image
		zImgX = getEventX(evt);
		zImgY = getEventY(evt);
		zMapX = getMapCoordX(zImgX,zImgW,zMapMinX,zMapMaxX,zMapUnits);	
		zMapY = getMapCoordY(zImgY,zImgH,zMapMinY,zMapMaxY,zMapUnits);
		// image coordinates of mouse position:	
		// window.status = "X: " + zImgX + " Y: " + zImgY;
		// map coordinates of mouse position:
		window.status = "X: " + zMapX + " Y: " + zMapY + " (" + zMapUnits +")";
	}
	evt.cancelBubble = true;
	return false;	
}

// onmouseup event handler - hide objects and call setMapAction()
function stopmouse(evt) {	
	if (zUsingMapTool) {
		evt = (evt) ? evt : event;
		if (zMouseButton == 1) {
			zUsingMapTool = Boolean(false);
			if ((zMapAction == "zoomin") || (zMapAction == "zoomout")) {
				if ((zImgDeltaX <= 5) && (zImgDeltaY <= 5)) {
					zImgMinX = zImgX;
					zImgMaxY = zImgY;
					zImgMaxX = 0;
					zImgMinY = 0;
				}
				hideObject(objZoomBoxTop);
				hideObject(objZoomBoxBottom);
				hideObject(objZoomBoxLeft);
				hideObject(objZoomBoxRight);
			} else if (zMapAction == "pan") {
				zImgMinX = zImgCenX;
				zImgMaxY = zImgCenY;
				zImgMaxX = 0;
				zImgMinY = 0;
			} else if (zMapAction == "select") {
				if ((zImgDeltaX <= 5) && (zImgDeltaY <= 5)) {
					zImgMinX = zImgX;
					zImgMaxY = zImgY;
					zImgMaxX = 0;
					zImgMinY = 0;
				}
				hideObject(objSelectBoxTop);
				hideObject(objSelectBoxBottom);
				hideObject(objSelectBoxLeft);
				hideObject(objSelectBoxRight);
			} else if (zMapAction == "identify") {
				zImgMinX = zImgX;
				zImgMaxY = zImgY;
				zImgMaxX = 0;
				zImgMinY = 0;
				moveObject(objPoint,zImgX - 3,zImgY - 3);
				showObject(objPoint);
			} else if (zMapAction == "platsearch") {
				zImgMinX = zImgX;
				zImgMaxY = zImgY;
				zImgMaxX = 0;
				zImgMinY = 0;
				moveObject(objPoint,zImgX - 3,zImgY - 3);
				showObject(objPoint);
			}
			zMouseButton = 0;
			setMapAction(zMapAction);
		}
	}
}

function outmouse () {
	window.status = "Done.";
}

// Retrieve horizontal (x) coordinate of the mouse event in map units.
function getMapCoordX(imgCoordX, imgW, minX, maxX, units) {
	var v = new Number(0);	
	v = (maxX - minX) * (imgCoordX / imgW);
	if ((units == "feet") || (units == "meters")) {						// convert value to integer 
		v =  parseInt(minX + v);								
	} else {
		v =  parseFloat(minX + v);
		v = v.toString();
		v = v.substr(0,v.indexOf(".")) + v.substr(v.indexOf("."),6);	// add 5 decimal places
	}
	return v;
}

// Retrieve vertical (y) coordinate of the mouse event in map units.
function getMapCoordY(imgCoordY, imgH, minY, maxY, units) {
	var v = new Number(0);	
	v = (maxY - minY) * (imgCoordY / imgH);
	if ((units == "feet") || (units == "meters")) {						// convert value to integer 
		v =  parseInt(maxY - v);										
	} else {
		v =  parseFloat(maxY - v);
		v = v.toString();
		v = v.substr(0,v.indexOf(".")) + v.substr(v.indexOf("."),6);	// add 5 decimal places
	}
	return v;
}

// Calc distance between min and max coordinates to show in status bar when dragging rect.
function getMapCoordLength(minVal, maxVal, units) {
	var v = new Number(0);	
	v = (maxVal - minVal);
	if ((units == "feet") || (units == "meters")) {						// convert value to integer 
		v =  parseInt(v);										
	} else {
		v =  parseFloat(v);
		v = v.toString();
		v = v.substr(0,v.indexOf(".")) + v.substr(v.indexOf("."),6);	// add 5 decimal places
	}
	return v;
}

// Creates the zoom to scale object. Run this when page loads to create and position object.
function createZoomToScaleMenu() {
	// Create div element for zoom to scale
	var elemMenu = document.createElement("div");
	//elemMenu = document.getElementById("mapZoomToScale");
	elemMenu.menuClassName = "mv_zoomtoscale";
	elemMenu.menuClassNameActive = "mv_zoomtoscaleactive";
	elemMenu.className = elemMenu.menuClassName;
	// Position div element
	elemMenu.style.position = "absolute";
	elemMenu.style.left = arguments[1] + "px";
	elemMenu.style.top = arguments[2] + "px";
	elemMenu.style.visibility = "visible";
	// Create span element for current map scale
	var elemMenuItem = document.createElement("span");
	elemMenuItem.menuClassName = "mv_scalecurrent";
	elemMenuItem.className = elemMenuItem.menuClassName;
	elemMenuItem.onmouseover = mapscaleover;
	elemMenuItem.onclick = togglezoomtoscale;
	elemMenuItem.theMessage = "Set map scale. Current map scale is 1:" + formatMapScale(arguments[0]);
	elemMenuItem.innerHTML = "Scale 1:" + formatMapScale(arguments[0]);
	// Base the zoom to scale object on the div element, add span element to zoom to scale object, and append zoom to scale object to document body
	objZoomToScaleMenu = elemMenu;
	objZoomToScaleMenu.appendChild(elemMenuItem);
	document.body.appendChild(objZoomToScaleMenu);
}

// Called by addMapScale() function in config_zoomtoscale.js 
function mapScale() {
	var elemMenuItem = document.createElement("span");
	elemMenuItem.menuClassName = "mv_scale";
	elemMenuItem.menuClassNameOver = "mv_scaleover";
	elemMenuItem.className = elemMenuItem.menuClassName;
	elemMenuItem.theScale = arguments[0];
	elemMenuItem.theMessage = "Set map scale to 1:" + formatMapScale(elemMenuItem.theScale);
	elemMenuItem.innerHTML = "1:" + formatMapScale(elemMenuItem.theScale);
	elemMenuItem.onmouseover = mapscaleover;
	elemMenuItem.onmouseout = mapscaleout;
	elemMenuItem.onclick = mapscaleclick;
	objZoomToScaleMenu.appendChild(elemMenuItem);
}

// Onclick function for current map scale span element that opens and closes the zoom to scale list
function togglezoomtoscale() {
	if (this.theMessage) {
		window.status = this.theMessage;
	}
	if (objZoomToScaleMenu.childNodes.length == 1) {	
		openZoomToScale();
	} else {
		closeZoomToScale();
	}
}

// Opens drop down list of scales
function openZoomToScale() {
	if (objZoomToScaleMenu.childNodes.length == 1) {
		// Change look of zoom to scale menu bar when active		
		objZoomToScaleMenu.className = objZoomToScaleMenu.menuClassNameActive;
		// Append map scale elements
		addMapScales();
		// Append 'Close' element to bottom of list
		var elemMenuItem = document.createElement("span");
		elemMenuItem.menuClassName = "mv_scale";
		elemMenuItem.menuClassNameOver = "mv_scaleover";
		elemMenuItem.className = elemMenuItem.menuClassName;
		elemMenuItem.theMessage = "Close map scale list";
		elemMenuItem.innerHTML = "Close";	
		elemMenuItem.onmouseover = mapscaleover;
		elemMenuItem.onmouseout = mapscaleout;
		elemMenuItem.onclick = togglezoomtoscale;
		objZoomToScaleMenu.appendChild(elemMenuItem);			
	}
}

// Closes drop down list of scales
function closeZoomToScale() {
	if (objZoomToScaleMenu.childNodes.length > 1 ) {
		objZoomToScaleMenu.className = objZoomToScaleMenu.menuClassName;
		for (i = objZoomToScaleMenu.childNodes.length-1; i >=1; i--) {
			objZoomToScaleMenu.removeChild(objZoomToScaleMenu.childNodes[i]);
		}
	}
}

// Convert scale to string and insert commas 
function formatMapScale() {
	var i = parseInt(arguments[0]);
	var s = i.toString();
	if (s.length > 3) {
		s = s.substr(0,s.length-3) + ","  +  s.substr(s.length-3,s.length);
	}
	if (s.length > 7) {
		s = s.substr(0,s.length-7) + ","  +  s.substr(s.length-7,s.length);
	}
	if (s.length > 11) {
		s = s.substr(0,s.length-11) + ","  +  s.substr(s.length-11,s.length);
	}
	return s;
}

// onmouseout function for each listed map scale element
function mapscaleout() {
	this.className = this.menuClassName;
}

// onmouseover function for each listed map scale element
function mapscaleover() {
	if (this.menuClassNameOver)	{
		this.className = this.menuClassNameOver;
	}
	if (this.theMessage) {
		window.status = this.theMessage;
	}
}

// onclick function for each listed map scale element
function mapscaleclick() {
	this.className = this.menuClassNameClick;
	setMapScale(this.theScale);
}

/* Demonstrating how to run the createZoomToScaleMenu script in 
a window.onload script in order to creates a zoom to scale menu
displaying a map scale of 1:24,000, positioned at left:300 top:20. */
function doOnLoad() {
	createZoomToScaleMenu(24000,300,20);
}

// Sets Map scale for zoom to scale function
function setMapScale(s) {
	// show download message
	showDownloadMessage()
	// close map scale menu
	closeZoomToScale();
	objMapEvent.cursor = "wait";
	objMapForm.reset();
	objMapForm.mapaction.value = "zoomtoscale";
	objMapForm.propertymapscaledenominator.value = s;
	objMapForm.submit();
}