// aimsCustom.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*		dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js, aimsMap.js,
*		aimsLayers.js, aimsDHTML.js
*		aimsClick.js, aimsNavigation.js,
*/

// global variables
	aimsCustomPresent=true;
	// change these to send XML response to custom function.
	// use numbers >= 1000 and match in useCustomFunction()
	// defaults are defined in aimsXML.js and use standard functions
	
	// xml response mode for selection
	selectXMLMode = 6;
	// xml response mode for identify
	identifyXMLMode = 7;
	// xml response mode for query
	queryXMLMode = 8;
	// xml response mode for find
	findXMLMode = 14;
	// xml response mode hyperlink
	hyperlinkXMLMode = 15;
	// xml mode for finding Claims
	claimsXMLMode = 1000;
	// xml mode for finding Alienations
	alienationsXMLMode = 1001;
	// xml mode for finding Dispositions
	dispositionsXMLMode = 1002;
	// xml mode for finding UTM co-ords
	utmCoordsXMLMode = 1003;
	// xml mode for search button
	searchXMLMode = 1004;

	var fullOVLeftHolder = fullOVLeft;
	var fullOVRightHolder = fullOVRight;
	var fullOVTopHolder = fullOVTop;
	var fullOVBottomHolder = fullOVBottom;

	var plotLeft = 0.0;
	var plotRight = 0.0;
	var plotTop = 0.0;
	var plotBottom = 0.0;
	var plotZoneId = "";
	var plotExtFlag = false;
	var plotOutlineFlag = false;

	var overviewThreshold = 20000;
	var overviewHeight = 15000;
	var fullOVMap = true;
	var extractMapService = "mndm_extract";

// custom function for handling clicks 
// 		flow redirected here when
//		toolMode set to >=1000
function customMapTool(e) {
				
				if (toolMode == 1000) {
					identifyCustom("Claims");
				}
				if (toolMode == 1001) {
					identifyCustom("Alienations")	
				}
				if (toolMode == 1002) {
					identifyCustom("Dispositions")
				}
				if (toolMode == 1003) {
					displayUTM();
				}
}

// send  XML response to custom function
//		flow  redirected here when
//		XMLMode >=1000
function useCustomFunction(theReply) {
		switch(XMLMode){

		case 1000:
			doIdentifyCustom(theReply, "Claims");
			break

		case 1001:
			doIdentifyCustom(theReply, "Alienations");
			break

		case 1002:
			doIdentifyCustom(theReply, "Dispositions");
			break

		case 1003:	// not implemented
			break

		case 1004:	// not implemented yet!
			getXYs(theReply);
			zoomToEnvelope(eLeft-xHalf, eBottom-yHalf, eRight+xHalf, eTop+yHalf);
			break

		case 2001:
			theUrl = getURL(theReply);
			if (theUrl == ""){
				alert("Extraction Failed");
			} else {
				parent.ExtractFrame.location = theUrl;
			}
			break

		default:
			alert(msgList[55] + XMLMode + msgList[56]);

		}
	hideLayer("LoadData");
}

// add custom stuff to Map XML request. . . between selection and geocode
function addCustomToMap1(){
	var customString = "";
	if (clickCount>0) {
		// draw click points and lines between them on map
		var clickColor = selectColor;
		if (clickType==1) clickColor = clickMarkerColor;
		customString += '<LAYER type="acetate" name="allTheClicks">\n';
		for (var i=0;i<clickCount;i++) {
			customString += '<OBJECT units="acetate">\n<POINT coords="' + forceComma(clickPointX[i]) + coordsDelimiter + forceComma(clickPointY[i]) + '">\n';
			customString += '<SIMPLEMARKERSYMBOL  type="' + clickMarkerType + '"';
			customString += ' color="' + clickMarkerColor + '" width="' + clickMarkerSize + '" />\n</POINT>\n</OBJECT>\n';
		}
		customString += '</LAYER>\n';
	}
  return customString;
}

// add custom stuff to Map XML request. . . between clickpoints and copyright
function addCustomToMap2(){
	var customString = "";	
	 return customString;
}

// add custom stuff to Map XML request. . . under modeOnMap
function addCustomToMap3(){
  var customString = "";
	return customString;
}

// add custom stuff to Map XML request. . . on top of everything
function addCustomToMap4(){
	var customString = "";
    
	if (plotOutlineFlag)
	{
		customString += '<LAYER type="acetate" name="acetate" id="acetate">\n';
		customString += '<OBJECT units="database">\n';
		customString += '<COORDSYS id="' + plotZoneId + '"/>\n';
		customString += '<DENSIFY tolerance="20"/>\n';
		customString += '<POLYGON coords="' + plotLeft + ' ' + plotBottom + ';';
		customString +=  plotLeft + ' ' + plotTop + ";";
		customString +=  plotRight + ' ' + plotTop + ";";
		customString +=  plotRight + ' ' + plotBottom + '">';
		customString += '<SIMPLEPOLYGONSYMBOL boundarycolor="255,0,0" boundarywidth="3" filltransparency="0.0"  />\n';
		customString += '</POLYGON></OBJECT></LAYER>\n';
		plotOutlineFlag = false;
	}
  	
	return customString;
}

// extract layers to download - Code by JDO 
function extractIt(blnUTM) {
	hideLayer("measureBox");
	var extractURL = serverURL + extractMapService + "&CustomService=extract";
	var XMLRequest = writeExtractXML(blnUTM);
	showLayer("LoadData");
	sendToServer(extractURL,XMLRequest,2001);
}

function setNewOVMap()
{
	//remember to change aimsXML.js line 239 to 'if (!pastStart || forceNewOVMap) {'
	
	var metersToDegrees = 111000;

	forceNewOVMap = false;
	
	if (calculateDistanceInMeters() < overviewThreshold)
	{
		forceNewOVMap = true;

		if (fullOVMap == true)
		{
			fullOVLeftHolder = fullOVLeft;
			fullOVRightHolder = fullOVRight;
			fullOVTopHolder = fullOVTop;
			fullOVBottomHolder = fullOVBottom;
			fullOVMap = false;
		}

		var pt = getExtentCenter();
		var ovHeightInDegrees = overviewHeight / metersToDegrees;
		var ovWidthInDegrees = ovHeightInDegrees * (i2Width / i2Height);

		fullOVLeft = pt.x - ovWidthInDegrees;
		fullOVRight = pt.x + ovWidthInDegrees;
		fullOVTop = pt.y + ovHeightInDegrees;
		fullOVBottom = pt.y - ovHeightInDegrees;

	}
	else
	{
		if (fullOVMap == false)
		{
			forceNewOVMap = true;
			fullOVMap = true;
			fullOVLeft = fullOVLeftHolder;
			fullOVRight = fullOVRightHolder;
			fullOVTop = fullOVTopHolder;
			fullOVBottom = fullOVBottomHolder;
		}
	}	
}

function getExtentCenter(){
	var centerX = eLeft + ((eRight - eLeft)/ 2.0);
	var centerY = eBottom + ((eTop - eBottom) / 2.0);
	return new point(centerX, centerY);
}

function calculateDistanceInMeters() {
	// 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 != "METERS")
	{
		theDist = mDistance
		mDistance = convertUnits(theDist,mUnits,"METERS");
	}

	return mDistance;
}

function writeExtractXML(blnUTM)
{
	var axlString = '<ARCXML version=\"1.1\">';
	axlString += '<REQUEST><GET_EXTRACT><PROPERTIES>'; 
	axlString += '<ENVELOPE minx="' + eLeft + '" miny="' + eBottom + '" maxx="' + eRight + '" maxy="' + eTop + '" />';
	if (blnUTM) {
		var intUTMZone = Math.ceil((180+(eLeft+eRight)/2)/6);
		
		axlString += '<FEATURECOORDSYS id="269' + intUTMZone + '" />';
		axlString += '<FILTERCOORDSYS id="4326" />';
	}	
	axlString += '</PROPERTIES></GET_EXTRACT></REQUEST></ARCXML>';
	return axlString;
}

function point(pointX, pointY){
	this.x = pointX;
	this.y = pointY;
}

// identify feature
function identifyCustom(layerType) {
	fID = 0;
	highlightedOne="";
	var theX = mouseX;
	var theY = mouseY;
	getMapXY(theX,theY);
	searchTolerance = (xDistance/iWidth) * pixelTolerance;
	var tempWest = mapX - searchTolerance;
	var tempNorth = mapY + searchTolerance;
	var tempEast = mapX + searchTolerance;
	var tempSouth = mapY - searchTolerance;
	idSouth = tempSouth;
	idNorth = tempNorth;
	idWest = tempWest;
	idEast = tempEast;
	replyArray.length=0;
	var j = -1;
	firstLayer = findFirstLWN(layerType);
	lastLayer = findLastLWN(layerType);
	for (var i = lastLayer; i >= firstLayer; i--) {
		replyArray[lastLayer-firstLayer-1]="";
		if ((mapScaleFactor>=LayerMinScale[i]) && (mapScaleFactor<=LayerMaxScale[i]) && (LayerVisible[i]) && (LayerIsFeature[i])) j = i;

	}
	if (j>-1) {
		fID=j;
		var theString = writeGetFeaturesDrill(tempWest,tempSouth,tempEast,tempNorth,fID);
		//if (useTextFrame) parent.TextFrame.document.location = "text.htm";
		showRetrieveData();
		switch(toolMode){

		case 1000:
			sendToServer(imsQueryURL,theString,claimsXMLMode);
			break

		case 1001:
			sendToServer(imsQueryURL,theString,alienationsXMLMode);
			break

		case 1002:
			sendToServer(imsQueryURL,theString,dispositionsXMLMode);
			break

			}
	} else {
		alert(msgList[111]);
	}
}

function doIdentifyCustom(theReply, layerType) {
  replyArray[fID-firstLayer] = theReply;
  fID++;
  if (fID <= lastLayer) {
   		if ((mapScaleFactor>=LayerMinScale[fID]) && (mapScaleFactor<=LayerMaxScale[fID]) && (LayerVisible[fID]) && (LayerIsFeature[fID])) {
      		theString = writeGetFeaturesDrill(idWest,idSouth,idEast,idNorth,fID);
		switch(toolMode){

		case 1000:
			sendToServer(imsQueryURL,theString,claimsXMLMode);
			break

		case 1001:
			sendToServer(imsQueryURL,theString,alienationsXMLMode);
			break

		case 1002:
			sendToServer(imsQueryURL,theString,dispositionsXMLMode);
			break

			}

	   	} else {
			doIdentifyCustom("");
		}
   }
   
   if (fID > lastLayer) {
		switch(toolMode){

		case 1000:
			displayData(replyArray, claimLayers);			
			break

		case 1001:
			displayData(replyArray, alienationLayers);			
			break

		case 1002:
			displayData(replyArray, dispositionLayers);			
			break

			}
   }
 }

 function trim(inputString) {
   // Removes leading and trailing spaces from the passed string. Also
   // removes consecutive spaces and replaces it with one space.
   var retValue = inputString;
   var ch = retValue.substring(0, 1);
   while (ch == " ") { // Check for spaces at the beginning of the string
      retValue = retValue.substring(1, retValue.length);
      ch = retValue.substring(0, 1);
   }
   ch = retValue.substring(retValue.length-1, retValue.length);
   while (ch == " ") { // Check for spaces at the end of the string
      retValue = retValue.substring(0, retValue.length-1);
      ch = retValue.substring(retValue.length-1, retValue.length);
   }
   return retValue; // Return the trimmed string back to the user
} // Ends the "trim" function

function displayData(theReplyArray, dispLayerInfo) {
	var Win1 = parent.TextFrame;
	var theReply = "";
	var totFeatureCount = 0;
	var totLayers = lastLayer-firstLayer;
	var theFrame = "parent.MapFrame";
	var inData;
	var startpos;

	Win1.document.open();
	Win1.document.writeln('<html><head><title>Selection Results</title>');
	Win1.document.writeln('<style type="text/css">');
	Win1.document.writeln('BODY {     scrollbar-3d-light-color:#F7EFE7;');
	Win1.document.writeln('           scrollbar-arrow-color:#006699;');
	Win1.document.writeln('           scrollbar-base-color:#CAEEFF;');
	Win1.document.writeln('           scrollbar-dark-shadow-color:#000000;');
	Win1.document.writeln('           scrollbar-face-color:#A5D7E7;');
	Win1.document.writeln('           scrollbar-highlight-color:#F7EFE7;');
	Win1.document.writeln('           scrollbar-shadow-color:black}');
	Win1.document.writeln('           .myTitle{font-size: 10pt}');
	Win1.document.writeln('           .myText{font-size: 8pt}');
	Win1.document.writeln('           .MyButton{background-color:#A5D6E7}');
	Win1.document.writeln('           .MyButton{font-family:Tahoma}');
	Win1.document.writeln('           .MyButton{font-size: 8pt}');
	Win1.document.writeln('           .MyButton{font-weight: bold}');
	Win1.document.writeln('           .MyButton{color:#006699}</style></head>');

	Win1.document.writeln('<body bgcolor="' + textFrameBackColor + '" text="#006699" link="#006699" vlink="Gray" LEFTMARGIN=0 onload="window.focus()">');
	for (var i = 0; i <= totLayers; i++){
		theReply = theReplyArray[i];
		if (theReply != "")
			{
//			alert(" Reply: " + theReply);
			endpos = 0;
			startpos = 0;
			var featureCount = justGetFeatureCount(theReply);
			totFeatureCount += featureCount
			for (var j = 0; j < featureCount; j++){
				if (j == 0){
//					Win1.document.writeln('<b><div class="myTitle"><font face="Tahoma, Helvetica, sans-serif">' + dispLayerInfo.title + '</div></font></b>');
					Win1.document.writeln('<table border=0 cellspacing=0>');
					}
				inData = parseRecordString(theReply, startpos);
				startpos = xmlEndPos;
				if (toolMode == 1001) {				//	Handling Alienations which are different from the other two cases
					var startHREF = inData.indexOf("<a href=");  // have to open up the string an cleanse it before further processing
					if (startHREF > 0) {
						var startURL = inData.indexOf("http:", startHREF);
						var endURL = inData.indexOf(">", startURL);
						var endHREF = inData.indexOf("<a/>", endURL);   // Most of the data has this incorrect end anchor tag.
						if (endHREF == -1) {								   // If the anchor tag is correct use this
							endHREF = inData.indexOf("</a>", endURL);
						}
						var theReplyStart = inData.substring(0, startHREF);
						var theReplyEnd = inData.substring(endURL+1, endHREF);
						theReplyEnd += inData.substring(endHREF+4, inData.length);  // Only take out the tag - if any punctuation after there will be a blank space in the string
						dispLayerInfo.baseURL = trim(inData.substring(startURL, endURL-1));
						nData = theReplyStart + theReplyEnd;
					}  else {
						dispLayerInfo.baseURL = "";
					}
				}

				var lookUpCode = "";
				for (var k = 0; k < dispLayerInfo.fieldLabels.length; k++) {
					var value = "";
					value = justGetFieldValue(inData, dispLayerInfo.fieldVariables[i*dispLayerInfo.fieldLabels.length+k], 0);
					if (dispLayerInfo.fieldLabels[k] == dispLayerInfo.lookUpCodeField)
					{
						lookUpCode = value;	
					}
					else if ((dispLayerInfo.fieldLabels[k] == dispLayerInfo.lookUpField) && (value == ""))
					{
						value = parent.TopFrame.getDescription(lookUpCode);
					}

					//Win1.document.writeln('<tr><td><div class="myText"><font face="Tahoma, Helvetica, sans-serif"><b>' + dispLayerInfo.fieldLabels[k] + '&nbsp;&nbsp;</b></div></font></td><td><div class="myText"><font face="Tahoma, Helvetica, sans-serif">' + justGetFieldValue(inData, dispLayerInfo.fieldVariables[i*dispLayerInfo.fieldLabels.length+k], 0) + '</div></font></td>');

					Win1.document.writeln('<tr><td><div class="myText"><font face="Tahoma, Helvetica, sans-serif"><b>' + dispLayerInfo.fieldLabels[k] + '&nbsp;&nbsp;</b></div></font></td><td><div class="myText"><font face="Tahoma, Helvetica, sans-serif">' + value + '</div></font></td>');

					

					if (dispLayerInfo.baseURL.length != 0 && dispLayerInfo.linkTitle.length != 0) {
						if (k == dispLayerInfo.fieldLabels.length-1 && dispLayerInfo.baseURL != "") {
							Win1.document.writeln('<tr valign=top><td><div class="myText"><font face="Tahoma, Helvetica, sans-serif">' + dispLayerInfo.linkTitle + '&nbsp;&nbsp;</div></font></td>');
							if (toolMode != 1001) {
								Win1.document.writeln('<td><form><input type="button" name="MCILink"  class="MyButton" value="  Link  " onclick=window.open("' + dispLayerInfo.baseURL + justGetFieldValue(inData, dispLayerInfo.fieldVariables[i*dispLayerInfo.fieldLabels.length+k], 0) + '","","width=650,height=475,toolbar=no,scrollbars=yes,menubar=yes,resizable=yes")></form></td>');
							} else {
								Win1.document.writeln('<td><form><input type="button" name="MCILink"  class="MyButton" value="  Link  " onclick=window.open("' + dispLayerInfo.baseURL + '","","width=650,height=475,toolbar=no,scrollbars=yes,menubar=yes,resizable=yes")></form></td>');
							}
						}
					Win1.document.writeln('</tr>');
					}
				}
				if (j == featureCount-1){
					Win1.document.writeln('</table>');
				}
			}			
		}
	}
	if (totFeatureCount == 0) {
		Win1.document.writeln('<b><div class="myTitle"><font face="Tahoma, Helvetica, sans-serif">No ' + dispLayerInfo.noFind + ' Found!</div></font></b><div class="myText"><font face="Tahoma, Helvetica, sans-serif">Please try again.</font></div>');
		}
	Win1.document.writeln('</body></html>');
	Win1.document.close();
	Win1 = null;
	hideRetrieveData();
}

function displayUTM(){
	var Win1 = parent.TextFrame;

	getMapXY(mouseX, mouseY);
	Win1.document.open();
	//Win1.document.location='http://torgwoodmansey/website/ClaimapsIII/LatLongtoUTM.htm?lon=' + mapX + '&lat=' + mapY
	//alert(arcimsWebsiteURL);
	Win1.document.location = arcimsWebsiteURL + '/LatLongtoUTM.htm?lon=' + mapX + '&lat=' + mapY;
	Win1.document.close(); 
	Win1=null;

	if (blnUTMDot)	{
	  legendTemp=legendVisible;
	  legendVisible=false;
	  clickPointX[clickCount]=mapX;
	  clickPointY[clickCount]=mapY;
	  clickCount += 1;
	  var theString = writeXML();
	  var theNum = 99;
	  sendToServer(imsURL,theString,theNum);
  }
}

function getCustomFind(theValue, theField) {
	//alert(theValue);
	selectCount=0;
	showBuffer=false;
	highlightedOne="";
	selectPoints.length=0;
	selectLeft.length=0;
	selectRight.length=0;
	selectTop.length=0;
	selectBottom.length=0;
	drawSelectBoundary=false;
	showGeocode=false;
	clickCount=0;
	totalMeasure=0;
	currentMeasure=0;
	selectionMode=1;
	var theNewQueryString = "";
	var theTempString = "";
	var fieldListString = LayerIDField[ActiveLayerIndex] + " " + LayerShapeField[ActiveLayerIndex];
	var elemCount = 0;
	theNewQueryString = "(" + theField + " = '" + theValue + "')"
	for (var i=0;i<LayerFields.length;i++) {
		if (LayerFieldType[i].indexOf("12",0)!=-1) {
			if (elemCount>0) theTempString = " OR " + theTempString;
			if (theNewQueryString.length + theTempString.length < 1024) {
				fieldListString = fieldListString + " " + LayerFields[i];
				elemCount += 1;
			}
			
		}
	}
	if (theNewQueryString!="") {
		showRetrieveData();
		showBuffer=false;
		theNewQueryString=makeXMLsafe(theNewQueryString);
		setQueryString = theNewQueryString;
		var theString = writeFindRequest(theNewQueryString,fieldListString);
		sendToServer(imsQueryURL,theString,searchXMLMode);
	} else {
		alert(msgList[80]);
	}
}

function plotCurrentExtent(dpi,size)
{
	var url = "?cmd=envelope&size=" + size;
	url += "&minx=" + eLeft + "&miny=" + eBottom + "&maxx=" + eRight + "&maxy=" + eTop + "&dpi=" + dpi;
	getPlot(url);
}

function plotAtScale(xy,scale,dpi,units,size)
{
	var url = "?cmd=point&size=" + size;
	url += "&x=" + xy[0] + "&y=" + xy[1] + "&projection=" + xy[2] + "&units=" + units;
	url += "&scale=" + scale + "&dpi=" + dpi;
	getPlot(url);	
}

function getPlot(url)
{
	//var ploturl = "http://" + hostName + "/claimaps/servlet/MapPlot" + url;
	var ploturl = arcimsWebsiteURL + "/MapPlotFrame.htm" + url;
	//var ploturl = javaApplicationURL + "/servlet/MapPlot" + url;
	//alert(ploturl);
	var win = window.open(ploturl,"","menubar,scrollbars,status,resizable,height=400,width=500");
}

function drawMapWithPlotExtent(pLeft,pRight,pTop,pBottom,id)
{
	plotLeft = pLeft;
	plotRight = pRight;
	plotTop = pTop;
	plotBottom = pBottom;
	plotZoneId = id;
	plotExtFlag = true;
	plotOutlineFlag = true;

	var xMapOffset = ((plotRight - plotLeft) * 0.1) / 2;
	var yMapOffset = ((plotTop - plotBottom) * 0.1) / 2;
	eLeft = plotLeft - xMapOffset;
	eRight = plotRight + xMapOffset;
	eBottom = plotBottom - yMapOffset;
	eTop = plotTop + yMapOffset;

	sendMapXML();
}

function showPlotExtent(pWidth, pHeight, pScale)
{
	var mapWidthUnits = eRight - eLeft;
	var midX = eLeft + ((eRight - eLeft)/2);
	var midY = eBottom + ((eTop - eBottom)/2);
	var mapWidthIn = getMapWidthInUnits("FEET") * 12;
	var mapScale = mapWidthIn / pWidth;
	var newMapWidth = mapWidthUnits * (pScale / mapScale);
	
	//get the plots approximate extent
	var xPlotOffset = newMapWidth / 2;
	plotLeft = midX - xPlotOffset;
	plotRight = midX + xPlotOffset;
	var newMapHeight = (pHeight / pWidth) * newMapWidth;
	var yPlotOffset = newMapHeight / 2;
	plotBottom = midY - yPlotOffset;
	plotTop = midY + yPlotOffset;

	//add 5% to the map and redraw the map
	var xMapOffset = (newMapWidth * 1.05) / 2;
	eLeft = midX - xMapOffset;
	eRight = midX + xMapOffset;
	var yMapOffset = (newMapHeight * 1.05) / 2;
	eBottom = midY - yMapOffset;
	eTop = midY + yMapOffset;
	plotExtFlag = true;
	plotOutlineFlag = true;

	sendMapXML();
}	

function getMapCenterX()
{
	return eLeft + ((eRight - eLeft)/2);
}

function getMapCenterY()
{
	return eBottom + ((eTop - eBottom)/2);
}

function getMapWidthInUnits(units) {
	// 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 != units) {
		theDist = mDistance
		mDistance = convertUnits(theDist,mUnits,units);
	}

	return mDistance;
}

function addCustomPropertiesToMap()
{
	var customString = "";
	customString += '<FEATURECOORDSYS id="4269"/>';
	if (plotExtFlag)
	{
		customString += '<FEATURECOORDSYS id="4269"/>';
		//customString += '<FEATURECOORDSYS id="' + plotZoneId + '"/>';
		customString += '<FILTERCOORDSYS id="' + plotZoneId + '"/>';
		plotExtFlag = false;
	}
	return customString;
}


