// aimsMap.js

/*

*  JavaScript template file for ArcIMS HTML Viewer

*		dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js

*/



aimsMapPresent=true;



// global variables

	// show xml responses

var debugOn = 0;

  // can debug be toggled?

var setDebug = true;



var useLimitExtent=false;

var getStartingExtent=true;

var getLimitExtent=true;

var enforceFullExtent=false;



// map extents. . . dynamically updated

var eLeft = -180.0;

var eRight = 180.0;

var eTop = 90.0;

var eBottom = -90.0;

var fullLeft = eLeft;

var fullRight = eRight;

var fullTop = eTop;

var fullBottom = eBottom;



// map size . . . dynamically updated

var iWidth = 630;

var iHeight = 512;

// location map size . . . dynamically updated

var i2Width = 150;

var i2Height = 120;



var imageLimitLeft = limitLeft;

var imageLimitTop = limitTop;

var imageLimitRight = limitRight;

var imageLimitBottom = limitBottom;



var appDir = "";



var xDistance = Math.abs(eRight-eLeft);

var yDistance = Math.abs(eTop-eBottom);

var panX = xDistance * panFactor;

var panY = yDistance * panFactor;

var pixelX = xDistance/iWidth;

var pixelY = yDistance/iHeight;

var mapX = eLeft;

var mapY = eTop;

var lastLeft = eLeft;

var lastRight = eRight;

var lastTop = eTop;

var lastBottom = eBottom;

var fullOVLeft = eLeft;

var fullOVRight = eRight;

var fullOVTop = eTop;

var fullOVBottom = eBottom;

var theCursor = "crosshair";

var canLoad=false;

//if (imsURL!="") canLoad=false;



var fullWidth = Math.abs(fullRight - fullLeft);

var fullHeight = Math.abs(fullTop - fullBottom);

var fullOVWidth = Math.abs(fullOVRight - fullOVLeft);

var fullOVHeight = Math.abs(fullOVTop - fullOVBottom);

var mapScaleFactor = xDistance / iWidth;



var geocodeX = 0;

var geocodeY = 0;

var showGeocode = false;

var geocodeLabel = "";



var queryZoom=false;



var sQuote = "'";

var dQuote = '"';



var toolMode = 1;

var legendVisible=false;

// set legend visible at service load... showTOC=false & hasTOC=true

if ((hasTOC) && (!showTOC)) legendVisible=true;



MapUnits = MapUnits.toUpperCase();

ScaleBarUnits = ScaleBarUnits.toUpperCase();



// save the extent 

function saveLastExtent() {

	lastLeft = eLeft;

	lastRight = eRight;

	lastTop = eTop;

	lastBottom = eBottom;

}


function beforeMapRefresh() {

 // add any code for checking parameters before map update

 // called by sendXML() before writing XML request

 //alert("Yup. It works.[1]");

}

 

function afterMapRefresh() {

 // add any code for checking parameters after map update

 // called by processXML() if XMMmode=1 after image and extent is updated

 //alert("Yup. It works.[1]"); 

}	



// zoom using button.

//		zoomType: 1=in; 2=out

function zoomButton(zoomType) {

	saveLastExtent();

	if (zoomType == 1) {

		// zoom in

		eLeft = eLeft + (xHalf/2);

		eRight = eRight - (xHalf/2);

		eTop = eTop - (yHalf/2);

		eBottom = eBottom + (yHalf/2);

	}

	else {

		// zoom out

		eLeft = eLeft - xHalf;

		eRight = eRight + xHalf;

		eTop = eTop + yHalf;

		eBottom = eBottom - yHalf;

	}

	checkFullExtent();

	//var theString = writeXML();

	sendMapXML();

}



// pan using arrow buttons

function panButton(panType) {

	//alert("Left:" + left + "\nTop:" + top + "\nRight:" + right + "\nBottom:" + bottom + "\nWidth:" + xDistance + "\nHeight:" + yDistance + "\nPanX:" + panX + "\nPanY:" + panY);

	saveLastExtent();

	xDistance = Math.abs(eRight-eLeft);

	yDistance = Math.abs(eTop-eBottom);

	panX = xDistance * panFactor;

	panY = yDistance * panFactor;

	switch(panType) {

	//if (panType == 1) {

	case 1:

		//west

		eLeft = eLeft - panX;

		eRight = eLeft + xDistance;

		break

	case 2:

		// north

		eTop = eTop + panY;

		eBottom = eTop - yDistance;

		break

	case 3:

		// east

		eRight = eRight + panX;

		eLeft = eRight - xDistance;

		break

	case 4:

		// south

		eBottom = eBottom - panY;

		eTop = eBottom + yDistance;

		break

	case 5:

		// southwest

		eTop = eTop - panY;

		eLeft = eLeft - panX;

		eBottom = eTop - yDistance;

		eRight = eLeft + xDistance;

		break

	case 6:

		// northwest

		eTop = eTop + panY;

		eLeft = eLeft - panX;

		eBottom = eTop - yDistance;

		eRight = eLeft + xDistance;

		break

	case 7:

		// northeast

		eTop = eTop + panY;

		eLeft = eLeft + panX;

		eBottom = eTop - yDistance;

		eRight = eLeft + xDistance;

		break

	case 8:

		// southeast

		eTop = eTop - panY;

		eLeft = eLeft + panX;

		eBottom = eTop - yDistance;

		eRight = eLeft + xDistance;

	}

	checkFullExtent();

	//alert("Left:" + left + "\nTop:" + top + "\nRight:" + right + "\nBottom:" + bottom + "\nWidth:" + xDistance + "\nHeight:" + yDistance + "\nPanX:" + panX + "\nPanY:" + panY);

	//var theString = writeXML();

	sendMapXML();

	

}



function checkFullExtent() {

	if (xDistance>fullWidth) xDistance = fullWidth;

	if (yDistance>fullHeight) yDistance = fullHeight;

	if (enforceFullExtent) {

		if (eLeft < limitLeft) {

			eLeft = limitLeft;

			eRight = eLeft + xDistance;

		}

		if (eTop > imageLimitTop) {

			eTop = imageLimitTop;	

			eBottom = eTop - yDistance;

		}	

		if (eRight > imageLimitRight) {

			eRight = imageLimitRight;

			eLeft = eRight - xDistance;

		}

		if (eBottom < imageLimitBottom) {

			eBottom = imageLimitBottom;	

			eTop = eBottom + yDistance;

		}	

	}



}



// aimsMap.js

/*

*  JavaScript template file for ArcIMS HTML Viewer

*		dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js

*/



aimsMapPresent=true;



// global variables

	// show xml responses

var debugOn = 0;

  // can debug be toggled?

var setDebug = true;



var useLimitExtent=false;

var getStartingExtent=true;

var getLimitExtent=true;

var enforceFullExtent=false;



// map extents. . . dynamically updated

var eLeft = -180.0;

var eRight = 180.0;

var eTop = 90.0;

var eBottom = -90.0;

var fullLeft = eLeft;

var fullRight = eRight;

var fullTop = eTop;

var fullBottom = eBottom;



// map size . . . dynamically updated

var iWidth = 630;

var iHeight = 512;

// location map size . . . dynamically updated

var i2Width = 150;

var i2Height = 120;



var imageLimitLeft = limitLeft;

var imageLimitTop = limitTop;

var imageLimitRight = limitRight;

var imageLimitBottom = limitBottom;



var appDir = "";



var xDistance = Math.abs(eRight-eLeft);

var yDistance = Math.abs(eTop-eBottom);

var panX = xDistance * panFactor;

var panY = yDistance * panFactor;

var pixelX = xDistance/iWidth;

var pixelY = yDistance/iHeight;

var mapX = eLeft;

var mapY = eTop;

var lastLeft = eLeft;

var lastRight = eRight;

var lastTop = eTop;

var lastBottom = eBottom;

var fullOVLeft = eLeft;

var fullOVRight = eRight;

var fullOVTop = eTop;

var fullOVBottom = eBottom;

var theCursor = "crosshair";

var canLoad=false;

//if (imsURL!="") canLoad=false;



var fullWidth = Math.abs(fullRight - fullLeft);

var fullHeight = Math.abs(fullTop - fullBottom);

var fullOVWidth = Math.abs(fullOVRight - fullOVLeft);

var fullOVHeight = Math.abs(fullOVTop - fullOVBottom);

var mapScaleFactor = xDistance / iWidth;



var geocodeX = 0;

var geocodeY = 0;

var showGeocode = false;

var geocodeLabel = "";



var queryZoom=false;



var sQuote = "'";

var dQuote = '"';



var toolMode = 1;

var legendVisible=false;

// set legend visible at service load... showTOC=false & hasTOC=true

if ((hasTOC) && (!showTOC)) legendVisible=true;



MapUnits = MapUnits.toUpperCase();

ScaleBarUnits = ScaleBarUnits.toUpperCase();



// save the extent 

function saveLastExtent() {

	lastLeft = eLeft;

	lastRight = eRight;

	lastTop = eTop;

	lastBottom = eBottom;

}



// zoom out to full extent

function fullExtent() {

/*
if (showXML == true) {
  alert("fullExtent() is running");
}
*/

   if( doFastStart ) {
	XMLMode = 1;
	processXML( fastStartMap );
   } else {

/*
if (showXML == true) {
  alert("2");
}
*/
	
	if (aimsDHTMLPresent) moveLayer("theMap",hspc,vspc);

	window.scrollTo(0,0);

	saveLastExtent();

	eLeft = fullLeft;

	eRight = fullRight;

	eTop = fullTop;

	eBottom = fullBottom;

	//var theString = writeXML();

	sendMapXML();

   }

}



function startExtent() {

	if (aimsDHTMLPresent) moveLayer("theMap",hspc,vspc);

	window.scrollTo(0,0);

	saveLastExtent();

	eLeft = startLeft;

	eRight = startRight;

	eTop = startTop;

	eBottom = startBottom;

	//var theString = writeXML();

	sendMapXML();

}



// zoom back to last extent

function zoomBack() {

	if (aimsDHTMLPresent) moveLayer("theMap",hspc,vspc);

	var left1 = eLeft;

	var right1 = eRight;

	var top1 = eTop;

	var bottom1 = eBottom;

	eLeft = lastLeft;

	eRight = lastRight;

	eTop = lastTop;

	eBottom = lastBottom;

	lastLeft = left1;

	lastRight = right1;

	lastTop = top1;

	lastBottom = bottom1;

	//var theString = writeXML();

	sendMapXML();	

}



function zoomToPoint(xIn, yIn, drawIt,theLabel) {

	//alert(xIn + "," + yIn);

	var mWMargin = 0;

	var mHMargin = 0;

	//mWMargin = Math.abs(fullRight-fullLeft) * selectPointMargin;

	//mHMargin = Math.abs(fullTop-fullBottom) * selectPointMargin;

	mWMargin = Math.abs(limitRight-limitLeft) * selectPointMargin;

	mHMargin = Math.abs(limitTop-limitBottom) * selectPointMargin;

	//alert(mWMargin + "," + mHMargin);

	saveLastExtent();

	eLeft = xIn - mWMargin;

	eRight = xIn + mWMargin;

	eTop = yIn + mHMargin;

	eBottom = yIn - mHMargin;

	if (drawIt) {

		showGeocode=true;

		geocodeX=xIn;

		geocodeY=yIn;

		geocodeLabel=theLabel;

	}

	sendMapXML();

}



function zoomToEnvelope(minXin,minYin,maxXin,maxYin) {

	//alert(minXin + ", " + minYin + ", " + maxXin + ", " + maxYin)

	saveLastExtent();

	eLeft=minXin;

	eBottom=minYin;

	eRight=maxXin;

	eTop=maxYin;

	//alert("Left:" + minXin + "\nTop:" + maxYin + "\nRight:" + maxXin + "\nBottom:" + minYin);

	sendMapXML()

	

}



// zoom to center of fullextent at set scale

function zoomScale(inScale) {

	// inScale is scale factor where 1.0 = 100% of fullWidth and fullHeight

	var halfWidth = fullWidth / 2;

	var halfHeight = fullHeight / 2

	var midX = eRight - (xDistance / 2);

	var midY = eTop - (yDistance / 2);

	var newWidth = halfWidth * inScale;

	var newHeight = halfHeight * inScale;

	saveLastExtent();

	eLeft = midX - newWidth;

	eRight = midX + newWidth;

	eTop = midY + newHeight;

	eBottom = midY - newHeight;

	sendMapXML();

	

}



// get URLs and extents from URL

function getCommandLineParams(cmdString) {

	// Parse out from URL querystring parameters 

	// to pass to the viewer.

	// Syntax:

	// Host=Hostmachine					name of Host, if not default

	// Service=MapService				name of MapService, if not default

	// OVMap=OvMapService				name of Overview MapService, if not default

	// Box=minX:minY:maxX:maxY			extent to be displayed

	// Layers=0101101					visible layers,starting from topmost: 0=not visible;1=visible

	// ActiveLayer=layerIndex			index of layer to be active, if not default

	// Query=queryExpression			query expression to be send on load - expression must be escaped in URL

	// QueryZoom=Yes					zoom to above query?

	// StartLeft,StartTop,

	// StartRight,StartBottom			starting coords - alternative to Box

	// LimitLeft,LimitTop,

	// LimitRight,LimitBottom			limit coords

	//

	//

	setLayerVisible.length=0;

	var cmdString2 = cmdString.toUpperCase();

	var startpos = 0;

	var endpos = 0;

	var pos = cmdString2.indexOf("HOST=");

	if (pos!=-1) {

		startpos = pos + 5;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		hostName = cmdString.substring(startpos,endpos);

		serverURL  = "http://" + hostName + "/deqarcims/ims?ServiceName=";

	}

	pos = cmdString2.indexOf("SERVICE="); // formally was MAPSERVICE=

	if (pos!=-1) {

		startpos = pos + 8;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;
		
		theMapService = cmdString.substring(startpos,endpos);
//alert(theMapService);
		imsURL = serverURL + theMapService;
	

	}

	pos = cmdString2.indexOf("OVMAP="); // formally was OVMAPSERVICE=

	if (pos!=-1) {

		startpos = pos + 6;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		imsOVURL = serverURL + cmdString.substring(startpos,endpos);

	}

	pos = cmdString2.indexOf("BOX=");

	if (pos!=-1) {

		startpos = pos + 4;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		var boxString = cmdString.substring(startpos,endpos);

		//alert(boxString);

		var xyBox = boxString.split(":");

		if (xyBox.length==4) {

			startLeft = parseFloat(xyBox[0]);

			startBottom = parseFloat(xyBox[1]);

			startRight = parseFloat(xyBox[2]);

			startTop = parseFloat(xyBox[3]);

			eLeft=startLeft;

			eBottom=startBottom;

			eRight=startRight;

			eTop = startTop;

		}

		//xyBox=null;

	}

	pos = cmdString2.indexOf("MAXRECT=");

	if (pos!=-1) {

		startpos = pos + 8;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		var boxString = cmdString.substring(startpos,endpos);

		//alert(boxString);

		var xyBox = boxString.split(":");

		if (xyBox.length==4) {

			limitLeft = xyBox[0];

			limitBottom = xyBox[1];

			limitRight = xyBox[2];

			limitTop = xyBox[3];

		}

		//xyBox=null;

	}

	if (aimsLayersPresent) {

		// you need to have aimsLayers.js loaded

		pos = cmdString2.indexOf("LAYERS=");

		if (pos!=-1) {

			startpos = pos + 7;

			endpos = cmdString.indexOf("&",startpos);

			if (endpos==-1) endpos = cmdString.length;

			var layers = cmdString.substring(startpos,endpos);

			//"0" means the layer should be turned off, and "1" means

			//the layer should be visible.  For example, "1001" means there

			//are 4 layers.  The first and last layer are visible, and the

			//middle two layers are turned off. The first number represents

			//the top-most layer.

			

			//Parse the layers string

			var numLayers=layers.length;

			icount=0;

			//alert(layers);

			while (icount<=numLayers-1) {

			  onoff=layers.substring(icount,icount+1);

			  if (onoff=='0') {

			  	setLayerVisible[icount]=false;

			  }

			  else if (onoff=='1') {

			    setLayerVisible[icount]=true;

			  }

			  icount=icount+1;

			}

			layers="";

		}

		

		pos = cmdString2.indexOf("ACTIVELAYER=");

		if (pos!=-1) {

			startpos = pos + 12;

			endpos = cmdString.indexOf("&",startpos);

			if (endpos==-1) endpos = cmdString.length;

			var actlyr = cmdString.substring(startpos,endpos);

			//alert(actlyr);

			ActiveLayerIndex = parseInt(actlyr);

			selectType = LayerType[ActiveLayerIndex];	

			actlyr = "";

		}	

		if (aimsQueryPresent) {

			// you need to have aimsQuery.js loaded

			pos = cmdString2.indexOf("QUERY=");

			if (pos!=-1) {

				startpos = pos + 6;

				endpos = cmdString.indexOf("&",startpos);

				if (endpos==-1) endpos = cmdString.length;

				var escQuery = cmdString.substring(startpos,endpos);

				escQuery = replacePlus(escQuery);

				escQuery = unescape(escQuery);

				highlightedOne = makeXMLsafe(escQuery);

				escQuery="";

			}	

			if (highlightedOne!="") {

				pos = cmdString2.indexOf("QUERYZOOM=YES");

				if (pos!=-1) queryZoom = true;

			}

		}

	}

	

	pos = cmdString2.indexOf("STARTLEFT=");

	if (pos!=-1) {

		startpos = pos + 10;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		startLeft = cmdString.substring(startpos,endpos);

	}

	pos = cmdString2.indexOf("STARTTOP=");

	if (pos!=-1) {

		startpos = pos + 9;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		startTop = cmdString.substring(startpos,endpos);

	}

	pos = cmdString2.indexOf("STARTRIGHT=");

	if (pos!=-1) {

		startpos = pos + 11;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		startRight = cmdString.substring(startpos,endpos);

	}

	pos = cmdString2.indexOf("STARTBOTTOM=");

	if (pos!=-1) {

		startpos = pos + 12;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		startBottom = cmdString.substring(startpos,endpos);

	}

	pos = cmdString2.indexOf("LIMITLEFT=");

	if (pos!=-1) {

		startpos = pos + 10;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		limitLeft = cmdString.substring(startpos,endpos);

	}

	pos = cmdString2.indexOf("LIMITTOP=");

	if (pos!=-1) {

		startpos = pos + 9;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		limitTop = cmdString.substring(startpos,endpos);

	}

	pos = cmdString2.indexOf("LIMITRIGHT=");

	if (pos!=-1) {

		startpos = pos + 11;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		limitRight = cmdString.substring(startpos,endpos);

	}

	pos = cmdString2.indexOf("LIMITBOTTOM=");

	if (pos!=-1) {

		startpos = pos + 12;

		endpos = cmdString.indexOf("&",startpos);

		if (endpos==-1) endpos = cmdString.length;

		limitBottom = cmdString.substring(startpos,endpos);

	}

	pos = cmdString2.indexOf("EXTENT=AUTO");

	if (pos!=-1) {

		startLeft=0;

		startRight=0;

		startTop=0;

		startBottom=0;

		limitLeft=0;

		limitRight=0;

		limitTop=0;

		limitBottom=0;

		getStartingExtent=true;

		getLimitExtent=true;

	}

	

	//alert("imsURL=" + imsURL + "\nimsOVURL=" + imsOVURL);

	if (imsURL!="") {

		imsQueryURL= imsURL + "&CustomService=Query";

		imsGeocodeURL = imsURL + "&CustomService=Geocode";

		//canLoad=false;

	} 

	// if starting extents zero'd then flag to get start from mapservice

	if ((startLeft!=0) && (startRight!=0)) getStartingExtent=false;

	// if limit extents zero'd then flag to get max from mapservice

	if ((limitLeft!=0) && (limitRight!=0)) {

		getLimitExtent=false;

		enforceFullExtent=true;

	}

}



// get directory path of URL

function getPath(theFullPath) {

	var theSlash = theFullPath.lastIndexOf("/");

	var theDir = theFullPath.substring(0,theSlash);

	if (theDir==null) theDir="";

	theDir = theDir + "/";

	return theDir;



}



// check for existance of layer

function hasLayer(name) {

	var result = false;

	if (isNav4) {

		if (document.layers[name]!=null) result=true;

	}  else if (isIE) {

		if (eval('document.all.' + name)!=null) result=true;

	} else if (isNav) {

		var theElements = document.getElementsByTagName("DIV");

		var theObj;

		var j = -1;

		for (i=0;i<theElements.length;i++) {

			if (theElements[i].id==name) result=true;

		}

    }

	return result;

}



// put up the "RetriveData" image

function showRetrieveData() {

	if (hasLayer("LoadData")) {

		showLayer("LoadData");

	}

}



// hide the "RetriveData" image

function hideRetrieveData() {

	if (hasLayer("LoadData")) {

		hideLayer("LoadData");

	}

}



// put up the "RetriveMap" image

function showRetrieveMap() {

	if (hasLayer("LoadMap")) {

		showLayer("LoadMap");

	}

}



// hide the "RetriveMap" image

function hideRetrieveMap() {

	if (hasLayer("LoadMap")) {

		hideLayer("LoadMap");

	}

}



/*  *****************************************************

*	Various Distance Conversion Functions

*	*****************************************************

*/



// get scale bar distance

function getScaleBarDistance() {

	// get distance from left and right values in map units

	// convert to ScaleBar units then clip to ScaleBar size

	

	// Note: decimal are not hard coded to allow use with locales using commas instead of points.

	var mUnits = MapUnits;

	var mDistance = eRight - eLeft;

	var sbDistance = 0

	if (MapUnits=="DEGREES") {

		// if DEGREES then convert to feet

			// first get mid y point

		var midY = eBottom + (eTop-eBottom)/2;

		var tempL = eLeft;

		var tempR = eRight;

		if (tempL<-180) tempL = (-1799999 /10000);

		if (tempR>180) tempL = (1799999/10000);

		var Lon1 = tempL * Math.PI / 180;

		var Lon2 = tempR * Math.PI / 180;

		var Lat1 = midY * Math.PI / 180;

		var Lat2 = midY * Math.PI / 180;

		var LonDist = Math.abs(Lon2-Lon1);

		var LatDist = Math.abs(Lat1-Lat2);

		var A = Math.pow(Math.sin(LatDist / 2),2) + Math.cos(Lat1) * Math.cos(Lat2) * Math.pow(Math.sin(LonDist /2),2);

		//var A = Math.cos(Lat1) * Math.cos(Lat2) * Math.pow(Math.sin(LonDist /2),2);

		var C = 2 * Math.asin(Math.min(1, Math.sqrt(A)));

		var D = (3963 - 13 * Math.sin((Lat1 + Lat2) / 2)) * C

		

		mDistance = D * 5280;

		mUnits = "FEET";

	}

	if (mUnits != ScaleBarUnits) {

		theDist = mDistance

		mDistance = convertUnits(theDist,mUnits,ScaleBarUnits);

	}

	

	sbDistance = mDistance/5;

	// /*

	var num1 = 0;

	var num2 = sbDistance;

	if (sbDistance>10000000) {

		num1 = parseInt(sbDistance/5000000);

		num2 = num1 * 5000000;

	} else if (sbDistance>1000000) {

		num1 = parseInt(sbDistance/500000);

		num2 = num1 * 500000;

	} else if (sbDistance>100000) {

		num1 = parseInt(sbDistance/50000);

		num2 = num1 * 50000;

	} else if (sbDistance>10000) {

		num1 = parseInt(sbDistance/5000);

		num2 = num1 * 5000;

	} else if (sbDistance>1000) {

		num1 = parseInt(sbDistance/500);

		num2 = num1 * 500;

	} else if (sbDistance>100) {

		num1 = parseInt(sbDistance/50);

		num2 = num1 * 50;

	} else if (sbDistance>10) {

		num1 = parseInt(sbDistance/5);

		num2 = num1 * 5;

	} else if (sbDistance>1) {

		num1 = parseInt(sbDistance/(25/100));

		num2 = num1 * (25/100);

	} else if (sbDistance>0.1) {

		num1 = parseInt(sbDistance/(25/1000));

		num2 = num1 * (25/1000);

	}

	sbDistance = num2;

	// */

	if (sbDistance > 2) {

		ScaleBarPrecision = "0";

	} else if (sbDistance > 1) {

		ScaleBarPrecision = "1";

	} else if (sbDistance > 1/10) {

		ScaleBarPrecision = "2";

	} else if (sbDistance > 1/100) {

		ScaleBarPrecision = "3";

	} else {

		ScaleBarPrecision = "4";

	}

	

	//alert(mDistance);

	return sbDistance;

}



// calculate distance to current scalebarunits

function calcDistance(mX,mY) {

	// Note: decimal are not hard coded to allow use with locales using commas instead of points.

	if (clickCount>0) {

		var mUnits = MapUnits;

		var mDistance = 0;

		var p = clickCount-1;

		var Lon1 = clickPointX[p] * Math.PI / 180;

		var Lon2 = mX * Math.PI / 180;

		var Lat1 = clickPointY[p] * Math.PI / 180;

		var Lat2 = mY * Math.PI / 180;

		//var LonDist = Math.abs(Lon1-Lon2);

		//var LatDist = Math.abs(Lat1-Lat2);

		var LonDist = Lon1-Lon2;

		var LatDist = Lat1-Lat2;

		if (MapUnits=="DEGREES") {

			//var Lon1 = clickPointX[p] * Math.PI / 180;

			//var Lon2 = mX * Math.PI / 180;

			//var Lat1 = clickPointY[p] * Math.PI / 180;

			//var Lat2 = mY * Math.PI / 180;

			//var LonDist = Math.abs(Lon1-Lon2);

			//var LatDist = Math.abs(Lat1-Lat2);

			var A = Math.pow(Math.sin(LatDist / 2),2) + Math.cos(Lat1) * Math.cos(Lat2) * Math.pow(Math.sin(LonDist /2),2);

			//var A = Math.cos(Lat1) * Math.cos(Lat2) * Math.pow(Math.sin(LonDist /2),2);

			var C = 2 * Math.asin(Math.min(1, Math.sqrt(A)));

			var D = (3963 - 13 * Math.sin((Lat1 + Lat2) / 2)) * C

			mDistance = D * 5280;

			mUnits = "FEET";

		} else {

			var xD = Math.abs(mX - clickPointX[p]);

			var yD = Math.abs(mY - clickPointY[p]);

			mDistance = Math.sqrt(Math.pow(xD,2) + Math.pow(yD,2));

		}

		

		var theDist = convertUnits(mDistance,mUnits,ScaleBarUnits);

		var u = Math.pow(10,numDecimals);

		currentMeasure = parseInt(theDist*u+(5/10))/u;

		

		updateMeasureBox();

		

	}

}



// convert the amounts to new units

function convertUnits(theDist1,mUnits,sUnits) {

	// Note: decimal are not hard coded to allow use with locales using commas instead of points.	

	var theDist = parseFloat(theDist1);

	var mDistance = theDist;

	//alert(theDist);

	if (mUnits == "FEET") {

		if (sUnits=="MILES") {

			mDistance = theDist / 5280;

		} else if (sUnits == "METERS") {

			mDistance = theDist * (3048/10000);

		} else if (sUnits == "KILOMETERS") {

			mDistance = theDist * (3048/10000000);

		}

	} else {

		if (sUnits=="MILES") {

			mDistance = theDist * (6213711922/10000000000000);

		} else if (sUnits == "FEET") {

			mDistance = theDist * (3280839895/1000000000);

		} else if (sUnits == "KILOMETERS") {

			mDistance = theDist / 1000;

		}

	}

	var u = Math.pow(10,numDecimals);

	//alert(u);

	if (!isNav) mDistance = parseInt(mDistance * u + (5/10)) / u

	//alert(mDistance);

	return mDistance;

}



// set new map extent 

function setExtent(newLeft, newTop, newRight, newBottom) {

	eLeft = newLeft;

	eTop = newTop;

	eRight = newRight;

	eBottom = newBottom;

}



//  set new full extent 

function setFullExtent(maxLeft, maxTop, maxRight, maxBottom) {

	fullLeft = maxLeft;

	fullTop = maxTop;

	fullRight = maxRight;

	fullBottom = maxBottom;

	fullWidth = Math.abs(fullRight-fullLeft);

	fullHeight = Math.abs(fullTop-fullBottom);

}



function beforeMapRefresh() {

 // add any code for checking parameters before map update

 // called by sendXML() before writing XML request

 //alert("Yup. It works.[1]");

}

 

function afterMapRefresh() {

 // add any code for checking parameters after map update

 // called by processXML() if XMMmode=1 after image and extent is updated

 //alert("Yup. It works.[1]"); 

}	



// zoom using button.

//		zoomType: 1=in; 2=out

function zoomButton(zoomType) {

	saveLastExtent();

	if (zoomType == 1) {

		// zoom in

		eLeft = eLeft + (xHalf/2);

		eRight = eRight - (xHalf/2);

		eTop = eTop - (yHalf/2);

		eBottom = eBottom + (yHalf/2);

	}

	else {

		// zoom out

		eLeft = eLeft - xHalf;

		eRight = eRight + xHalf;

		eTop = eTop + yHalf;

		eBottom = eBottom - yHalf;

	}

	checkFullExtent();

	//var theString = writeXML();

	sendMapXML();

}



// pan using arrow buttons

function panButton(panType) {

	//alert("Left:" + left + "\nTop:" + top + "\nRight:" + right + "\nBottom:" + bottom + "\nWidth:" + xDistance + "\nHeight:" + yDistance + "\nPanX:" + panX + "\nPanY:" + panY);

	saveLastExtent();

	xDistance = Math.abs(eRight-eLeft);

	yDistance = Math.abs(eTop-eBottom);

	panX = xDistance * panFactor;

	panY = yDistance * panFactor;

	switch(panType) {

	//if (panType == 1) {

	case 1:

		//west

		eLeft = eLeft - panX;

		eRight = eLeft + xDistance;

		break

	case 2:

		// north

		eTop = eTop + panY;

		eBottom = eTop - yDistance;

		break

	case 3:

		// east

		eRight = eRight + panX;

		eLeft = eRight - xDistance;

		break

	case 4:

		// south

		eBottom = eBottom - panY;

		eTop = eBottom + yDistance;

		break

	case 5:

		// southwest

		eTop = eTop - panY;

		eLeft = eLeft - panX;

		eBottom = eTop - yDistance;

		eRight = eLeft + xDistance;

		break

	case 6:

		// northwest

		eTop = eTop + panY;

		eLeft = eLeft - panX;

		eBottom = eTop - yDistance;

		eRight = eLeft + xDistance;

		break

	case 7:

		// northeast

		eTop = eTop + panY;

		eLeft = eLeft + panX;

		eBottom = eTop - yDistance;

		eRight = eLeft + xDistance;

		break

	case 8:

		// southeast

		eTop = eTop - panY;

		eLeft = eLeft + panX;

		eBottom = eTop - yDistance;

		eRight = eLeft + xDistance;

	}

	checkFullExtent();

	//alert("Left:" + left + "\nTop:" + top + "\nRight:" + right + "\nBottom:" + bottom + "\nWidth:" + xDistance + "\nHeight:" + yDistance + "\nPanX:" + panX + "\nPanY:" + panY);

	//var theString = writeXML();

	sendMapXML();

	

}



function checkFullExtent() {

	if (xDistance>fullWidth) xDistance = fullWidth;

	if (yDistance>fullHeight) yDistance = fullHeight;

	if (enforceFullExtent) {

		if (eLeft < limitLeft) {

			eLeft = limitLeft;

			eRight = eLeft + xDistance;

		}

		if (eTop > imageLimitTop) {

			eTop = imageLimitTop;	

			eBottom = eTop - yDistance;

		}	

		if (eRight > imageLimitRight) {

			eRight = imageLimitRight;

			eLeft = eRight - xDistance;

		}

		if (eBottom < imageLimitBottom) {

			eBottom = imageLimitBottom;	

			eTop = eBottom + yDistance;

		}	

	}



}



