var passstring="";
var numPoints = 0;


function isLandsviewer() {
  
  return false;
}




function ResizeMap(x,y,z) {
	//alert("resize");

	if (x!='-1' && y!='-1' )
		parent.document.body.cols = x + ',' + y + ',0,0';   

	if (z!='-1') {
		var odoc = parent.top.document.getElementById("leftframe");
		odoc.rows='55,*,' + z ;
	}

	parent.parent.MapFrame.reloadMap();
}

function convertLatLontoUTM(lat, lon){
  var utmE, utmN, zone, zoneLetter;
  var xy = new Array(2);
  
  if (lon == "" || lat == "")
    return "";
  
  zone = Math.floor((parseFloat(lon) + 180.0) / 6) + 1;
  LatLonToUTMXY(DegToRad(lat), DegToRad(lon), zone, xy);
  utmE = xy[0].toFixed(2);
  utmN = xy[1].toFixed(2);
  
  zoneLetter = getZoneLetter(lat);
  
  return "N:" + utmN + ", E:" + utmE + ", Zone: " + zone + zoneLetter;
}

function getZoneLetter(lat) {
	if (lat == "" || lat == null) return "";
	lat = parseFloat(lat);
	if (lat >= 16 && lat < 24) return "Q";
	if (lat >= 24 && lat < 32) return "R";
	if (lat >= 32 && lat < 40) return "S";
	if (lat >= 40 && lat < 48) return "T";
	if (lat >=48 && lat < 56) return "U";
	if (lat >=56 && lat < 64) return "V";
	if (lat >=64 && lat < 72) return "W";
	if (lat >=72 && lat < 84) return "X";
	return "";
}

function displayXY(xx,yy) {
  var u = Math.pow(10,6);  
  var usf = Math.pow(10,6);
  var uX = parseInt(xx * u + 0.5) / u;
  var uY= parseInt(yy * u + 0.5) / u;

  var sf = parseInt(mapScaleFactor * usf  + 0.5) / usf;

  //Display mouse position in DMS format
  var x_d =  parseInt(uX);
  var mmx = (uX - x_d) * 60;
  var x_m =  parseInt(mmx) ;
  var x_s =  parseInt((mmx - x_m) * 60) ;

  var y_d =  parseInt(uY);
  var mmy = (uY - y_d) * 60;
  var y_m =  parseInt(mmy) ;
  var y_s =  parseInt((mmy - y_m) * 60) ;

  var degree_char = "\u00B0";     //This is the unicode value for the degree symbol for the DMS values

  //Made following changes on the status bar:
  //  -> Changed to say Lat and Long rather than x,y coordinates.
  //  -> For DMS the Min. and Sec. values were forced to be positive because the negative will be shown with the Deg. values
  //  -> Added Unicode value 00B0 for degrees, ' for minutes, and " for seconds

//	var bbb = "<form><input type=button name=copy value='Copy Lat/Long' onclick='CopyLatLong();'/></form>";

  var mouseString2 = "<label style = \"color:red;float:right\" onclick=\"closeLatLongWindow()\">x</label>Lat/Long: " + uY + " , " + uX + "<br>" + 
                     "DMS: " + y_d + degree_char + "  " + Math.abs(y_m) + "\'  " + Math.abs(y_s) + "\", " + x_d + degree_char + "  " + Math.abs(x_m) + "\'  " + Math.abs(x_s) + "\"<br>" +
                     "UTM: " + convertLatLontoUTM(yy,xx);

  //var ooooo = top.parent.ToolbarFrame.document.getElementById("LatLongTEXT");
  var ooooo = document.getElementById("LatLongTEXT");
  if (ooooo != null && typeof ooooo != "undefined"){
    ooooo.innerHTML = mouseString2;
    ooooo.style.backgroundColor = "#D3D3DB";
    ooooo.style.width = 315;
    ooooo.style.visibility = "visible";
    //ooooo.style.backgroundImage = "http://webfx.eae.net/dhtml/pngbehavior/webfx.png";
  }
  //ooooo.style.background = "opacity: 0.4";  //doesn't work at all
  //ooooo.style.filter = "alpha(opacity=50);-moz-opacity:0.5;";  //doesn't work at all
    
  return mouseString2;
}

function closeLatLongWindow() {
	document.getElementById("LatLongTEXT").innerHTML = "";
	document.getElementById("LatLongTEXT").style.visibility = "hidden";
	//document.getElementById("LatLongTEXT").style.width = 0;
	//document.getElementById("LatLongTEXT").style.height = 0;
}

function showBaseMap (mapservice_layer_id) {
  var ww = getWindow();  
//  if (ww.useREST) {
//    ww.baseMapLayer.hide();
//    if (mapservice_layer_id == 0)
//      ww.setBaseMap("Aerial"); 
//    if (mapservice_layer_id == 1)
//      ww.setBaseMap("Street");  
//    if (mapservice_layer_id == 5)
//      ww.setBaseMap("Topography");
//  }
  var lyr = ww.toc.getLayer(mapservice_layer_id);
	if (lyr == null) {
	  alert("layer not found: " + mapservice_layer_id);
	  return;
	} 
	if (mapservice_layer_id != "none")
	  ww.toc.layerToggleVisibleWMS(lyr.index,ww.parent.TOCFrame,true);
	else
	  ww.toc.layerToggleVisibleWMS(lyr.index,ww.parent.TOCFrame,false);
}

// replace common HTML entitys with the characters they represent
function encodeString(oldString) {
  oldString = swapStuff2(oldString,"&apos;","'");
  oldString = swapStuff2(oldString,"&divide;","/");
  oldString = swapStuff2(oldString,"&ge;",">=");
  oldString = swapStuff2(oldString,"&gt;",">");
  oldString = swapStuff2(oldString,"&le;","<=");
  oldString = swapStuff2(oldString,"&lt;","<");
  oldString = swapStuff2(oldString,"&ne;","<>");
  oldString = swapStuff2(oldString,"&quot;",'"');
  oldString = swapStuff2(oldString,"&amp;","&");
  //alert(oldString);

  return oldString;
}

// swap out one interior string with another
function swapStuff2(oldString,newStuff,oldStuff) {
  var pos = 0;
  var rpos = 0;
  var epos = 0;
  var leftString = "";
  var rightString = "";
  pos = oldString.indexOf(oldStuff);
  while (pos!=-1) {
    epos = oldString.length;
    rpos = pos + oldStuff.length;
    leftString = oldString.substring(0,pos);
    rightString = oldString.substring(rpos,epos);
    oldString = leftString + newStuff + rightString;
    pos = oldString.indexOf(oldStuff);
  }
  leftString=null;
  rightString=null;
  return oldString;
}

function identifyDeriveLD(polygon) {

	passstring = polygon;
	DeriveLD(polygon, "");
}

function DeriveLD(sText, sLabel) {
	var ww = getWindow();
  sText = passstring;
 
	
  oDeriveLDFrame= ww.open("","oDeriveLDFrame","status=yes,left=150,top=50,width=415,height=700,scrollbars=yes,resizable=yes");
  oDeriveLDFrame.focus();
  oDeriveLDFrame.document.open();

  oDeriveLDFrame.document.writeln('<html><body>');
  oDeriveLDFrame.document.writeln('<form action=\"LDDerive.jsp\" method=\"POST\" name=\"form">');
  oDeriveLDFrame.document.writeln('<input type=\"hidden\" name=\"respString\" value=\"\" />');
  oDeriveLDFrame.document.writeln('<input type=\"hidden\" name=\"DeriveButton\" value=\"1\" />');
  oDeriveLDFrame.document.writeln('<input type=\"hidden\" name=\"xmlTest\" value=\"\" />');
  oDeriveLDFrame.document.writeln('<input type=\"hidden\" name=\"submitStatus\" value=\"\" />');
  oDeriveLDFrame.document.writeln('<input type=\"hidden\" name=\"completionStatus\" value=\"\" />');
  oDeriveLDFrame.document.writeln('<input type=\"hidden\" name=\"sketchcoordinates\" value=\"'+ sText + '\" />');
  oDeriveLDFrame.document.writeln('</form>');
  oDeriveLDFrame.document.writeln('<script language=\"javascript\" type=\"text/javascript\">');
  oDeriveLDFrame.document.writeln('document.form.submit();');
  oDeriveLDFrame.document.writeln('</script>');
  oDeriveLDFrame.document.close();
}

function FindLD(sText, sLabel) {
    var bOpen = false;
    var tt = 0;
    var ll = 0;
    var hh =550;
    var ww =450;

    if (oFindLDFrame != null  && !oFindLDFrame.closed) {
      //var ss = oFindLDFrame.document.location.href;
      oFindLDFrame.close();
    }

    if (screen && screen.availHeight) {
        tt = screen.availHeight - hh;
        ll = screen.availWidth - ww;
    }
    //tt = 0;

    oFindLDFrame= window.open("Find Land Description","oFindLDFrame","left=" + ll +",top="+tt+",height=" + hh + ",width=" + ww + ",status=yes,toolbar=no,menubar=no,location=no,resizable=yes scrollbars=yes");
    oFindLDFrame.focus();
    oFindLDFrame.document.open();

    oFindLDFrame.document.writeln('<html><body>');
    oFindLDFrame.document.writeln('<form action=\"LDFind.jsp\" method=\"POST\" name=\"FindLDForm">');

    var landKey = sText;
    var xmlText = "";
    if(landKey != "") {
      xmlText += "<soap:Envelope xmlns:soap=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;>";
      xmlText += "  <soap:Body>";
      xmlText += "    <FindLD xmlns=&quot;http://www.esri.com/&quot;>";
      xmlText += "      <LegalDescription>" + landKey + "</LegalDescription>";
      xmlText += "      <PolygonFormat>eVertices</PolygonFormat>";
      xmlText += "    </FindLD>";
      xmlText += "  </soap:Body>";
      xmlText += "</soap:Envelope>";
    }

    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"State\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"princmer\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"tier\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"tierdir\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"tierfrac\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"range\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"rangefrac\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"FIRSTTIME\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"firstrec\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"lastrec\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"stateSelected\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"meridianSelected\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"tierNumber\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"tierDirSelected\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"tierFracSelected\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"rangeNumber\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"rangeDirSelected\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"TownshipSearchCriteriaPost\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"parcelName\" value=\"' + sLabel + '\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"buildName\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"firstSearchRecord\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"completionStatus\" value=\"Working\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"landKey\" value=\"' + sText + '\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"respString\" value=\"\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"findBoundaryButton\" value=\"1\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"xmlText\" value=\"' + xmlText + '\" />');
    oFindLDFrame.document.writeln('<input type=\"hidden\" name=\"objectid\" value=\"\" />');

    oFindLDFrame.document.writeln('</form>');
    oFindLDFrame.document.writeln('<script language=\"javascript\" type=\"text/javascript\">');
    oFindLDFrame.document.writeln('document.FindLDForm.submit();');
    oFindLDFrame.document.writeln('</script>');
    oFindLDFrame.document.close();
}

var owin;

function openphoto(sUrl, ww, hh)  {
    var bOpen = false;

    if (owin != null  && !owin.closed) {
      var ss = owin.document.location.href;

      //if (ss.indexOf(sUrl) > 0 ) {   //proper window and url already open, just give it focus
          owin.focus();
      //} else {
      owin.document.location = sUrl;
      owin.focus();
      //}
    }
    else {
      bOpen = true;
      owin = open(sUrl, null,"height=" + hh + ",width=" + ww + ",status=yes,toolbar=no,menubar=no,location=no,resizable=yes scrollbars=yes");   //
    }

    return;
}


function ValidateSketch() {
  var bvalid = true;

  var ww = getWindow();
  if (ww.clickCount >0 ) {
    var minx = 180;
    var miny = 90;
    var maxx = -180;
    var maxy = -90;

    for (var i=0;i<ww.clickCount;i++) {
      if(ww.clickPointX[i] <= minx) minx = ww.clickPointX[i];
      if(ww.clickPointX[i] >= maxx) maxx = ww.clickPointX[i];

      if(ww.clickPointY[i] <= miny) miny = ww.clickPointY[i];
      if(ww.clickPointY[i] >= maxy) maxy = ww.clickPointY[i];
    }
    var ss = maxx - minx;
    var tt= maxy - miny;
    //alert( ss+ "  " + tt);

    if (((maxy - miny) > .30 ) || ((maxy - miny) > .30 )) {
      alert("Sketch is too large for search and cannot be used.");
      bvalid = false;
    }
    else 
      bvalid = true;
  }
  else
    bvalid = false;

  return bvalid;
}

function ZoomToSketchEnvelope() {
  var ww = getWindow();
  if (ww.useREST){
    if (ww.sketchGeometry != null){
      ww.map.setExtent(ww.sketchGeometry.getExtent());
      ww.map.setLevel(parseInt(ww.map.getLevel()-1));
    }
    else
      alert("No sketch has been drawn.");
  }
  else if (ww.clickCount >0 ) {
    var minx = 180;
    var miny = 90;
    var maxx = -180;
    var maxy = -90;

    for (var i=0;i<ww.clickCount;i++) {
      if(ww.clickPointX[i]  <= minx) minx = ww.clickPointX[i] ;
      if(ww.clickPointX[i]  >= maxx) maxx = ww.clickPointX[i] ;

      if(ww.clickPointY[i] <= miny) miny = ww.clickPointY[i];
      if(ww.clickPointY[i] >= maxy) maxy = ww.clickPointY[i];
    }
    ww.zoomToEnvelope(minx,miny,maxx,maxy);
  }
  else
    alert("No sketch has been drawn.");
}

function zoomToFeature(layerId, objectId, columnName, keyType) {
  var ww = getWindow();
  ww.zoomToFeatureNow(layerId, objectId, columnName, keyType, "", "", "" ) ;
}

function zoomToEnv(minx,miny,maxx,maxy) {
  var ww = getWindow();
  
  ww.zoomToEnv(minx,miny,maxx,maxy);
  /*
  if (ww.useREST){
    if (miny == maxy){  //this is a point
      minx -= 0.75;
      miny -= 0.75;
      maxx += 0.75;
      maxy += 0.75;
    }
    else if (Math.abs(miny-maxy) < 0.25){
      minx -= 0.065;
      miny -= 0.065;
      maxx += 0.065;
      maxy += 0.065;
    }
    else if (Math.abs(miny-maxy) < 0.5){
      minx -= 0.18;
      miny -= 0.18;
      maxx += 0.18;
      maxy += 0.18;
    }
    else {
      var ydist = Math.abs(miny-maxy);
      var xdist = Math.abs(minx-maxx);
      minx -= (xdist*0.25);
      miny -= (ydist*0.25);
      maxx += (xdist*0.25);
      maxy += (ydist*0.25);
    }
    ww.zoomExtent.xmin = minx;
    ww.zoomExtent.ymin = miny;
    ww.zoomExtent.xmax = maxx;
    ww.zoomExtent.ymax = maxy;
    
    //this empty try catch block is necessary due to some unknown error in esri code that throws an exception
    try{
      ww.map.setExtent(ww.zoomExtent);
    }
    catch (exception){
    }
  }
  else if (!isLandsviewer()) {
    minx -= 0.08;
    miny -= 0.08;
    maxx += 0.08;
    maxy += 0.08;
    ww.zoomToEnvelope(minx,miny,maxx,maxy);
  }
  else
    ww.adfZoomToEnv(minx, miny, maxx, maxy);
    */
}

function ClearSketch() {
  var ww = getWindow();
  ww.clearMapSketch();
  ww.sendMapXML();
  location.reload();
}

function ClearSelections() {
  var ww = getWindow();
  if (ww.useREST)
    ww.removeAllGraphicsExceptSketch();
  ww.clearMapSelections();
  ww.sendMapXML();
  location.reload();
}

function ClearAll() {
  var ww = getWindow();
  ww.clearSelection();
  if (ww.useREST){
    ww.clearMapSelections();
    ww.sendMapXML();
  }
  location.reload();
}

function getWindow() {
  var ww;
  if (typeof parent.parent.MapFrame != "undefined") 
    ww = parent.parent.MapFrame;
  else {
    if (typeof window.top.MapFrame != "undefined") 
      ww = window.top.MapFrame;
    else {
      if (opener) {
        //most geocomm gets here
        ww = opener.parent.MapFrame;
      }
      else {
        if (parent.MapFrame) 
          ww = parent.MapFrame;
        else; 
         //alert("Could not find MapFrame!");
      }
    }
  }
  return ww;
}

//looking for select function, start here

//add
//select
//zoom

//finds the feature in selection list and zooms to that envelope
function zoomToCustomFeatureEnvelope(mapservice_layer_id,ObjectID) {
    
  var bFoundIt = false;
  var bindex = -1;
  var ww = getWindow();
  oSM = ww.oSELECTION_MANAGER;
  oList = oSM.InitList(mapservice_layer_id, "");
  if (oList != null) {
    for (var g=0; g<oList.objectids.length; g++) {
      if ((oList.objectids[g] == ObjectID)) {
        bFoundIt = true;
        bindex = g;
        g = oList.objectids.length;
      }
    }

    if (bFoundIt) {
      if (oList.minx[bindex] !=180 && oList.miny[bindex] !=90 &&  oList.maxx[bindex] !=-180 &&  oList.maxy[bindex] !=-90 ) {
        if (ww.useREST)
          zoomToEnv(parseFloat(oList.minx[bindex]-0.3), parseFloat(oList.miny[bindex]-0.3), parseFloat(oList.maxx[bindex]+0.3), parseFloat(oList.maxy[bindex]+0.3));
        else
          zoomToEnv(oList.minx[bindex], oList.miny[bindex], oList.maxx[bindex], oList.maxy[bindex]);
      }
      else 
        alert("Parcel has not been located on map.  Could not Zoom to this Parcel.");
    } 
  }
}  

// add or update existing record
function updateFeatureCustomGeometry(mapservice_layer_id, ColumnName, ColumnValue, state_abbr, label, text_description, coordinates) {

}

function RemoveFeature(mapservice_layer_id,  ColumnValue, state_abbr) {
  var ww = getWindow();
  oSM = ww.oSELECTION_MANAGER;
  oList = oSM.InitList(mapservice_layer_id, "");
  oList.useEnvelopeFlag = false;    //state_abbr used instead of envelope to qualify values across state layers

  oList.RemoveItem(ColumnValue, state_abbr);

  //refresh page?
  //   location.reload();

  //refresh map.
  //  window.setTimeout("parent.MapFrame.getArcIMSAcetateLayer()",0);
  ww.getArcIMSAcetateLayer();
}

//don't update,or add, or remove.  Select and Zoom only.
function selectFeatureCustomGeometry(bEnabled, bZoomFlag, mapservice_layer_id, ColumnName, ColumnValue, state_abbr, label, text_description, coordinates) {
  //alert("selectFeatureCustom.   state: " + state_abbr);
  //alert("SelectFeatureCustom: \n-----------------------------------\nbEnabled = " + bEnabled + " \nlayer_id = " + mapservice_layer_id + " \nColumn Name: " + ColumnName + " \nColumnValue = " + ColumnValue + "\nstate_abbr: " + state_abbr );

  var ww = getWindow();

  oSM = ww.oSELECTION_MANAGER;
  oList = oSM.InitList(mapservice_layer_id,ColumnName);
  oList.useEnvelopeFlag = false;    //state_abbr used instead of envelope to qualify values across state layers
  //oList.statelayer = true;

  if (bEnabled) {
    //oList.AddItem2(ColumnValue, state_abbr);
    oList.additemCustom(ColumnValue,"",state_abbr, label, text_description,coordinates);           //additemCustom(ObjectID, serialid, state_abbr, label, text_description, coordinates ) {
  }
  else 
    oList.ToggleItemVisibility(false,ColumnValue,"");

  //this just forces redraw with new record selected.
  if (!isLandsviewer()) {
    if (bZoomFlag) 
      zoomToCustomFeatureEnvelope ( mapservice_layer_id  ,ColumnValue);
    else 
      ww.getArcIMSAcetateLayer();
  }
  else {
    if (coordinates != null) 
      ww.adfDrawPolygon(coordinates);
    else 
      ww.adfSelect(bEnabled, mapservice_layer_id, ObjectID);
  }
} 

function isNumeric(sText)
{
  var ValidChars = "0123456789.";
  var IsNumber=true;
  var Char;
 
  for (i = 0; i < sText.length && IsNumber == true; i++){ 
    Char = sText.charAt(i); 
    if (ValidChars.indexOf(Char) == -1) 
      IsNumber = false;
  }
  
  return IsNumber;
}

//this can be called without envelope, like when attaching to forest dropdown
function selectFeatureCustom(bEnabled, mapservice_layer_id, ColumnName, ColumnValue, state_abbr, label, bZoom, minX, minY, maxX, maxY, dontAddToSelMgr) {
  if (typeof(dontAddToSelMgr) == "undefined")
    dontAddToSelMgr = false;
  var ww = getWindow();
  oSM = ww.oSELECTION_MANAGER;
  oList = oSM.InitList(mapservice_layer_id,ColumnName);

  if (ww.useREST && ww.map != null /*&& ww.map.graphics != null*/){
    var ObjectID = ColumnValue;
    if (ObjectID.search("Lat/Long") == -1 && ObjectID.search("Spatial Polygon") == -1)
      ObjectID = "Spatial Polygon " + ObjectID;

    if (bEnabled){
      if (ww.doesMapGraphicExist(ObjectID))
        ww.showMapGraphic(ObjectID, bZoom);
      else{ 
        //add graphic to Map
        if (ObjectID.search("Spatial Polygon") == -1) {
          if (ww.identifyPointOnLoad== null ) {
                ww.identifyPointOnLoad = new esri.geometry.Point(minx,miny, new esri.SpatialReference({wkid: 4326}));
		  }
          ww.identifyPointOnLoad.x = (minx + maxx) / 2;
          ww.identifyPointOnLoad.y = (miny + maxy) / 2;
          ww.addPoint(ww.identifyPointOnLoad);
    		  ww.addText(ww.identifyPointOnLoad, "Lat: " + ww.identifyPointOnLoad.y.toFixed(5) + ", Long: " + ww.identifyPointOnLoad.x.toFixed(5));
        }
        else {
          //if (isNumeric(ColumnValue)) {
            if (label.search("=") > -1){
              label = label.substr(0,label.search("="));
              ww.execQuery2(mapservice_layer_id, label, ColumnValue);
            }
            else{
              oList.AddItem(ObjectID, "",minX, minY, maxX, maxY,label,state_abbr);
              ww.execQuery3(mapservice_layer_id, ColumnName, ColumnValue, bZoom, dontAddToSelMgr);
            }
        }
      }
    }
    else{
      if (ObjectID.search("Spatial Polygon") == -1)
        ww.removePoint((miny + maxy) / 2, (minx + maxx) / 2);
      else
        ww.hideMapGraphic(ObjectID); 
    }
    
    if (!dontAddToSelMgr){
      if (bEnabled)
        oList.AddItem(ObjectID, "",minX, minY, maxX, maxY,label,state_abbr);
      else
        oList.ToggleItemVisibility(false,ObjectID,"");
    }
  }
  else {
    if (bEnabled)
      oList.AddItem(ColumnValue, "",minX, minY, maxX, maxY,label,state_abbr);
    else
      oList.ToggleItemVisibility(false,ColumnValue,"");
  }
  
  if (!isLandsviewer()) {
    if (bZoom){
      if (minX != null && minX != 0 && maxX != null && maxX != 0)
        zoomToEnv(minX,minY,maxX,maxY);
    }
    else
      ww.getArcIMSAcetateLayer();
  }
  else 
    ww.adfSelectFeature(true, mapservice_layer_id, ColumnName, ColumnValue, 1, bZoom);
}

function isRecordSelected(objectId, layerId) {
 	var ww = getWindow();
  oSM = ww.oSELECTION_MANAGER;
	oList = oSM.InitList(layerId, "");
	return oList.isSelected(objectId);
}

function getSelectedRecordsByLayer(layerId) {
	var ww = getWindow();
  var oSM = ww.oSELECTION_MANAGER;
	var oList = oSM.InitList(layerId, "");
	return oList.objectids_num;
}

function isMapLayerVisible(layerId) {
	
	var ww = getWindow();
	var lyr = ww.toc.getLayerByName(layerId);
	//alert(layerId +", " + lyr.mapservice_layer_id + ", " + ww.Visible[lyr.index]);

	return ww.Visible[lyr.index];
}



function selectFeature(bEnabled, mapservice_layer_id, ObjectID, ser_nr_full, minx, miny, maxx, maxy, label) {
  var ww = getWindow();
  oSM = ww.oSELECTION_MANAGER;
  oList = oSM.InitList(mapservice_layer_id, "");
  var origObjectID = ObjectID;

  var slabel = "Object " + ObjectID;
  if (typeof(label) != "undefined" && label != null)
    slabel = label;

  if (ww.useREST && ObjectID.search("Lat/Long") == -1 && ObjectID.search("Spatial Polygon") == -1 && ObjectID.search("Point Feature") == -1){
    if (minx == maxx) {// point
      ObjectID = "Point Feature " + ObjectID;
      var searchTolerance = (ww.xDistance/ww.map.width) * ww.pixelTolerance;
      minx -= searchTolerance;
      miny -= searchTolerance;
      maxx += searchTolerance;
      maxy += searchTolerance;
      
    }  
    else
      ObjectID = "Spatial Polygon " + ObjectID;
  }

  if (bEnabled)
    oList.AddItem(ObjectID,ser_nr_full,minx,miny,maxx,maxy, slabel,"");
  else
    oList.ToggleItemVisibility(false,ObjectID,ser_nr_full);
    
  if (ww.useREST && ww.map != null && ww.map.graphics != null){
    if (bEnabled){
      if (ww.doesMapGraphicExist(ObjectID))
        ww.showMapGraphic(ObjectID);
      else{ 
        //add graphic to Map
        if (ObjectID.search("Spatial Polygon") == -1 && ObjectID.search("Point Feature") == -1) {
           if (ww.identifyPointOnLoad== null ) {
                ww.identifyPointOnLoad = new esri.geometry.Point(minx,miny, new esri.SpatialReference({wkid: 4326}));
		  }
         ww.identifyPointOnLoad.x = (minx + maxx) / 2;
          ww.identifyPointOnLoad.y = (miny + maxy) / 2;
          ww.addPoint(ww.identifyPointOnLoad);
    		  ww.addText(ww.identifyPointOnLoad, "Lat: " + ww.identifyPointOnLoad.y.toFixed(5) + ", Long: " + ww.identifyPointOnLoad.x.toFixed(5));
        }
        else{
          if (label.search("=") > -1){
            label = label.substr(0,label.search("="));
            ww.execQuery2(mapservice_layer_id, label, origObjectID);
          }
          else
            ww.execQuery3(mapservice_layer_id, "ObjectID", origObjectID, false, false);
            //ww.execQuery(mapservice_layer_id, label, origObjectID);
        }
      }
    }
    else{
      if (ObjectID.search("Spatial Polygon") == -1 && ObjectID.search("Point Feature") == -1)
        ww.removePoint((miny + maxy) / 2, (minx + maxx) / 2);
      else
        ww.hideMapGraphic(ObjectID); 
    }
  }
  
  if (!isLandsviewer())
    ww.getArcIMSAcetateLayer();
  else
    ww.adfSelect(bEnabled, mapservice_layer_id, ObjectID);
}
 
function writeAll() {
  //PRINT LIST (ObjectID and SerialID)
  var str = "";
  for (var g=0; g<oList.objectids.length; g++)
    str += "\n\nobject[" + g + "] = " + oList.objectids[g] +
           "\nserialid[" + g + "] = " + oList.serialids[g] +
           "\nminx[" + g + "] = " + oList.minx[g] +
           "\nminy[" + g + "] = " + oList.miny[g] +
           "\nmaxx[" + g + "] = " + oList.maxx[g] +
           "\nmaxy[" + g + "] = " + oList.maxy[g];

  alert ("LIST OF OBJECTID's AND SERIALID's: " + str);
}

//PF: used for the selected records manager.
//TODO: store zoom link, select link, any other attributes in the oList for display...
function printAllSelectedRecords() {
  var ww = getWindow();
  var oSM = ww.oSELECTION_MANAGER;  //selection manager list (groups of oLists with mapservice IDs)
  var groups = ww.toc.groups;   //groups (which has layers) from the TOC...
  var display_name = "";      //What mapservice name to display to the user (group name, without IDENTIFY text)

  document.write("<div><font face=Verdana><font size=3><b><u>Selected Features</u></b></font></div>");

  //loop thorught the oLists in the oSM (sl = selectlist)
  for (var sl=0; sl<oSM.select_lists.length; sl++){
    display_name = "";
    var olyr = null;

    //todo: getlist handle method call
    //loop through the groups and find the name (get mapservice info by layerid)
    for (var g=0; g<groups.length; g++){
      var grp = groups[g];
      for (var l=0; l<grp.layers.length; l++){
        var tlyr = grp.layers[l];
        if(tlyr.mapservice_layer_id == oSM.select_lists[sl].mapservice_layer_id){
           display_name = tlyr.name;
           display_name = display_name.replace("IDENTIFY ","");
           olyr = tlyr;
           l = grp.layers.length;
        }
      }

      if(display_name != "")
        g = groups.length;
    }

    if (oSM.select_lists[sl].objectids.length > 0 ) {
      document.write("<br><div  style=\"text-align:left\" class=\"resulttext\">");
      document.write("" +  display_name + "  (" + oSM.select_lists[sl].mapservice_layer_id + ")   " );
      document.write(" (" + oSM.select_lists[sl].objectids.length + " records)<br>");
      document.write("</div>");

      document.write("<div id='layerresult'>");
      document.write("<table span class=\"sortable\" name=\"resultTable\" id=\"resultTable\" cellspacing=\"2\" cellpadding=\"2\" >");
      //ROW headers
      document.write("<TR>");
      document.write("<TD onClick='alternateRowColors();'>Zoom</TD>");
      document.write("<TD onClick='alternateRowColors();'>Select</TD>");
      document.write("<TD onClick='alternateRowColors();'>Identify</TD>");
      document.write("<TD onClick='alternateRowColors();'>Remove</TD>");
      document.write("<TD onClick='alternateRowColors();'>Label</TD>");
      document.write("<TD width='250px' onClick='alternateRowColors();'>Text Description</TD>");

      document.write("<TD onClick='alternateRowColors();'>Coordinates</TD>");
      document.write("<TD onClick='alternateRowColors();'>Object ID</TD>");
      document.write("<TD onClick='alternateRowColors();'>Serial ID</TD>");
      document.write("<TD onClick='alternateRowColors();'>Min X</TD>");
      document.write("<TD onClick='alternateRowColors();'>Min Y</TD>");
      document.write("<TD onClick='alternateRowColors();'>Max X</TD>");
      document.write("<TD onClick='alternateRowColors();'>Max Y</TD>");
      document.write("</tr>");

      var schecked= "";

      //loop through the oLists of the oSM and print the actual items...
      for (var s=0; s<oSM.select_lists[sl].objectids.length; s++){
        var bValidGeometryFlag = true;
        var sradio = "";
        var sPolygon =  "";
        var remove_link = "";
        var identify_link = "";
        var zoom_link = "";
        var scoords = "";
        var smaplinks = "";
        var select_link = "";
        schecked= "";

        if (oSM.select_lists[sl].visibility[s])
          schecked = "checked";
          
        bValidGeometryFlag = ValidateGeometry(oSM.select_lists[sl].coordinates[s]);
      
        scoords = oSM.select_lists[sl].coordinates[s];
        if (typeof(scoords) != "undefined" && scoords != ""){
          var scoordslen = scoords.length - 100;
          if (scoordslen < 0 ) {
            scoordslen = 0;
            scoords = scoords.substring(scoordslen);
          }
          else 
            scoords = "..." + scoords.substring(scoordslen);
        }

        //if (bValidGeometryFlag || oSM.select_lists[sl].customGeometry==false) {
        select_link = "<input type=checkbox " + schecked + " onclick=\"selectFeature(this.checked,'" +
        oSM.select_lists[sl].mapservice_layer_id + "', '" +
        oSM.select_lists[sl].objectids[s] + "', '"  +
        oSM.select_lists[sl].serialids[s] + "'," +
        oSM.select_lists[sl].minx[s] + "," +
        oSM.select_lists[sl].miny[s] + "," +
        oSM.select_lists[sl].maxx[s] + "," +
        oSM.select_lists[sl].maxy[s] + ", '" + 
        oSM.select_lists[sl].label[s] + "'" + 
        //oSM.select_lists[sl].maxy[s] +  '" + 
        ");\">";

        scoords = "Map sketch of boundary";

        //determine how to call Identify, by objectid or spatialfilter?
        identify_link = "";
        var sPolygon = "";
        if (oSM.select_lists[sl].coordinates[s] != null && oSM.select_lists[sl].coordinates[s].length > 0) {
          if (ww.useREST && oSM.select_lists[sl].coordinates[s].search("SPATIALFILTER") > -1)
            sPolygon = swapStuff2(oSM.select_lists[sl].coordinates[s],"&quot;",'"');
          else
            sPolygon = getSketch_as_spatialfilter(oSM.select_lists[sl].coordinates[s]);
          if (ww.useREST){
            if (oSM.select_lists[sl].objectids[s].search("Spatial Polygon") > -1)
              identify_link = "<a href='' onclick=\"getWindow().identifyByPolygon('" + sPolygon + "');return false;\" >Identify...</a>";
            else
              identify_link = "<a href='' onclick=\"getWindow().identifyByCoords(" + oSM.select_lists[sl].minx[s] + "," + oSM.select_lists[sl].maxx[s] + "," + oSM.select_lists[sl].miny[s] + "," + oSM.select_lists[sl].maxy[s] + ");return false;\" >Identify...</a>";
          }
          else{
            if (oSM.select_lists[sl].objectids[s].search("Lat/Long") > - 1)
              identify_link = "<a href='' onclick=\"getWindow().identifyByCoords(" + oSM.select_lists[sl].minx[s] + "," + oSM.select_lists[sl].maxx[s] + "," + oSM.select_lists[sl].miny[s] + "," + oSM.select_lists[sl].maxy[s] + ");return false;\" >Identify...</a>";
            else            
              identify_link = "<a href='' onclick=\"IdentifySelectedRecord('" + sPolygon + "');return false;\" >Identify...</a>";
          }
        }
        else {
          if (ww.useREST){
            var sPolygon = ww.getPolygonByObjectID(oSM.select_lists[sl].objectids[s]);  //disabled temporarily while working on polyline feature addition 10-09-08 SB
            if (sPolygon == "") {  //this means it is a point
              identify_link = "<a href='' onclick=\"getWindow().identifyByCoords(" + oSM.select_lists[sl].minx[s] + "," + oSM.select_lists[sl].maxx[s] + "," + oSM.select_lists[sl].miny[s] + "," + oSM.select_lists[sl].maxy[s] + ");return false;\" >Identify...</a>";
            }
            else {
              sPolygon = swapStuff2(sPolygon,"&quot;",'"');
              identify_link = "<a href='' onclick=\"getWindow().identifyByPolygon('" + sPolygon + "');return false;\" >Identify...</a>";
            }
          }
          else{
            var mapservice = "LANDSVIEWER_IMS";
            if (olyr != null)
              mapservice = olyr.mapservice_name;
            identify_link = "<a href=\"javascript:featureIdentify('" + oSM.select_lists[sl].objectids[s] + "','" + oSM.select_lists[sl].mapservice_layer_id + "','" + mapservice + "','" + oSM.select_lists[sl].label[s] + "')\">Identify</a>";
          } 
        }

        remove_link = "<a href='' onclick=\"RemoveFeature('" +
        oSM.select_lists[sl].mapservice_layer_id + "', '" +
        oSM.select_lists[sl].objectids[s] + "', '"  +
        oSM.select_lists[sl].serialids[s] + "'" + ");document.location.href = document.location;return false;\" >" + "Remove" + "</a>";

        zoom_link = "<a href='' onclick=\"zoomToEnv(" +
        oSM.select_lists[sl].minx[s] + "," +
        oSM.select_lists[sl].miny[s] + "," +
        oSM.select_lists[sl].maxx[s] + "," +
        oSM.select_lists[sl].maxy[s] + ");return false;\" >" + "zoom" + "</a>";
        
        document.write("<tr>");
        document.write("<td >" + zoom_link + "</td>");
        document.write("<td >" + select_link + "</td>");

        document.write("<td >" + identify_link + "</td>");
        document.write("<td >" + remove_link + "</td>");
        document.write("<td >" + oSM.select_lists[sl].label[s] + "</td>");
        document.write("<td width='250px'>" + oSM.select_lists[sl].text_description[s] + "</td>");
        document.write("<td width=140 >" + scoords + "</td>");

        document.write("<td >" + oSM.select_lists[sl].objectids[s] + "</td>");
        document.write("<td >" + oSM.select_lists[sl].serialids[s] + "</td>");

        document.write("<td >" + oSM.select_lists[sl].minx[s] + "</td>");
        document.write("<td >" + oSM.select_lists[sl].miny[s] + "</td>");
        document.write("<td >" + oSM.select_lists[sl].maxx[s] + "</td>");
        document.write("<td >" + oSM.select_lists[sl].maxy[s] + "</td>");
        document.write("</tr>");
      }
      //end of the mapservice section...
      document.write("</table>");
      document.write("<script>alternateRowColors();</script>");
      document.write("</div><br>");
    } 
  } 
  if (ww.clickCount > 0 ) {
    document.write("<br><br><div  class='title1'>Sketch</div>");
    document.write("<br><div>");
    for (var i=0;i<ww.clickCount;i++)
      document.write('[' + i +'] ' + ww.clickPointX[i] + "  ,  " + ww.clickPointY[i] + '<br>');
      
    document.write("</div><br><br>");
  }

  //----------------------------------------
  //Controls:
  //Clear All, Clear Sketch, Clear Selected Records, Clear Land Descriptions,
  //Show Sketch Checkbox,  Show Selected Features, Show Land Descriptions.
  //All Identify Points.
  //Place Names
  //Derived Sketches.
  //---------------------------------------
  document.write("<br><div><font size=2>");
  var clear_all = "<a href='' onclick='ClearAll();return false;' >Clear All</a>";
  var clear_sketch = "<a href='' onclick='ClearSketch();return false;' >Clear Sketch</a>";
  var clear_selected = "<a href='' onclick='ClearSelections();return false;' >Clear Selected Features</a>";

  //document.write("<TABLE border=0 width=480>");
  //document.write("<TR>");
  //document.write("<td width=160 >" + clear_all + "</td>");
  //document.write("<td width=160>" + clear_sketch + "</td>");
  //document.write("<td >" + clear_selected + "</td>");
  //document.write("</TR>");
  //document.write("</TABLE>");

  document.write("" + clear_all + "&nbsp;&nbsp;");
  document.write("" + clear_sketch + "&nbsp;&nbsp;");
  document.write("" + clear_selected + "&nbsp;&nbsp;");
  document.write("</font></font></div>");
} 

function printAllSelectedRecords_parcels() {
  var ww = getWindow();
  var oSM = ww.oSELECTION_MANAGER;  //selection manager list (groups of oLists with mapservice IDs)
  var display_name = "";      //What mapservice name to display to the user (group name, without IDENTIFY text)

  //loop thorught the oLists in the oSM (sl = selectlist)
  for (var sl=0; sl<oSM.select_lists.length; sl++) {
    if (oSM.select_lists[sl].mapservice_layer_id == ww.cLANDDESC_LAYERID) {
      display_name = "";

      document.write("<table border=\"1\" style=\"position:absolute; top:-2; left:-2;\" class=\"\" width=\"400px\"  name=\"parcelListTable\" id=\"parcelListTable\" cellspacing=\"2\" cellpadding=\"2\" >");
      document.write("<thead>");
      document.write("<tr>");

      document.write("<th width='5' align='center' onmouseover=\"this.style.backgroundColor='cc9085'\" onmouseout=\"this.style.backgroundColor='cccc99'\">Edit</th>");
      document.write("<th width='10' align='center' onmouseover=\"this.style.backgroundColor='cc9085'\" onmouseout=\"this.style.backgroundColor='cccc99'\">Map</th>");
      document.write("<th width='70' align='center' onmouseover=\"this.style.backgroundColor='cc9085'\" onmouseout=\"this.style.backgroundColor='cccc99'\">Label</th>");
      document.write("<th align='center' onmouseover=\"this.style.backgroundColor='cc9085'\" onmouseout=\"this.style.backgroundColor='cccc99'\">Text Description</th>");
      document.write("<th align='center' onmouseover=\"this.style.backgroundColor='cc9085'\" onmouseout=\"this.style.backgroundColor='cccc99'\">ID</th>");

      document.write("</tr>");
      document.write("</thead>");
      document.write("<tbody>");

     var sradiochecked="checked";
     var recordcount = oSM.select_lists[sl].objectids.length;
     for (var s=recordcount - 1; s>=0; s--) {
       var bValidGeometryFlag = true;
      var sradio = "";
      var sPolygon =  "";
      var remove_link = "";
      var identify_link = "";
      var zoom_link = "";
      var scoords = "";
      var smaplinks = "";
      var select_link = "";
      schecked= "";

      scoords = oSM.select_lists[sl].coordinates[s];
      var scoordslen = scoords.length - 100;
   if (scoordslen < 0 ) {
     scoordslen = 0;
     scoords = scoords.substring(scoordslen);
   } else {
     scoords = "..." + scoords.substring(scoordslen);
   }

   bValidGeometryFlag = ValidateGeometry(oSM.select_lists[sl].coordinates[s]);
   if (bValidGeometryFlag) {
     if (oSM.select_lists[sl].visibility[s]) 
       schecked = "checked";
     select_link = "<input type=checkbox " + schecked + " onclick=\"selectFeature(this.checked,'" +
     oSM.select_lists[sl].mapservice_layer_id + "', '" +
     oSM.select_lists[sl].objectids[s] + "', '"  +
     oSM.select_lists[sl].serialids[s] + "'," +
     oSM.select_lists[sl].minx[s] + "," +
     oSM.select_lists[sl].miny[s] + "," +
     oSM.select_lists[sl].maxx[s] + "," +
     oSM.select_lists[sl].maxy[s]  +
     ");\">";

     scoords = "Map sketch of boundary";

     sPolygon = getSketch_as_spatialfilter(oSM.select_lists[sl].coordinates[s]);
     identify_link = "<a href='' onclick=\"IdentifySelectedRecord('" + sPolygon + "');return false;\" ><img alt='Search and display records underlying this parcel' src='/blmMap/images/identify.gif'></img></a>";

     remove_link = "<a href='' onclick=\"RemoveFeature('" +
     oSM.select_lists[sl].mapservice_layer_id + "', '" +
     oSM.select_lists[sl].objectids[s] + "', '"  +
     oSM.select_lists[sl].serialids[s] + "'" +
     ");\" >" + "Remove" + "</a>";

     zoom_link = "<a href='' onclick=\"zoomToCustomFeatureEnvelope('" +
     oSM.select_lists[sl].mapservice_layer_id + "', '" +
     oSM.select_lists[sl].objectids[s] + "'"  +
     ");return false;\" ><img alt='Zoom map to this parcel' src='/blmmap/images/zoom.gif'></img></a>";

   } else {
     identify_link = "No Map";
   }
     smaplinks = "<center>"+  zoom_link + "&nbsp;"+ select_link + "&nbsp;"+ identify_link + "&nbsp;</center>" ;

     sradio = "<input type='radio' " + sradiochecked + " name='parcelListButton' onclick='javascript:SelectParcelFindLD(\"" + oSM.select_lists[sl].objectids[s]  + "\");'>  ";
     sradiochecked="";   //only first row
     document.write("<tr onMouseOver=\"this.className='highlight'\" onMouseOut=\"this.className='normal'\" >");

     document.write("<td valign=top align='left'>"+ sradio + "</td>");
     document.write("<td valign=top  align='center'><center>" + smaplinks +"</center></td>" );
     document.write("<td valign=top align='left'>" + oSM.select_lists[sl].label[s] + "</td>");
     document.write("<td valign=top  align='left' >" + oSM.select_lists[sl].text_description[s] + "</td>");
     document.write("<td style='display:hidden;' valign=top  align='left' >" + oSM.select_lists[sl].objectids[s] + "</td>");

     document.write("</tr>");
   }

      //end of the mapservice section...
      document.write("</tbody>");
      document.write("</table>");
    }
  }
}

function getActetateSketch_as_spatialfilter() {
  var customString = "";
  var ww = getWindow();
	
  if (ww.clickCount>0) {
    var tgl = 1;
    //todo:note: quote might need to be encoded &quot; or not
    customString += '<SPATIALFILTER relation="area_intersection" ><POLYGON>';
    //ww.clickCount = ww.clickPointX.length;
    //customString += '<RING><COORDS>';
    customString += '<RING>';
    for (var i=0;i<ww.clickCount;i++) {
      //writeStatus("xy="+ww.clickPointX[i]+","+ww.clickPointY[i]);
      var bnext = false;

      // if ( isNaN(ww.clickPointX[i])   ) {
      //     if (tgl == 1) {
      //        tgl = 2;
      //        bnext = true;
      //        if (i<ww.clickCount-1)
      //        customString += '<RING><COORDS>';
      //      }
      // }

     if ( isNaN(ww.clickPointX[i]) == false ) {
       //customString +=  ww.clickPointX[i] + ' ' + ww.clickPointY[i] + ';';
       customString += '<POINT x="' + ww.clickPointX[i] + '" y="' + ww.clickPointY[i] + '" />';
     }

     //if ( isNaN(ww.clickPointX[i])  && !bnext  ) {
      //     if (tgl == 2) {
      //        tgl = 1;
      //        customString += '</COORDS></RING>';
      //      }
      // }
    }

     // if (ww.clickCount>0) {
    //  customString +=  ww.clickPointX[ww.clickCount-1] + ' ' + ww.clickPointY[ww.clickCount-1] + ';';
      //}

      //customString += '</COORDS></RING>';
    customString += '</RING>';
    customString += '</POLYGON></SPATIALFILTER>';
  }
  return customString;
}   //of getActetateSketch_as_spatialfilter

function ValidateGeometry(stext) {
  var bvalid = false;
  if (typeof(stext) != "undefined" && stext != "" && stext.indexOf("RING") >= 0 )
    bvalid = true;
  return bvalid;
}

function getSketch_as_spatialfilter(stext){
   var sPolygon = "";
   var customString = "";
   var coordsList = stext;

   if(coordsList.length == 0) {
     // not valid geometry
   }
   else {
    //plot the feature on acetate
    coordsList = coordsList.replace(/NaN/g,"");
    var pointArray = coordsList.split(",");

    var iclickCount = -1;
    var iclickPointX = new Array();
    var iclickPointY = new Array();

    var i = 0;
    // derive envelope from result vertices
    do {
     ++iclickCount;
     //if(parseFloat(pointArray[i])   <= minX) minX  = parseFloat(pointArray[i]);
     //if(parseFloat(pointArray[i])   >= maxX) maxX  = parseFloat(pointArray[i]);
     iclickPointX[iclickCount] = parseFloat(pointArray[i]);

     i++;
    // if(parseFloat(pointArray[i]) <= minY) minY  = parseFloat(pointArray[i]);
    // if(parseFloat(pointArray[i])   >= maxY) maxY  = parseFloat(pointArray[i]);

     iclickPointY[iclickCount] = parseFloat(pointArray[i]);


    } while(pointArray[++i])

    //if (iclickCount>0) {
    //  ++iclickCount;
    //  iclickPointX[iclickCount] =iclickPointX[1];
    //  iclickPointY[iclickCount] = iclickPointY[1];
    //}

    //alert(iclickPointX[iclickCount]+" " + iclickPointY[iclickCount]);
    //alert("iclickCount " + iclickCount + "  " + iclickPointX.length);

    if (iclickCount>0) {
      var tgl = 1;

    //todo:note: quote might need to be encoded &quot; or not

      customString += '<SPATIALFILTER relation=&quot;area_intersection&quot; ><POLYGON>';
      iclickCount = iclickPointX.length;
      for (var i=0;i<iclickCount;i++) {
        //writeStatus("xy="+iclickPointX[i]+","+iclickPointY[i]);
        var bnext = false;

         if ( isNaN(iclickPointX[i])   ) {
             if (tgl == 1) {
                tgl = 2;
                bnext = true;
                if (i<iclickCount-1)
                customString += '<RING><COORDS>';
              }
         }


         if ( isNaN(iclickPointX[i]) == false ) {
          customString +=  iclickPointX[i] + ' ' + iclickPointY[i] + ';';
         }

        if ( isNaN(iclickPointX[i])  && !bnext  ) {
             if (tgl == 2) {
                tgl = 1;
                customString += '</COORDS></RING>';
              }
         }
      }  //for loop
      customString += '</POLYGON></SPATIALFILTER>';
    }
  }//if coords
  return customString;
}

function IdentifySelectedRecord(sPolygon, addToSelMgr) {

  var ww = getWindow();
  if (typeof(addToSelMgr) == "undefined" || addToSelMgr == null)
    addToSelMgr = true;
  ww.aSpatialFilter = sPolygon;
  ww.identifyDontAddtoSM = !addToSelMgr;
  ww.identify_all(true);
  ww.identifyDontAddtoSM = false;
}

function sketchFilterExists() {
  var filter = getSketchFilter();
  try {
  if (filter == null || filter == "") return false;
  else return true;
  }
  catch (e) {
  return false;
  }
}

//is this being used?
function getLastSelectedObject(mapLayer) {
  try {
  var ww = getWindow();
  var oSM = ww.oSELECTION_MANAGER;
  var objectId = oSM.getLastSelected(mapLayer);
  if (objectId == null || objectId == "undefined") {
    return "";
  }
  else {
    return objectId;
  }
  }catch (e) {return "";}
}

function getAllSelected(mapLayer) {
  try {
  var ww = getWindow();
  var oSM = ww.oSELECTION_MANAGER;
  var selectedList = oSM.getAllSelected(mapLayer);
  if (selectedList == null || selectedList == "undefined") {
    return new Array();
  }
  else {
    return selectedList;
  }
  }catch (e) {return new Array();}
}

function getSketchFilter() {
  var ww = getWindow();
  return ww.aSpatialFilter;
}

function setSketchFilter(filter) {
  var ww = getWindow();
  ww.aSpatialFilter = filter;
}

function identifyByFeature(objectId, mapLayer, mapService, featureLabel) {
  var ww = getWindow();
  ww.featureIdentify(objectId,mapLayer,mapService, featureLabel);
}


function IdentifySketch() {
        var ww = getWindow();
        ww.identify_all(true,null,null,null,null, false);
}


//from utm2.js
    var pi = 3.14159265358979;

    /* Ellipsoid model constants (actual values here are for WGS84) */
    var sm_a = 6378137.0;
    var sm_b = 6356752.314;
    var sm_EccSquared = 6.69437999013e-03;

    var UTMScaleFactor = 0.9996;


    /*
    * DegToRad
    *
    * Converts degrees to radians.
    *
    */
    function DegToRad (deg)
    {
        return (deg / 180.0 * pi)
    }




    /*
    * RadToDeg
    *
    * Converts radians to degrees.
    *
    */
    function RadToDeg (rad)
    {
        return (rad / pi * 180.0)
    }




    /*
    * ArcLengthOfMeridian
    *
    * Computes the ellipsoidal distance from the equator to a point at a
    * given latitude.
    *
    * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
    * GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
    *
    * Inputs:
    *     phi - Latitude of the point, in radians.
    *
    * Globals:
    *     sm_a - Ellipsoid model major axis.
    *     sm_b - Ellipsoid model minor axis.
    *
    * Returns:
    *     The ellipsoidal distance of the point from the equator, in meters.
    *
    */
    function ArcLengthOfMeridian (phi)
    {
        var alpha, beta, gamma, delta, epsilon, n;
        var result;

        /* Precalculate n */
        n = (sm_a - sm_b) / (sm_a + sm_b);

        /* Precalculate alpha */
        alpha = ((sm_a + sm_b) / 2.0)
           * (1.0 + (Math.pow (n, 2.0) / 4.0) + (Math.pow (n, 4.0) / 64.0));

        /* Precalculate beta */
        beta = (-3.0 * n / 2.0) + (9.0 * Math.pow (n, 3.0) / 16.0)
           + (-3.0 * Math.pow (n, 5.0) / 32.0);

        /* Precalculate gamma */
        gamma = (15.0 * Math.pow (n, 2.0) / 16.0)
            + (-15.0 * Math.pow (n, 4.0) / 32.0);
    
        /* Precalculate delta */
        delta = (-35.0 * Math.pow (n, 3.0) / 48.0)
            + (105.0 * Math.pow (n, 5.0) / 256.0);
    
        /* Precalculate epsilon */
        epsilon = (315.0 * Math.pow (n, 4.0) / 512.0);
    
    /* Now calculate the sum of the series and return */
    result = alpha
        * (phi + (beta * Math.sin (2.0 * phi))
            + (gamma * Math.sin (4.0 * phi))
            + (delta * Math.sin (6.0 * phi))
            + (epsilon * Math.sin (8.0 * phi)));

    return result;
    }



    /*
    * UTMCentralMeridian
    *
    * Determines the central meridian for the given UTM zone.
    *
    * Inputs:
    *     zone - An integer value designating the UTM zone, range [1,60].
    *
    * Returns:
    *   The central meridian for the given UTM zone, in radians, or zero
    *   if the UTM zone parameter is outside the range [1,60].
    *   Range of the central meridian is the radian equivalent of [-177,+177].
    *
    */
    function UTMCentralMeridian (zone)
    {
        var cmeridian;

        cmeridian = DegToRad (-183.0 + (zone * 6.0));
    
        return cmeridian;
    }



    /*
    * FootpointLatitude
    *
    * Computes the footpoint latitude for use in converting transverse
    * Mercator coordinates to ellipsoidal coordinates.
    *
    * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
    *   GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
    *
    * Inputs:
    *   y - The UTM northing coordinate, in meters.
    *
    * Returns:
    *   The footpoint latitude, in radians.
    *
    */
    function FootpointLatitude (y)
    {
        var y_, alpha_, beta_, gamma_, delta_, epsilon_, n;
        var result;
        
        /* Precalculate n (Eq. 10.18) */
        n = (sm_a - sm_b) / (sm_a + sm_b);
        	
        /* Precalculate alpha_ (Eq. 10.22) */
        /* (Same as alpha in Eq. 10.17) */
        alpha_ = ((sm_a + sm_b) / 2.0)
            * (1 + (Math.pow (n, 2.0) / 4) + (Math.pow (n, 4.0) / 64));
        
        /* Precalculate y_ (Eq. 10.23) */
        y_ = y / alpha_;
        
        /* Precalculate beta_ (Eq. 10.22) */
        beta_ = (3.0 * n / 2.0) + (-27.0 * Math.pow (n, 3.0) / 32.0)
            + (269.0 * Math.pow (n, 5.0) / 512.0);
        
        /* Precalculate gamma_ (Eq. 10.22) */
        gamma_ = (21.0 * Math.pow (n, 2.0) / 16.0)
            + (-55.0 * Math.pow (n, 4.0) / 32.0);
        	
        /* Precalculate delta_ (Eq. 10.22) */
        delta_ = (151.0 * Math.pow (n, 3.0) / 96.0)
            + (-417.0 * Math.pow (n, 5.0) / 128.0);
        	
        /* Precalculate epsilon_ (Eq. 10.22) */
        epsilon_ = (1097.0 * Math.pow (n, 4.0) / 512.0);
        	
        /* Now calculate the sum of the series (Eq. 10.21) */
        result = y_ + (beta_ * Math.sin (2.0 * y_))
            + (gamma_ * Math.sin (4.0 * y_))
            + (delta_ * Math.sin (6.0 * y_))
            + (epsilon_ * Math.sin (8.0 * y_));
        
        return result;
    }



    /*
    * MapLatLonToXY
    *
    * Converts a latitude/longitude pair to x and y coordinates in the
    * Transverse Mercator projection.  Note that Transverse Mercator is not
    * the same as UTM; a scale factor is required to convert between them.
    *
    * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
    * GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
    *
    * Inputs:
    *    phi - Latitude of the point, in radians.
    *    lambda - Longitude of the point, in radians.
    *    lambda0 - Longitude of the central meridian to be used, in radians.
    *
    * Outputs:
    *    xy - A 2-element array containing the x and y coordinates
    *         of the computed point.
    *
    * Returns:
    *    The function does not return a value.
    *
    */
    function MapLatLonToXY (phi, lambda, lambda0, xy)
    {
        var N, nu2, ep2, t, t2, l;
        var l3coef, l4coef, l5coef, l6coef, l7coef, l8coef;
        var tmp;

        /* Precalculate ep2 */
        ep2 = (Math.pow (sm_a, 2.0) - Math.pow (sm_b, 2.0)) / Math.pow (sm_b, 2.0);
    
        /* Precalculate nu2 */
        nu2 = ep2 * Math.pow (Math.cos (phi), 2.0);
    
        /* Precalculate N */
        N = Math.pow (sm_a, 2.0) / (sm_b * Math.sqrt (1 + nu2));
    
        /* Precalculate t */
        t = Math.tan (phi);
        t2 = t * t;
        tmp = (t2 * t2 * t2) - Math.pow (t, 6.0);

        /* Precalculate l */
        l = lambda - lambda0;
    
        /* Precalculate coefficients for l**n in the equations below
           so a normal human being can read the expressions for easting
           and northing
           -- l**1 and l**2 have coefficients of 1.0 */
        l3coef = 1.0 - t2 + nu2;
    
        l4coef = 5.0 - t2 + 9 * nu2 + 4.0 * (nu2 * nu2);
    
        l5coef = 5.0 - 18.0 * t2 + (t2 * t2) + 14.0 * nu2
            - 58.0 * t2 * nu2;
    
        l6coef = 61.0 - 58.0 * t2 + (t2 * t2) + 270.0 * nu2
            - 330.0 * t2 * nu2;
    
        l7coef = 61.0 - 479.0 * t2 + 179.0 * (t2 * t2) - (t2 * t2 * t2);
    
        l8coef = 1385.0 - 3111.0 * t2 + 543.0 * (t2 * t2) - (t2 * t2 * t2);
    
        /* Calculate easting (x) */
        xy[0] = N * Math.cos (phi) * l
            + (N / 6.0 * Math.pow (Math.cos (phi), 3.0) * l3coef * Math.pow (l, 3.0))
            + (N / 120.0 * Math.pow (Math.cos (phi), 5.0) * l5coef * Math.pow (l, 5.0))
            + (N / 5040.0 * Math.pow (Math.cos (phi), 7.0) * l7coef * Math.pow (l, 7.0));
    
        /* Calculate northing (y) */
        xy[1] = ArcLengthOfMeridian (phi)
            + (t / 2.0 * N * Math.pow (Math.cos (phi), 2.0) * Math.pow (l, 2.0))
            + (t / 24.0 * N * Math.pow (Math.cos (phi), 4.0) * l4coef * Math.pow (l, 4.0))
            + (t / 720.0 * N * Math.pow (Math.cos (phi), 6.0) * l6coef * Math.pow (l, 6.0))
            + (t / 40320.0 * N * Math.pow (Math.cos (phi), 8.0) * l8coef * Math.pow (l, 8.0));
    
        return;
    }
    
    
    
    /*
    * MapXYToLatLon
    *
    * Converts x and y coordinates in the Transverse Mercator projection to
    * a latitude/longitude pair.  Note that Transverse Mercator is not
    * the same as UTM; a scale factor is required to convert between them.
    *
    * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
    *   GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
    *
    * Inputs:
    *   x - The easting of the point, in meters.
    *   y - The northing of the point, in meters.
    *   lambda0 - Longitude of the central meridian to be used, in radians.
    *
    * Outputs:
    *   philambda - A 2-element containing the latitude and longitude
    *               in radians.
    *
    * Returns:
    *   The function does not return a value.
    *
    * Remarks:
    *   The local variables Nf, nuf2, tf, and tf2 serve the same purpose as
    *   N, nu2, t, and t2 in MapLatLonToXY, but they are computed with respect
    *   to the footpoint latitude phif.
    *
    *   x1frac, x2frac, x2poly, x3poly, etc. are to enhance readability and
    *   to optimize computations.
    *
    */
    function MapXYToLatLon (x, y, lambda0, philambda)
    {
        var phif, Nf, Nfpow, nuf2, ep2, tf, tf2, tf4, cf;
        var x1frac, x2frac, x3frac, x4frac, x5frac, x6frac, x7frac, x8frac;
        var x2poly, x3poly, x4poly, x5poly, x6poly, x7poly, x8poly;
    	
        /* Get the value of phif, the footpoint latitude. */
        phif = FootpointLatitude (y);
        	
        /* Precalculate ep2 */
        ep2 = (Math.pow (sm_a, 2.0) - Math.pow (sm_b, 2.0))
              / Math.pow (sm_b, 2.0);
        	
        /* Precalculate cos (phif) */
        cf = Math.cos (phif);
        	
        /* Precalculate nuf2 */
        nuf2 = ep2 * Math.pow (cf, 2.0);
        	
        /* Precalculate Nf and initialize Nfpow */
        Nf = Math.pow (sm_a, 2.0) / (sm_b * Math.sqrt (1 + nuf2));
        Nfpow = Nf;
        	
        /* Precalculate tf */
        tf = Math.tan (phif);
        tf2 = tf * tf;
        tf4 = tf2 * tf2;
        
        /* Precalculate fractional coefficients for x**n in the equations
           below to simplify the expressions for latitude and longitude. */
        x1frac = 1.0 / (Nfpow * cf);
        
        Nfpow *= Nf;   /* now equals Nf**2) */
        x2frac = tf / (2.0 * Nfpow);
        
        Nfpow *= Nf;   /* now equals Nf**3) */
        x3frac = 1.0 / (6.0 * Nfpow * cf);
        
        Nfpow *= Nf;   /* now equals Nf**4) */
        x4frac = tf / (24.0 * Nfpow);
        
        Nfpow *= Nf;   /* now equals Nf**5) */
        x5frac = 1.0 / (120.0 * Nfpow * cf);
        
        Nfpow *= Nf;   /* now equals Nf**6) */
        x6frac = tf / (720.0 * Nfpow);
        
        Nfpow *= Nf;   /* now equals Nf**7) */
        x7frac = 1.0 / (5040.0 * Nfpow * cf);
        
        Nfpow *= Nf;   /* now equals Nf**8) */
        x8frac = tf / (40320.0 * Nfpow);
        
        /* Precalculate polynomial coefficients for x**n.
           -- x**1 does not have a polynomial coefficient. */
        x2poly = -1.0 - nuf2;
        
        x3poly = -1.0 - 2 * tf2 - nuf2;
        
        x4poly = 5.0 + 3.0 * tf2 + 6.0 * nuf2 - 6.0 * tf2 * nuf2
        	- 3.0 * (nuf2 *nuf2) - 9.0 * tf2 * (nuf2 * nuf2);
        
        x5poly = 5.0 + 28.0 * tf2 + 24.0 * tf4 + 6.0 * nuf2 + 8.0 * tf2 * nuf2;
        
        x6poly = -61.0 - 90.0 * tf2 - 45.0 * tf4 - 107.0 * nuf2
        	+ 162.0 * tf2 * nuf2;
        
        x7poly = -61.0 - 662.0 * tf2 - 1320.0 * tf4 - 720.0 * (tf4 * tf2);
        
        x8poly = 1385.0 + 3633.0 * tf2 + 4095.0 * tf4 + 1575 * (tf4 * tf2);
        	
        /* Calculate latitude */
        philambda[0] = phif + x2frac * x2poly * (x * x)
        	+ x4frac * x4poly * Math.pow (x, 4.0)
        	+ x6frac * x6poly * Math.pow (x, 6.0)
        	+ x8frac * x8poly * Math.pow (x, 8.0);
        	
        /* Calculate longitude */
        philambda[1] = lambda0 + x1frac * x
        	+ x3frac * x3poly * Math.pow (x, 3.0)
        	+ x5frac * x5poly * Math.pow (x, 5.0)
        	+ x7frac * x7poly * Math.pow (x, 7.0);
        	
        return;
    }




    /*
    * LatLonToUTMXY
    *
    * Converts a latitude/longitude pair to x and y coordinates in the
    * Universal Transverse Mercator projection.
    *
    * Inputs:
    *   lat - Latitude of the point, in radians.
    *   lon - Longitude of the point, in radians.
    *   zone - UTM zone to be used for calculating values for x and y.
    *          If zone is less than 1 or greater than 60, the routine
    *          will determine the appropriate zone from the value of lon.
    *
    * Outputs:
    *   xy - A 2-element array where the UTM x and y values will be stored.
    *
    * Returns:
    *   The UTM zone used for calculating the values of x and y.
    *
    */
    function LatLonToUTMXY (lat, lon, zone, xy)
    {
        MapLatLonToXY (lat, lon, UTMCentralMeridian (zone), xy);

        /* Adjust easting and northing for UTM system. */
        xy[0] = xy[0] * UTMScaleFactor + 500000.0;
        xy[1] = xy[1] * UTMScaleFactor;
        if (xy[1] < 0.0)
            xy[1] = xy[1] + 10000000.0;

        return zone;
    }
    
    
    
    /*
    * UTMXYToLatLon
    *
    * Converts x and y coordinates in the Universal Transverse Mercator
    * projection to a latitude/longitude pair.
    *
    * Inputs:
    *	x - The easting of the point, in meters.
    *	y - The northing of the point, in meters.
    *	zone - The UTM zone in which the point lies.
    *	southhemi - True if the point is in the southern hemisphere;
    *               false otherwise.
    *
    * Outputs:
    *	latlon - A 2-element array containing the latitude and
    *            longitude of the point, in radians.
    *
    * Returns:
    *	The function does not return a value.
    *
    */
    function UTMXYToLatLon (x, y, zone, southhemi, latlon)
    {
        var cmeridian;
        	
        x -= 500000.0;
        x /= UTMScaleFactor;
        	
        /* If in southern hemisphere, adjust y accordingly. */
        if (southhemi)
        y -= 10000000.0;
        		
        y /= UTMScaleFactor;
        
        cmeridian = UTMCentralMeridian (zone);
        MapXYToLatLon (x, y, cmeridian, latlon);
        	
        return;
    }
    

//end of utm js 