// aimsSelect.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*   dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js, aimsMap.js, aimsIdentify, and aimsLayers.js
*   To be interactive, dependent also on aimsDHTML.js, aimsClick.js, and aimsNavigation.js
*/

var aimsSelectPresent=true;

var selectData = new Array();
var selectLeft = new Array();
var selectRight = new Array();
var selectTop = new Array();
var selectBottom = new Array();
var selectLayer="";
var selectType = "";
var selectCount = 0;
var selectBlurb = "";
var selectEnvelope="";
var highlightedOne = "";
  //mode - 0=selection; 1=query
var queryMode=1;
  //mode - 1=query; 2=box,point; 3=line,polygon
var selectionMode=1;
var setQueryString="";


/*
***************************************************************************************

Selection functions 

***************************************************************************************
*/

// select feature
function select(e) {
  getImageXY(e);
  getMapXY(mouseX,mouseY);
  searchTolerance = (xDistance/iWidth) * pixelTolerance;
  var tempWest = mapX - searchTolerance;
  var tempNorth = mapY + searchTolerance;
  var tempEast = mapX + searchTolerance;
  var tempSouth = mapY - searchTolerance;
  queryStartRecord=0;
  selectEnvelope='maxy="' + tempNorth + '" maxx="' + tempEast + '" miny="' + tempSouth + '" minx="' + tempWest + '"';
  selectionMode=2;
  showRetrieveData();
  var theString = writeGetFeatures2(tempWest,tempSouth,tempEast,tempNorth);
  sendToServer(imsQueryURL,theString,selectXMLMode);
}

// start select box display
function startSelectBox(e) {

  moveLayer("theMap",hspc,vspc);
  getImageXY(e);
  // keep it within the MapImage
  if ((mouseX<iWidth) && (mouseY<iHeight)) {
    if (selectBox) {
      stopSelectBox(e);
    } else {
      x1=mouseX;
      y1=mouseY
      x2=x1+1;
      y2=y1+1;
      zleft=x1;
      ztop=y1;
      zbottom=y1;
      zright=x1
      boxIt(x1,y1,x2,y2);
      /*
      clipLayer("zoomBoxTop",x1,y1,x2,y2);
      clipLayer("zoomBoxLeft",x1,y1,x2,y2);
      clipLayer("zoomBoxRight",x1,y1,x2,y2);
      clipLayer("zoomBoxBottom",x1,y1,x2,y2);
      */
      selectBox=true;
      showLayer("zoomBoxTop");
      showLayer("zoomBoxLeft");
      showLayer("zoomBoxRight");
      showLayer("zoomBoxBottom");
    }
    highlightedOne="";
  }
  return false;

}

// stop select box display..... select
function stopSelectBox(e) {
  selectBox=false;
  var tempLeft=lastLeft;
  var tempRight=lastRight;
  var tempTop=lastTop;
  var tempBottom=lastBottom;
  // /*
  if ((zright <zleft+2) && (zbottom < ztop+2)) {
  
    getMapXY(mouseX-pixelTolerance,mouseY-pixelTolerance);
    tempLeft = mapX;
    tempTop = mapY;
    getMapXY(mouseX+pixelTolerance,mouseY+pixelTolerance);
    tempRight = mapX;
    tempBottom = mapY;
    
    //select(e);
  } else {
  // */ 
    pixelX = xDistance / iWidth;
    var theY = iHeight - ztop;
    pixelY = yDistance / iHeight;
    tempTop = pixelY * theY + bottom;
    tempRight = pixelX * zright + left;
    tempLeft = pixelX * zleft + left;
    theY = iHeight - zbottom;
    pixelY = yDistance / iHeight;
    tempBottom = pixelY * theY + bottom;
  }
    window.scrollTo(0,0);
  
  queryStartRecord=0;
  var theString = writeGetFeatures2(tempLeft,tempBottom,tempRight,tempTop);
  selectEnvelope='maxy="' + tempTop + '" maxx="' + tempRight + '" miny="' + tempBottom + '" minx="' + tempLeft + '"';
  drawSelectBoundary=true;
  showBuffer=false;
  selectionMode=2;
    hideLayer("zoomBoxTop");
    hideLayer("zoomBoxLeft");
    hideLayer("zoomBoxRight");
    hideLayer("zoomBoxBottom");
  sendToServer(imsQueryURL,theString,selectXMLMode);
  return true;

}

// write out XML request to select features
function writeGetFeatures2(west1,south1,east1,north1) {
  if (swapSelectFields) {
    selectFields=selFieldList[ActiveLayerIndex];
  }
  var theEnvelope = 'maxy="' + north1 + '" maxx="' + east1 + '" miny="' + south1 + '" minx="' + west1 + '"';
  var theString = writeEnvelopeXML(ActiveLayer,ActiveLayerType,selectFields,maxFeaturesReturned,queryStartRecord,theEnvelope,useLimitExtent);
  selectLayer=ActiveLayer;
  selectType=ActiveLayerType;
  selectCount=0;
  hightlightedOne="";
  selectPoints.length=1;
  selectLeft.length=1;
  selectRight.length=1;
  selectTop.length=1;
  selectBottom.length=1;
  return theString;
}

function writeGetFeatures3() {
  if (swapSelectFields) {
    selectFields=selFieldList[ActiveLayerIndex];
  }
  var theString = writeEnvelopeXML(ActiveLayer,ActiveLayerType,selectFields,maxFeaturesReturned,queryStartRecord,selectEnvelope,useLimitExtent);
  selectLayer=ActiveLayer;
  selectType=ActiveLayerType;
  selectCount=0;
  hightlightedOne="";
  selectPoints.length=1;
  selectLeft.length=1;
  selectRight.length=1;
  selectTop.length=1;
  selectBottom.length=1;
  return theString;
}

// generic envelope select xml write routine
function writeEnvelopeXML(theLayer,theLayerType,theFields,maxReturned,startRec,theEnvelope,hasLimit) {
  var theString = '<?xml version="1.0" encoding="UTF-8"?><ARCXML VERSION="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" envelope="true" geometry="false"';
  theString += ' compact="true" featurelimit="' + maxReturned + '" beginrecord="' + startRec + '">\n';
  theString += '<LAYER id="' + theLayer + '" />';
  theString += '<SPATIALQUERY subfields="' + theFields + '">';
  //theString += '<SPATIALFILTER relation=envelope_intersection >';
  theString += '<SPATIALFILTER relation="area_intersection" >';
  theString += '<ENVELOPE ' + theEnvelope + ' />';
  theString += '</SPATIALFILTER>';
  if (hasLimit) {
    // keep this within the limitExtent
    theString += '<SPATIALFILTER relation="area_intersection">\n';
    theString += '<ENVELOPE maxx="' + limitRight + '" maxy="' + limitTop + '" minx="' + limitLeft + '" miny="' + limitBottom + '" />\n';
    theString += '</SPATIALFILTER>\n';
  }
  theString += '</SPATIALQUERY>';
  theString += '</GET_FEATURES>';
  theString += '</REQUEST>';
  theString += '</ARCXML>';
  return theString;

}

// write out xml request for selection by shape
function writeShapeSelect(theType) {
  if (swapSelectFields) {
    selectFields=selFieldList[ActiveLayerIndex];
  }
  var theString = '<?xml version="1.0" encoding="UTF-8"?><ARCXML VERSION="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" envelope="true" geometry="false"';
  theString += ' compact="true" featurelimit="' + maxFeaturesReturned + '" beginrecord="' + queryStartRecord + '">\n';
  theString += '<LAYER id="' + ActiveLayer + '" />';
  theString += '<SPATIALQUERY subfields="' + selectFields + '">';
  theString += '<SPATIALFILTER relation="area_intersection" >';
  if (theType==1) {
    theString += '<POLYLINE>\n<PATH>\n';
  } else {
    theString += '<POLYGON>\n<RING>\n';
  }
  for (var i=0;i<clickCount;i++) {
    theString += '<POINT x="' + clickPointX[i] + '" y="' + clickPointY[i] + '" />\n'; 
  }
  if (theType==2) {
    theString += '</RING>\n</POLYGON>\n';
  } else {
    theString += '</PATH>\n</POLYLINE>\n';
  }
  theString += '</SPATIALFILTER>';
  if (useLimitExtent) {
    // keep this within the limitExtent
    theString += '<SPATIALFILTER relation="area_intersection">\n';
    theString += '<ENVELOPE maxx="' + limitRight + '" maxy="' + limitTop + '" minx="' + limitLeft + '" miny="' + limitBottom + '" />\n';
    theString += '</SPATIALFILTER>\n';
  }
  theString += '</SPATIALQUERY>';
  theString += '</GET_FEATURES>';
  theString += '</REQUEST>';
  theString += '</ARCXML>';
  selectLayer=ActiveLayer;
  selectType=ActiveLayerType;
  selectCount=0;
  hightlightedOne="";
  selectPoints.length=1;
  selectLeft.length=1;
  selectRight.length=1;
  selectTop.length=1;
  selectBottom.length=1;
  return theString;
  
}

// request a selection using a shape
function sendShapeSelect(theType) {
  queryStartRecord=0;
  selectionMode=3;
  showBuffer=false;
  if (theType==2) {
    if ((clickPointX[0]!=clickPointX[clickCount-1]) && (clickPointY[0]!=clickPointY[clickCount-1])) {
      clickPointX[clickCount]=clickPointX[0];
      clickPointY[clickCount]=clickPointY[0];
      clickCount=clickCount+1;
    }
  }
  showRetrieveData();
  var theString = writeShapeSelect(theType);
  sendToServer(imsQueryURL,theString,selectXMLMode);
}

//   // request more records to display
//   function getMoreData(startRecord) {
//     var theString = "";
//     queryStartRecord = startRecord;
//     if (selectionMode==1) {
//       //query
//       theString = writeQueryXML(setQueryString);
//     } else if (selectionMode==2) {
//       theString = writeGetFeatures3();
//     } else {
//       var theType = clickType-1;
//       theString = writeShapeSelect(theType);
//     }
//     showRetrieveData();
//     sendToServer(imsQueryURL,theString,selectXMLMode);
//   }

// refresh map with hightlighted selection
function showHighlight(selNum) {
    aimsSelectPresent=true;        
     var re = /%/g;
     setQueryString = setQueryString.replace(re,"");
     
     var re = / LIKE /g;
     setQueryString = setQueryString.replace(re," = ");

     pos1 = setQueryString.indexOf("&apos;");
     pos2 = setQueryString.substring(pos1+1).indexOf("&apos;");

     var k = setQueryString.substring(pos1,(pos1+pos2+7));     
     var re = new RegExp(k,"g");
     setQueryString = setQueryString.replace(re,"replace");     

     var k1 = "&apos;" +  theLocn[selNum].toUpperCase() +"&apos;"
     var re = new RegExp("replace","g");
     setQueryString = setQueryString.replace(re,k1);

    highlightedOne = LayerIDField[ActiveLayerIndex] + " = " + selectPoints[selNum];
    var fWidth = selectRight[selNum] - selectLeft[selNum];
    var fHeight = selectTop[selNum] - selectBottom[selNum];
    var mWMargin = 0;
    var mHMargin = 0;
    if (selectType=="point") {      
      mWMargin = fullWidth * selectPointMargin;
      mHMargin = fullHeight * selectPointMargin;
      if (mWMargin > xDistance/2) {
        mWMargin = xDistance/2;
        mHMargin = yDistance/2;
      }
    } else {
      mWMargin = fWidth * selectMargin;
      mHMargin = fHeight * selectMargin; 
    }
    saveLastExtent();
    left = selectLeft[selNum] - mWMargin;
    right = selectRight[selNum] + mWMargin;
    top = selectTop[selNum] + mHMargin;
    bottom = selectBottom[selNum] - mHMargin;    
    legendTemp=legendVisible;
    legendVisible=false; 
enforceMinimumExtent()    
    sendMapXML();
}

// clear current selection
function clearSelection() {
  var theCount = selectCount;
  var theHL = highlightedOne;
  selectCount=0;
  showBuffer=false;
  highlightedOne="";
  selectPoints.length=1;
  selectLeft.length=1;
  selectRight.length=1;
  selectTop.length=1;
  selectBottom.length=1;
  drawSelectBoundary=false;
  if (useTextFrame) {
    parent.TextFrame.document.open();
    parent.TextFrame.document.writeln('<html>');
    parent.TextFrame.document.writeln('<body bgcolor="white" text="Black" link="Blue" vlink="Blue">');
    if (toolMode==20) {
      updateMeasureBox()
      }
    else 
    parent.TextFrame.document.writeln('</body></html>');
    parent.TextFrame.document.close()
  } else {
    if (toolMode==20) {
      showLayer("measureBox");
      updateMeasureBox()
    }
  }
  hideLayer("measureBox");
  showGeocode=false;
  clickCount=0;
  totalMeasure=0;
  currentMeasure=0;
  legendTemp=legendVisible;
  legendVisible=false;
  selectBlurb="";
  showLayer("LoadMap");
  var theString = writeXML();
  sendToServer(imsURL,theString,99);
}

// add Draw Selected Features to Map XML request
function addSelectToMap(){
  var selString = "";
  if ((selectCount>0) && (showSelectedFeatures)) {
    selString +='<LAYER type="FeatureClass" name="Selected_Features" visible="true">\n';
    selString +='<DATASET fromlayer="' + LayerID[ActiveLayerIndex] + '" />\n';
    if (selectionMode==1) {
      selString +='<SPATIALQUERY  where="' + setQueryString + '"';
      if (useLimitExtent) {
        // keep this within the limitExtent
        
        selString +='>\n<SPATIALFILTER relation="area_intersection">\n';
        selString +='<ENVELOPE maxx="' + limitRight + '" maxy="' + limitTop + '" minx="' + limitLeft + '" miny="' + limitBottom + '" />\n';
        selString +='</SPATIALFILTER>\n';
        selString +='</SPATIALQUERY>\n';
      } else {
      selString +='/>\n';
      }
    
    } else {
      selString +='<SPATIALQUERY>\n';
      selString +='<SPATIALFILTER relation="area_intersection" >\n';
      if (selectionMode==2) {
        selString +='<ENVELOPE ' + selectEnvelope + ' />\n';
      } else {
        if (clickType==2) {
          selString +='<POLYLINE>\n<PATH>\n';
        } else if (clickType==3) {
          selString +='<POLYGON>\n<RING>\n';
        } else {
          selString +='<MULTIPOINT>\n';
        }
        for (var i=0;i<clickCount;i++) {
          selString +='<POINT x="' + clickPointX[i] + '" y="' + clickPointY[i] + '" />\n'; 
        }
        if (clickType==3) {
          //selString +='<POINT x="' + clickPointX[0] + '" y="' + clickPointY[0] + '" />\n';
          selString +='</RING>\n</POLYGON>\n';
        } else if (clickType==2) {
          selString +='</PATH>\n</POLYLINE>\n';
        } else {
          selString +='</MULTIPOINT>\n';
        }
      }
      selString +='</SPATIALFILTER>\n';
      ///*
      if (useLimitExtent) {
        // keep this within the limitExtent
        selString +='<SPATIALFILTER relation="area_intersection">\n';
        selString +='<ENVELOPE maxx="' + limitRight + '" maxy="' + limitTop + '" minx="' + limitLeft + '" miny="' + limitBottom + '" />\n';
        selString +='</SPATIALFILTER>\n';
      } 
      //*/
      selString +='</SPATIALQUERY>\n';
    }
    selString +='<SIMPLERENDERER>\n';
  
    if (selectType=="point") {
      selString +='<SIMPLEMARKERSYMBOL color="' + selectColor + '" type="Circle" width="10" />\n';
    } else if (selectType=="line") {
      selString +='<SIMPLELINESYMBOL type="SOLID" color="' + selectColor + '" width="3" />\n';
    } else {
      //selString +='<SIMPLEPOLYGONSYMBOL FILLCOLOR="' + selectColor + '" FILLTYPE="Gray" ';
      selString +='<SIMPLEPOLYGONSYMBOL fillcolor="' + selectColor + '" filltype="solid" transparency="' + transparentLevel + '" boundarycolor="255,255,0" boundarywidth="4" />\n';
    }
    selString +='</SIMPLERENDERER>\n';
    selString +='</LAYER>\n';  
  }
  
  
  if (selectBlurb!="") {
    // add SelectBlurb to Map XML request
    selString +='<LAYER type="FeatureClass" name="Selected_Features" visible="true">\n';
    //selString +='<DATASET fromlayer="' + ActiveLayer + '" />\n';
    //selString +='<DATASET fromlayer="' + LayerName[ActiveLayerIndex] + '" />\n';
    selString +='<DATASET fromlayer="' + LayerID[ActiveLayerIndex] + '" />\n';

    selString +='<QUERY where="' + selectBlurb + '" />\n';
    selString +='<SIMPLERENDERER>\n';
  
    if (selectType=="point") {
      selString +='<SIMPLEMARKERSYMBOL color="' + selectColor + '" type="Circle" width="10" />\n';
    } else if (selectType=="line") {
      selString +='<SIMPLELINESYMBOL type="SOLID" color="' + selectColor + '" width="3" />\n';
    } else {
      selString +='<SIMPLEPOLYGONSYMBOL fillcolor="' + selectColor + '" filltype="solid" transparency="' + transparentLevel + '" boundarycolor="255,255,255" boundarywidth="444" />\n';
      }
    selString +='</SIMPLERENDERER>\n';
    selString +='</LAYER>\n';
  
  }
  return selString;
}