// aimsIdentify.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*       dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js, aimsMap.js, and aimsLayers.js
*       To be interactive, dependent also on aimsDHTML.js, aimsClick.js, and aimsNavigation.js
*/

aimsIdentifyPresent=true;

// hyperlink variables
var currentHyperLinkLayer="";
var currentHyperLinkField="";
var currentHyperLinkPrefix="";
var currentHyperLinkSuffix="";
var hyperlinkWindowWidth=500;
var hyperlinkWindowHeight=400;

// variable for search tolerance... dynamically set in app
var searchTolerance=1/100;
// starting record position for returned records
var queryStartRecord=1;
var currentSelectCount=0;

if (imsQueryURL=="") {
    imsQueryURL= imsURL + "&CustomService=Query";
}

var canQuery=true;
var newSelectCount=0;
var selectPoints = new Array();

// can features be selected if invisible or not within layer scale threshholds?
var canSelectInvisible=false;

/*
***************************************************************************************

Identify functions

***************************************************************************************
*/

// identify feature
function identify(e) {
    if (checkIfActiveLayerAvailable()) {
       // parent.Debugger.write("aimsIdentify.identify(): " + highligthedOne + "<br>");
        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;
        var theString = writeGetFeatures(tempWest,tempSouth,tempEast,tempNorth);
        //if (useTextFrame) parent.TextFrame.document.location = "text.htm";
        //dbrptAcct_OWNER_FDesc(theString);
        showRetrieveData();
        sendToServer(imsQueryURL,theString,identifyXMLMode);
    }
}

// hyperlink from feature in active layer
function hyperLink(e) {
    if (checkIfActiveLayerAvailable()) {
        if (currentHyperLinkLayer!="") {
            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;
            var tempSwap = swapSelectFields;
            swapSelectFields=false;
            var tempSelect = selectFields;
            selectFields = LayerIDField[ActiveLayerIndex] + " " + LayerShapeField[ActiveLayerIndex] + " " + currentHyperLinkField;
            var theString = writeGetFeatures(tempWest,tempSouth,tempEast,tempNorth);
            selectFields = tempSelect;
            swapSelectFields=tempSwap;
            showRetrieveData();
            //if (useTextFrame) parent.TextFrame.document.location = "text.htm";
            sendToServer(imsQueryURL,theString,hyperlinkXMLMode);
        } else {
            dbrptAcct_OWNER_FDesc(msgList[47]);
        }
    }
}


// write out XML request to identify features
function writeGetFeatures(west1,south1,east1,north1) {
    var ActiveLayerType = dbLinkLayerType;
    if (swapSelectFields) {
        selectFields=selFieldList[ActiveLayerIndex];
    }
    var useString = writeIdentifyXML(ActiveLayer,ActiveLayerType,selectFields,west1,south1,east1,north1,maxFeaturesReturned,useLimitExtent);
    hightlightedOne="";
    return useString;
}

function writeIdentifyXML(theLayer,theLayerType,theFields,leftX,bottomY,rightX,topY,maxReturned,hasLimit) {
    var theString = '<ARCXML version="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" envelope="false" geometry="false" featurelimit="' + maxReturned + '">\n';
    theString += '<LAYER id="' + theLayer + '" />';
    theString += '<SPATIALQUERY subfields="' + theFields + '">';
    theString += '<SPATIALFILTER relation="area_intersection" >';
    theString += '<ENVELOPE maxy="' + forceComma(topY) + '" maxx="' + forceComma(rightX) + '" miny="' + forceComma(bottomY) + '" minx="' + forceComma(leftX) + '" />';
    theString += '</SPATIALFILTER>';
    theString += '</SPATIALQUERY>';
    if (hasLimit) {
        // keep this within the limitExtent
        theString += '<SPATIALFILTER relation="area_intersection">\n';
        theString += '<ENVELOPE maxx="' + forceComma(limitRight) + '" maxy="' + forceComma(limitTop) + '" minx="' + forceComma(limitLeft) + '" miny="' + forceComma(limitBottom) + '" />\n';
        theString += '</SPATIALFILTER>\n';
    }
    theString += '</GET_FEATURES>';
    theString += '</REQUEST>';
    theString += '</ARCXML>';
    // alert (theString);
    return theString;
}

// parse XML response for selected features
function displayAttributeData(theReply) {
    var tmpuseExternalWindow = useExternalWindow;
    useExternalWindow = false;
    var IDValueList = "";
    setLayerFields(ActiveLayerIndex);
    var theError = getXMLErrorMessage(theReply);
    var fList="";
    var lpos1 = 1;
    var lpos2 = 1;
    var epos = 1;
    var spos = 1;
    var morePoints=true;
    var moreFeatures=true;
    var featureCount = justGetFeatureCount(theReply);
    //alert(featureCount);
    var pos = 0;
    var startpos = 0;
    var endpos = xmlEndPos;
    var stillMore = false
    pos = theReply.indexOf('hasmore="true"',endpos);
    if (pos!=-1) stillMore = true;
    pos=0;
    var tempCount = 0;
    var selectedData="";
    var inData="";
    var xStr="";
    var yStr="";
    var tempString = "";
    var fCount = featureCount;
    //alert("aimsIdentify.displayAttributeData()[featurecount=" + featureCount + "]");
    selectCount = 0;
    var tempString="";
    var Win1 = parent.TextFrame;
    var theFrame = "parent.MapFrame";
    if (featureCount > 0) {
        newSelectCount += 1;
        if (showSelectedData) {
             //alert("aimsIdentify.displayAttributeData()[opening html page] " + useExternalWindow + "  "  + useTextFrame);
            if ((useExternalWindow) || (!useTextFrame)) {
                Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
                theFrame = "opener";
                if (parent.MapFrame!=null) theFrame = "opener.parent.MapFrame";
            } else {
                Win1 = parent.TextFrame;
                Win1.document.open();
            }
            Win1.document.open();
            Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head><title>' + titleList[7] + '</title></head>');
            //Win1.document.writeln('<body bgcolor="' + textFrameBackColor + '" text="Black" link="Blue" vlink="Gray" LEFTMARGIN=0 onload="window.focus()">');
            Win1.document.writeln('<body bgcolor="#2E81BE" text="Black" link="Blue" vlink="Gray" LEFTMARGIN=0 onload="window.focus()">');
            Win1.document.writeln('<center>');
            Win1.document.writeln('<FONT FACE="Arial" SIZE="-1"><b>' + LayerName[ActiveLayerIndex] + '</b></FONT>');
            Win1.document.writeln('<table border="1" cellspacing="0" cellpadding="2" nowrap bgcolor="' + tableBackColor + '">');
        }
        endpos = 1;

        for (var i=0;i<fCount;i++) {
            //alert(endpos);
            if (toolMode!=4) {
                var theXYs = getEnvelopeXYs(theReply, endpos)
                selectLeft[selectCount] = theXYs[0];
                selectBottom[selectCount] = theXYs[1];
                selectRight[selectCount] = theXYs[2];
                selectTop[selectCount] = theXYs[3];
                endpos = xmlEndPos;
            }
            //alert(endpos);
            inData = parseRecordString(theReply, endpos);
            endpos = xmlEndPos;
            //selectedData = clearLeadingSpace(inData);
            selectedData = inData;

            epos = theReply.indexOf("</FEATURE",endpos);
            if (showSelectedData) {
                //alert("2\n" + selectedData);
                var showHyper = false;
                if (hyperLinkLayers!=null) {
                    for (var s1=0;s1<hyperLinkLayers.length;s1++) {
                        if (hyperLinkLayers[s1] == LayerName[ActiveLayerIndex]) showHyper=true;
                    }
                }

                var fName1 = getFieldNames(selectedData);
                var fValue1 = getFieldValues(selectedData);
                selectPoints[selectCount] = getIdValue(fName1, fValue1);

                var idFieldNum = -1;
                var shapeFieldNum = -1;
                if (hideIDFieldData) {
                    // hide ID column header
                    for (var f=0;f<fName1.length;f++) {
                        if (fName1[f]==LayerIDField[ActiveLayerIndex]) idFieldNum = f;
                    }
                }

                if (hideShapeFieldData) {
                    // hide Shape column header
                    for (var f=0;f<fName1.length;f++) {
                        if (fName1[f]==LayerShapeField[ActiveLayerIndex]) shapeFieldNum = f;
                    }
                }

                if (selectCount==0) {
                    Win1.document.write('<tr><th><FONT FACE="Arial" SIZE="-2">' + msgList[86] + '</FONT></a></th>');
                    for (var f=0;f<fName1.length;f++) {
                        if ((f!=idFieldNum) && (f!=shapeFieldNum)) {
                            var f2 = -1;
                            if (useFieldAlias) {
                                for (var f3=0;f3<AliasFieldName.length;f3++) {
                                    if (AliasFieldName[f3]==fName1[f]) f2 = f3;
                                }
                            }
                            if (f2!=-1) {
                                Win1.document.write('<th><FONT FACE="Arial" SIZE="-2">' + AliasFieldAlias[f2] + '</FONT></a></th>');
                            } else {
                                Win1.document.write('<th><FONT FACE="Arial" SIZE="-2">' + fName1[f] + '</FONT></a></th>');
                            }
                        }
                    }
                    Win1.document.writeln('</tr>');
                }
                Win1.document.write('<tr><td>');
                if (toolMode!=4) Win1.document.write('<a href="javascript:' + theFrame + '.showHighlight(' + selectCount + ')">');
                Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + (selectCount+queryStartRecord) + '</FONT>');
                if (toolMode!=4) Win1.document.write('</a>');
                Win1.document.writeln('</td>');
                for (var f=0;f<fName1.length;f++) {
                    if ((f!=idFieldNum) && (f!=shapeFieldNum)) {
                        Win1.document.write('<TD>');
                        var isHyper=false;
                        if (showHyper) {
                            for (var s1=0;s1<hyperLinkFields.length;s1++) {
                                if (hyperLinkFields[s1]==fName1[f]) {
                                    var theLinkURL = currentHyperLinkPrefix + fValue1[f] + currentHyperLinkSuffix;
                                    Win1.document.write('<a href="' + theLinkURL + '" target="_blank">');
                                    isHyper=true;
                                }
                            }
                        }
                        var s2 = -1;
                        for (var s1=0;s1<LayerFields.length;s1++) {
                            if (fName1[f]==LayerFields[s1]) s2=s1;
                        }

                        if (fName1[f]==mapIDField)
                           IDValueList += fValue1[f] + ",";

                        if (LayerFieldType[s2]=="91") {
                            //alert(fName1[f]);
                            if (isNaN(fValue1[f])) {
                                var theDate = fValue1[f];
                            } else {
                                //var theDate = new Date(parseInt(fValue1[f]));
                                var theDateObj = new Date(parseFloat(fValue1[f]));
                                var d = theDateObj.toUTCString();
                                var theDate = d.replace(/GMT|UTC/,"");
                            }
                            Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + theDate + '</FONT>');
                            theDate=null;
                        } else {
                            // put html entity for spaces so display is correct - browsers trim extra spaces
                            tempString = fValue1[f].replace(/ /g, "&nbsp;");
                            Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + tempString + '</FONT>');
                            //Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + fValue1[f] + '</FONT>');
                        }
                        if (isHyper) Win1.document.write('</a>');
                        Win1.document.writeln('</td>');
                    }
                }
                Win1.document.writeln('</tr>');
                fName1 = null;
                fValue1 = null;

            }
            selectCount += 1;

        }
        if (showSelectedData) {

            Win1.document.writeln('</table><FONT FACE="Arial" SIZE="-2">');
            if (toolMode!=25) {
                if (queryStartRecord>1) {
                    var prevRecord = queryStartRecord - maxFeaturesReturned;
                    if (prevRecord<1) prevRecord=1;
                    Win1.document.write('<a href="javascript:' + theFrame + '.getMoreData(' + prevRecord + ')">' + msgList[61] + maxFeaturesReturned + msgList[62] + '</a>&nbsp;&nbsp;&nbsp;');
                }
                if (stillMore) {
                    var nextRecord=featureCount + queryStartRecord;
                    Win1.document.writeln('<a href="javascript:' + theFrame + '.getMoreData(' + nextRecord + ')">' + msgList[63] + '</a>');
                }
            }
            if ((toolMode!=4) && (toolMode!=25) && (selectCount>1)) {
                Win1.document.writeln('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="javascript:' + theFrame + '.zoomToReturnedRecords()">Zoom to these records</A></b>');
            }

            Win1.document.writeln('</font></center></body></html>');
            Win1.document.close();
        }
        //alert("toolMode:" + toolMode);

        if ((queryStartRecord==1) && (toolMode!=4) && (toolMode!=25)) {
            if ((selectCount==1) && (zoomToSingleSelect)) {
                var fWidth = selectRight[0] - selectLeft[0];
                var fHeight = selectTop[0] - selectBottom[0];
                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();
                eLeft = selectLeft[0] - mWMargin;
                eRight = selectRight[0] + mWMargin;
                eTop = selectTop[0] + mHMargin;
                eBottom = selectBottom[0] - mHMargin;
            }
            sendMapXML();
        }
        var rootpath = "http://" + window.location.hostname + window.location.pathname.substring(0, window.location.pathname.lastIndexOf("/"));
        rootpath += "/toc.asp?tt=data&IDValue=" + IDValueList.substring(0, IDValueList.length - 1);
        parent.TextFrame.document.location = appDir + "toc.asp?tt=data&IDValue=" + IDValueList.substring(0, IDValueList.length - 1);

    } else {
        //alert(tempString);
        if ((useExternalWindow) || (!useTextFrame)) {
            Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
        } else {
            Win1 = parent.TextFrame;
            Win1.document.open();
        }
        Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
        Win1.document.writeln(' <title>' + titleList[8] + '</title>');
        Win1.document.writeln('</head>');
        Win1.document.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
        Win1.document.writeln('<FONT FACE="Arial"><B>' + LayerName[ActiveLayerIndex] +'</B></font><FONT FACE="Arial" size="-2">');
        Win1.document.writeln('<br>' + msgList[64]);
        if (debugOn>0) {
            Win1.document.writeln('<p>' + msgList[65] + '<br>');
            Win1.document.writeln(untag(theReply));
        } else {
            if (theError!="") {
                Win1.document.writeln('<p>' + msgList[66] + '<br>');
                Win1.document.writeln(theError);
            }
        }
        Win1.document.writeln('</FONT>');
        Win1.document.writeln('</body></html>');
        Win1.document.close();
    }
    if (toolMode==4) selectCount=0;
    Win1=null;
    useExternalWindow = tmpuseExternalWindow;
    hideRetrieveData();
}

/*
  Builds the required envelope from the reply, gets the DB link fields from the
  reply, calls for a new map with the selected features showing using the new
  extent, and tells the TextFrame to update with the new data.
  @param theReply The arcXML reply with the features selected.
  @return displayDBDataFromMap null.
  @see aimsXML.processXML option 6
  */
function displayDBDataFromMap(theReply, XMLMode) {
    var t = parent.MapFrame;
    var tmpuseExternalWindow = useExternalWindow;
    useExternalWindow = false;
    var IDValueList = "";
    setLayerFields(ActiveLayerIndex);
    var theError = getXMLErrorMessage(theReply);
    var epos = 1;
    var spos = 1;
    var featureCount = justGetFeatureCount(theReply);
    var pos = 0;
    var tempCount = 0;
    var xStr="";
    var yStr="";
    var tempString = "";
    selectCount = 0;
    var tempString="";

    if (featureCount > 0) {
        endpos = 1;

        for (var i=0;i<featureCount;i++) {
            //alert(endpos);
            if (toolMode!=4) {
                var theXYs = getEnvelopeXYs(theReply, endpos)
                selectLeft[selectCount] = theXYs[0];
                selectBottom[selectCount] = theXYs[1];
                selectRight[selectCount] = theXYs[2];
                selectTop[selectCount] = theXYs[3];
                endpos = xmlEndPos;
            }
            selectCount += 1;
        }

       //parent.Debugger.document.write ("<br>aimsIdentify.displayDBDataFromMap(2): FeatureCount: " + featureCount);

        IDValueList = parseGISLinkFields(theReply, featureCount);

        if (currentSelectionState == 0)
            currentlySelectedFeatureID = IDValueList;
        else if(currentSelectionState == 1) {
            addIDsToSelectedList (IDValueList);
        } else if(currentSelectionState == 2) {
            removeIDsFromSelectedList (IDValueList);
        }

        legendVisible=false;
        layersVisible=false;

        // parent.Debugger.document.write ("aimsIdentify.displayDBDataFromMap(1): " + currentlySelectedFeatureID + "  FC: " + featureCount);

        if ((queryStartRecord==1) && (toolMode!=4) && (toolMode!=25)) {
            if ((selectCount==1) && (zoomToSingleSelect)) {
                var fWidth = selectRight[0] - selectLeft[0];
                var fHeight = selectTop[0] - selectBottom[0];
                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();
                eLeft = selectLeft[0] - mWMargin;
                eRight = selectRight[0] + mWMargin;
                eTop = selectTop[0] + mHMargin;
                eBottom = selectBottom[0] - mHMargin;
            }
            if ((currentSelectionState == 1) || (currentSelectionState == 2)) {
                selectionMode = 1;
            }
            sendMapXML();
        }

        // Trim the list of IDs down to the maximum list - the maximum is set in ArcIMSparam
        var sendLimitedFeatureList = limitFeatureIDsToRange(0, ((featureCount < maxFeaturesDisplayed) ? featureCount : maxFeaturesDisplayed));

        var URLString = "";
        var showMoreRecordURL = ""
        if (XMLMode==6)
            URLString = appDir + "toc.asp?tt=data&IDValue=" + sendLimitedFeatureList + "&Mode=Identify&ll=" + t.aimsLinkLabels + "&csv=" + t.aimsCSV;
        else
            URLString = appDir + "toc.asp?tt=data&IDValue=" + sendLimitedFeatureList + "&Mode=Buffer&ll=" + t.aimsLinkLabels + "&csv=" + t.aimsCSV;

        if (featureCount > maxFeaturesDisplayed)
            showMoreRecordURL = "&showMore=true&sms=1&smt=" + featureCount + "&smc=" + maxFeaturesDisplayed + "&sme=" + maxFeaturesDisplayed;
        else
            showMoreRecordURL = "&sms=1&smt=" + featureCount;

        parent.TextFrame.document.location = URLString + showMoreRecordURL;

    } else {
        parent.TextFrame.document.location = appDir + "toc.asp?tt=data&IDValue=0"
    }
    if (toolMode==4) selectCount=0;
    useExternalWindow = tmpuseExternalWindow;
    hideRetrieveData();
}

/*
 * Create a subset of the currently selected IDs to pass to the data view - the dataview
 *  is then responsible for handling Previous and Next Record requests.  maxFeaturesReturned is set in ArcIMSParams.
 */
function limitFeatureIDsToRange(listStart, listEnd) {
    var llist=""
    //parent.Debugger.document.write ("aimsIdentfy.limitFeatureIDsToRange: " + currentlySelectedFeatureID + " -- " + listEnd);
    var splitCurrentIDs = currentlySelectedFeatureID.split(",");
    for (var il=listStart; il<listEnd; il++)
        llist += splitCurrentIDs[il] + ","
    return llist.substring(0, llist.length -1);
}


function parseHyperLink(theReply) {
    //alert(theReply);
    var fList="";
    var lpos1 = 1;
    var lpos2 = 1;
    var pos = 0;
    var startpos = 0;
    var endpos = 0;
    var fString = theReply.substring(startpos,endpos);
    var featureCount = justGetFeatureCount(theReply);
    var linkString = "width=" + hyperlinkWindowWidth + ",height=" + hyperlinkWindowHeight + ",scrollbars=yes,resizable=yes"
    var selectedData="";
    var fCount = featureCount;
    //alert("displayAttributeData()[featurecount=" + featureCount + "]");
    selectCount = 0;
    var tempString="";
    if (featureCount > 0) {
        var searchStr = currentHyperLinkField + "=";

        newSelectCount += 1;

        endpos = 1;
        pos = theReply.indexOf(searchStr,1);
        startpos = pos + searchStr.length + 1;
        endpos =theReply.indexOf(dQuote,startpos);
        inData = theReply.substring(startpos,endpos);
        var theLinkURL = currentHyperLinkPrefix + inData + currentHyperLinkSuffix;
        if (parent.TextFrame!=null) {
            parent.TextFrame.document.open();
            parent.TextFrame.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
            parent.TextFrame.document.writeln(' <title>' + titleList[9] + 's</title>');
            parent.TextFrame.document.writeln('</head>');
            parent.TextFrame.document.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
            parent.TextFrame.document.writeln('<FONT FACE="Arial"><B>' + LayerName[ActiveLayerIndex] +'</B></font><FONT FACE="Arial" size="-2">');
            parent.TextFrame.document.writeln('<br>' + msgList[67] + theLinkURL );
            parent.TextFrame.document.writeln('</FONT>');
            parent.TextFrame.document.writeln('</body></html>');
            parent.TextFrame.document.close();
        }
        var Win1=open(theLinkURL,"",linkString);
    } else {

        //alert(tempString);
        if (parent.TextFrame!=null) {
            parent.TextFrame.document.open();
            parent.TextFrame.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
            parent.TextFrame.document.writeln(' <title>' + titleList[9] + '</title>');
            parent.TextFrame.document.writeln('</head>');
            parent.TextFrame.document.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
            parent.TextFrame.document.writeln('<FONT FACE="Arial"><B>' + LayerName[ActiveLayerIndex] +'</B></font><FONT FACE="Arial" size="-2">');
            parent.TextFrame.document.writeln('<br>' + msgList[68]);
            if (debugOn>0) {
                parent.TextFrame.document.writeln('<p>' + msgList[65] + '<br>');
                parent.TextFrame.document.writeln(untag(theReply));
            }
            parent.TextFrame.document.writeln('</FONT>');
            parent.TextFrame.document.writeln('</body></html>');
            parent.TextFrame.document.close();
        } else {
            var msg = msgList[69];
            if (debugOn>0) {
                msg = msg + msgList[9] + theReply;
            }
            alert(msg);
        }
    }
    hideRetrieveData();
}

// are there any selected features?
function checkSelected() {
    var isOk = false;
    if (selectCount>0) isOk = true;
    return isOk;
}

function checkHyperLinkLayer(layerIndex) {
    var canLink = false;
    //alert(hyperLinkLayers.length);
    for (var i=0; i<hyperLinkLayers.length; i++) {
            if (LayerName[layerIndex]==hyperLinkLayers[i]) {
                canLink=true;
                currentHyperLinkLayer=LayerName[layerIndex];
                currentHyperLinkField=hyperLinkFields[i];
                currentHyperLinkPrefix=hyperLinkPrefix[i];
                currentHyperLinkSuffix=hyperLinkSuffix[i];
            }
    }
    return canLink;

}

// check to see if active layer is in scale threshold and visible
    // so it can be used for querying
function checkIfActiveLayerAvailable() {
    // is the override flag set?
    if (canSelectInvisible) {
        return true;
    } else {
        // is the current scale within the scale min and max?
        if ((mapScaleFactor>=LayerMinScale[ActiveLayerIndex]) && (mapScaleFactor<=LayerMaxScale[ActiveLayerIndex])) {
            // is the active layer visible?
            if (LayerVisible[ActiveLayerIndex]==1) {
                return true;

            } else {
                var msg = msgList[104] + LayerName[ActiveLayerIndex] + msgList[102] + LayerName[ActiveLayerIndex] + msgList[108];

                alert(msg);
                return false;
            }
        } else {
            var msg = msgList[104] + LayerName[ActiveLayerIndex] + msgList[101];
            //if ((!listAllLayers) && (hasTOC)) msg += msgList[103];
            alert(msg);
            return false;
        }
    }
}


/**************************************************************
*   functions and variables for Identify All
*   drill down through visible layers
**************************************************************/

var replyArray = new Array();
var fID = 0;
var fIndex = 0;
var idEast;
var idWest;
var idSouth;
var idNorth;


// identify feature
function identifyAll(e) {
    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;
    for (var i=(LayerID.length-1);i>=0;i--) {
        replyArray[i]="";
        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";
        //alert(theString);
        showRetrieveData();
        sendToServer(imsQueryURL,theString,10);
    } else {
        alert(msgList[111]);
    }
}


function doIdentifyAll(theReply) {
    //drill tool loop sequence
    //alert(theReply);
   replyArray[fID] = theReply;
   fID++;
   if (fID < (LayerID.length)) {
        if ((mapScaleFactor>=LayerMinScale[fID]) && (mapScaleFactor<=LayerMaxScale[fID]) && (LayerVisible[fID]) && (LayerIsFeature[fID])) {
            theString = writeGetFeaturesDrill(idWest,idSouth,idEast,idNorth,fID);
            //alert(theString);
            sendToServer(imsQueryURL,theString,10);
        } else {
            doIdentifyAll("");
        }
   }

   if (fID == (LayerID.length)) {
    //createDrillPage = false;
    //replyArray.reverse();
    displayAttributeDataforDrill(replyArray);
    fID = 0;
    //var ActiveLayerIndex = 4;
   }
 }  //end doDrill()


 // write XML to identify features for drill ID
function writeGetFeaturesDrill(west1,south1,east1,north1,thefID) {
    if (swapSelectFields) {
        selectFields=selFieldList[thefID];
    }
    var useString = writeIdentifyXML(LayerID[thefID],LayerType[thefID],selectFields,west1,south1,east1,north1,maxFeaturesReturned,useLimitExtent);
    hightlightedOne="";
    return useString;
}

// parse XML response for drill functions
function displayAttributeDataforDrill(theReplyArray) {
   showRetrieveData();
    var theFrame = "parent.MapFrame";
    if ((useExternalWindow) || (!useTextFrame)) {
            var Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
            theFrame = "opener";
            if (parent.MapFrame!=null) theFrame = "opener.parent.MapFrame";
    } else {
            var Win1 = parent.TextFrame;
            Win1.document.open();
    }
    Win1.document.open();
    Win1.document.writeln('<html><head><title>Query/Selection Results</title></head>');
    Win1.document.writeln('<body bgcolor="' + textFrameBackColor + '" text="Black" link="Blue" vlink="Gray" LEFTMARGIN=0 onload="window.focus()"><center>');
    var lyrCount = 0;
     for (b=0;b<theReplyArray.length;b++) {
        if (theReplyArray[b]!="") {
            //alert(theReply);
            theReply = theReplyArray[b];
            setLayerFields(b);
            var theError = getXMLErrorMessage(theReply);
            var fList="";
            var lpos1 = 1;
            var lpos2 = 1;
            var epos = 1;
            var spos = 1;
            var morePoints=true;
            var moreFeatures=true;
            var featureCount = justGetFeatureCount(theReply);
            //alert(featureCount);
            var pos = 0;
            var startpos = 0;
            var endpos = xmlEndPos;
            var stillMore = false
            pos = theReply.indexOf('hasmore="true"',endpos);
            if (pos!=-1) stillMore = true;
            pos=0;
            var tempCount = 0;
            var selectedData="";
            var inData="";
            var xStr="";
            var yStr="";
            var fCount = featureCount;
            //alert("displayAttributeData()[featurecount=" + featureCount + "]");
            selectCount = 0;
            var tempString="";
            if (featureCount > 0) {
                //alert(featureCount);
                newSelectCount += 1;
                endpos = 1;
                Win1.document.writeln('<center><br><FONT FACE="Arial" SIZE="-1"><b>' + LayerName[b] + '</b><br>');
                Win1.document.writeln('<table border="1" size="95%" cellspacing="0" cellpadding="2" nowrap bgcolor="' + tableBackColor + '">');
                for (var i=0;i<fCount;i++) {

                    inData = parseRecordString(theReply, endpos);
                    endpos = xmlEndPos;
                    //selectedData = clearLeadingSpace(inData);
                    selectedData = inData;

                    epos = theReply.indexOf("</FEATURE",endpos);
                    if (showSelectedData) {
                        //alert("2\n" + selectedData);
                        var showHyper = false;
                        if (hyperLinkLayers!=null) {
                            for (var s1=0;s1<hyperLinkLayers.length;s1++) {
                                if (hyperLinkLayers[s1] == LayerName[b]) showHyper=true;
                            }
                        }

                        var fName1 = getFieldNames(selectedData);
                        var fValue1 = getFieldValues(selectedData);
                        //selectPoints[selectCount] = getIdValue(fName1, fValue1);
                        var idFieldNum = -1;
                        var shapeFieldNum = -1;
                        if (hideIDFieldData) {
                            // hide ID column header
                            for (var f=0;f<fName1.length;f++) {
                                if (fName1[f]==LayerIDField[ActiveLayerIndex]) idFieldNum = f;
                            }
                        }
                        if (hideShapeFieldData) {
                            // hide Shape column header
                            for (var f=0;f<fName1.length;f++) {
                                if (fName1[f]==LayerShapeField[ActiveLayerIndex]) shapeFieldNum = f;
                            }
                        }
                        if (selectCount==0) {
                            Win1.document.write('<tr><th><FONT FACE="Arial" SIZE="-2">Rec</FONT></a></th>');
                            for (var f=0;f<fName1.length;f++) {
                                if ((f!=idFieldNum) && (f!=shapeFieldNum)) {
                                    var f2 = -1;
                                    if (useFieldAlias) {
                                        for (var f3=0;f3<AliasFieldName.length;f3++) {
                                            if (AliasFieldName[f3]==fName1[f]) f2 = f3;
                                        }
                                    }
                                    if (f2!=-1) {
                                        Win1.document.write('<th><FONT FACE="Arial" SIZE="-2">' + AliasFieldAlias[f2] + '</FONT></a></th>');
                                    } else {
                                        Win1.document.write('<th><FONT FACE="Arial" SIZE="-2">' + fName1[f] + '</FONT></a></th>');
                                    }
                                }
                            }
                            Win1.document.writeln('</tr>');
                        }
                        Win1.document.write('<tr><td>');
                        Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + (selectCount+queryStartRecord) + '</FONT>');
                        Win1.document.writeln('</td>');
                        for (var f=0;f<fName1.length;f++) {
                            if ((f!=idFieldNum) && (f!=shapeFieldNum)) {
                                Win1.document.write('<TD>');
                                var isHyper=false;
                                if (showHyper) {
                                    for (var s1=0;s1<hyperLinkFields.length;s1++) {
                                        if (hyperLinkFields[s1]==fName1[f]) {
                                            Win1.document.write('<a href="' + fValue1[f] + '" target="_blank">');
                                            isHyper=true;
                                        }
                                    }
                                }
                                var s2 = -1;
                                for (var s1=0;s1<LayerFields.length;s1++) {
                                    if (fName1[f]==LayerFields[s1]) s2=s1;
                                }
                                if (LayerFieldType[s2]=="91") {
                                    //alert(fName1[f]);
                                    if (isNaN(fValue1[f])) {
                                        var theDate = fValue1[f];
                                    } else {
                                        //var theDate = new Date(parseInt(fValue1[f]));
                                        var theDateObj = new Date(parseFloat(fValue1[f]));
                                        var d = theDateObj.toUTCString();
                                        var theDate = d.replace(/GMT|UTC/,"");
                                    }
                                    Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + theDate + '</FONT>');
                                    theDate=null;
                                } else {
                                    Win1.document.write('<FONT FACE="Arial" SIZE="-2">' + fValue1[f] + '</FONT>');
                                }
                                if (isHyper) Win1.document.write('</a>');
                                Win1.document.writeln('</td>');
                            }
                        }
                        Win1.document.writeln('</tr>');
                        fName1 = null;
                        fValue1 = null;
                    }
                    selectCount += 1;
                    //
                }
                Win1.document.writeln('</table></center>');
                lyrCount++

            } else {
                if (listAllLayersInIDAll) {
                    Win1.document.writeln('<center><FONT FACE="Arial" SIZE="-1"><b>' + LayerName[b] + '</b>');
                    Win1.document.writeln('<br>' + msgList[64] + '<br><br></font></center>');
                }

            }
        }
      }//end for

      if (lyrCount==0) {
            Win1.document.writeln('<center><FONT FACE="Arial" SIZE="-1"><b>' + msgList[112] + '</b></font></center>');
      }

    Win1.document.writeln('</body></html>');
    Win1.document.close();
    Win1=null;
    hideRetrieveData();
} //end function


// checks if any layer has hyperlink at location and links to first one matching
function hyperLinkAny(e) {
    if (hyperLinkLayers.length>0) {
        var j = -1;
        fIndex = 0;
        for (var i=layerCount-1;i>-1;i--) {

            if ((mapScaleFactor>=LayerMinScale[i]) && (mapScaleFactor<=LayerMaxScale[i]) && (LayerVisible[i]==1)) {
                fIindex = -1;
                for (var k = hyperLinkLayers.length-1;k>-1;k--) {
                    if (hyperLinkLayers[k]==LayerName[i]) {
                        fIndex = k;
                        j = i;
                    }
                }
            }

        }
        if (j>-1) {
            fID = j;
            highlightedOne="";
            var theX = mouseX;
            var theY = mouseY;
            getMapXY(theX,theY);
            searchTolerance = (xDistance/iWidth) * pixelTolerance;
            var west1 = mapX - searchTolerance;
            var north1 = mapY + searchTolerance;
            var east1 = mapX + searchTolerance;
            var south1 = mapY - searchTolerance;
            idSouth = south1;
            idNorth = north1;
            idWest = west1;
            idEast = east1;
            var tempSwap = swapSelectFields;
            swapSelectFields=false;
            var tempSelect = selectFields;
            selectFields = LayerIDField[fID] + " " + LayerShapeField[fID] + " " + hyperLinkFields[fIndex];
            var theString = writeIdentifyXML(LayerID[fID],LayerType[fID],selectFields,west1,south1,east1,north1,maxFeaturesReturned,useLimitExtent);

            selectFields = tempSelect;
            swapSelectFields=tempSwap;
            showRetrieveData();
            //if (useTextFrame) parent.TextFrame.document.location = "text.htm";
            sendToServer(imsQueryURL,theString,16);

        } else {
            alert(msgList[114]);
        }
    } else {
        alert(msgList[115]);
    }
}

function parseHyperLinkAny(theReply) {
    //alert(theReply);
    var fList="";
    var lpos1 = 1;
    var lpos2 = 1;
    var pos = 0;
    var startpos = 0;
    var endpos = 0;
    var fString = theReply.substring(startpos,endpos);
    var featureCount = justGetFeatureCount(theReply);
    var linkString = "width=" + hyperlinkWindowWidth + ",height=" + hyperlinkWindowHeight + ",scrollbars=yes,resizable=yes"
    var selectedData="";
    var fCount = featureCount;
    //alert("displayAttributeData()[featurecount=" + featureCount + "]");
    selectCount = 0;
    var tempString="";
    if (featureCount > 0) {
        var searchStr = hyperLinkFields[fIndex] + "=";

        newSelectCount += 1;

        endpos = 1;
        pos = theReply.indexOf(searchStr,1);
        startpos = pos + searchStr.length + 1;
        endpos =theReply.indexOf(dQuote,startpos);
        inData = theReply.substring(startpos,endpos);
        var theLinkURL = hyperLinkPrefix[fIndex] + inData + hyperLinkSuffix[fIndex];
        if (parent.TextFrame!=null) {
            parent.TextFrame.document.open();
            parent.TextFrame.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
            parent.TextFrame.document.writeln(' <title>' + titleList[9] + 's</title>');
            parent.TextFrame.document.writeln('</head>');
            parent.TextFrame.document.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
            parent.TextFrame.document.writeln('<FONT FACE="Arial"><B>' + LayerName[fID] +'</B></font><FONT FACE="Arial" size="-2">');
            parent.TextFrame.document.writeln('<br>' + msgList[67] + theLinkURL );
            parent.TextFrame.document.writeln('</FONT>');
            parent.TextFrame.document.writeln('</body></html>');
            parent.TextFrame.document.close();
        }
        var Win1=open(theLinkURL,"",linkString);
    } else if (fID<layerCount) {
            fID++;
            var j = -1;
            if ((mapScaleFactor>=LayerMinScale[fID]) && (mapScaleFactor<=LayerMaxScale[fID]) && (LayerVisible[fID]==1)) {
                fIindex = -1;
                for (var k = hyperLinkLayers.length-1;k>-1;k--) {
                    if (hyperLinkLayers[k]==LayerName[fID]) {
                        fIndex = k;
                        j = fID;
                    }
                }
            }
            if (j>-1) {
                var tempSwap = swapSelectFields;
                swapSelectFields=false;
                var tempSelect = selectFields;
                selectFields = LayerIDField[fID] + " " + LayerShapeField[fID] + " " + hyperLinkFields[fIndex];
                var theString = writeIdentifyXML(LayerID[fID],LayerType[fID],selectFields,idWest,idSouth,idEast,idNorth,maxFeaturesReturned,useLimitExtent);

                selectFields = tempSelect;
                swapSelectFields=tempSwap;
                showRetrieveData();
                //if (useTextFrame) parent.TextFrame.document.location = "text.htm";
                sendToServer(imsQueryURL,theString,16);
            } else {
                parseHyperLinkAny("");
            }


    } else {

        //alert(tempString);
        if (parent.TextFrame!=null) {
            parent.TextFrame.document.open();
            parent.TextFrame.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
            parent.TextFrame.document.writeln(' <title>' + titleList[9] + '</title>');
            parent.TextFrame.document.writeln('</head>');
            parent.TextFrame.document.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
            parent.TextFrame.document.writeln('<FONT FACE="Arial" size="-1">');
            //parent.TextFrame.document.writeln('<B>' + LayerName[ActiveLayerIndex] +'</B></font><FONT FACE="Arial" size="-2">');
            parent.TextFrame.document.writeln('<br>' + msgList[116]);
            /*
            if (debugOn>0) {
                parent.TextFrame.document.writeln('<p>' + msgList[65] + '<br>');
                parent.TextFrame.document.writeln(untag(theReply));
            }
            */
            parent.TextFrame.document.writeln('</FONT>');
            parent.TextFrame.document.writeln('</body></html>');
            parent.TextFrame.document.close();
        } else {
            var msg = msgList[69];
            if (debugOn>0) {
                msg = msg + msgList[9] + theReply;
            }
            alert(msg);
        }
    }
    hideRetrieveData();
}


