// aimsLayers.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*               dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js, aimsMap.js,
*               aimsDHTML.js
*/

aimsLayersPresent=true;

var LayerName = new Array();
var LayerID = new Array();
var LayerVisible = new Array();
var LayerType = new Array();
var LayerIsFeature = new Array();
var LayerExtent = new Array();
var LayerMinScale = new Array();
var LayerMaxScale = new Array();
var LayerRenderString = new Array();
var LayerShapeField = new Array();
var LayerIDField = new Array();
var LayerFieldList = new Array();
var LayerFieldTypeList = new Array();
var LayerFieldSizeList = new Array();
var LayerFieldPrecisionList = new Array();
var LayerFields = new Array();
var LayerFieldType = new Array();
var LayerFieldCount=0;
var ActiveLayer="";
var ActiveLayerType="";
var layerCount = 0;
var layerLeft = 0;
var layerRight = 0;
var layerTop = 0;
var layerBottom = 0;
var fieldIndex = 0;
var fieldIndex1 = 0;
var fieldIndex2 = 0;
var fieldIndex3 = 0;
var fieldIndex4 = 0;
var QueryOperator = new Array();
var QueryLineOperator = new Array();
var QueryValue = new Array();
var FeatureLayerCount = 0;

QueryOperator[0] = 0;
QueryOperator[1] = 0;
QueryOperator[2] = 0;
QueryOperator[3] = 0;
QueryLineOperator[0] = 0;
QueryLineOperator[1] = 0;
QueryLineOperator[2] = 0;
QueryValue[0] = "";
QueryValue[1] = "";
QueryValue[2] = "";
QueryValue[3] = "";

        // field aliases arrays
var AliasFieldName = new Array();
var AliasFieldAlias = new Array();

var LayerListOpen=false;
var queryOpen = false;

var displayLayerInfoButton=false;

var setLayerVisible = new Array();

//point d'interet
var pointInt = false;

// check for query form. . . if present, update field list
function setActiveLayer(i) {
        fieldIndex=0;
        selectCount=0;
        showBuffer=false;
        ActiveLayer=LayerID[i];
        //alert(ActiveLayer);
        ActiveLayerType=LayerType[i];
        ActiveLayerIndex=i;
        setLayerFields(i);

        if (useGeocode) {
                // if active layer is geocodeable - set current geocode layer to active layer
                if (GCLayerCount>0) {
                        var j =-1;
                        for (var k=0;k<GCLayerId.length;k++) {
                                if (ActiveLayer==GCLayerId[k]) j=k;
                        }
                        if (j!=-1) {
                                GCActiveLayer=j;
                        }
                }
        }
        
        if (queryOpen) {
                queryForm();
        }
        
        
        
        //alert("i: ds aimsLayer.js  " + i + "\nLayerName[ActiveLayerIndex]:   " + LayerName[ActiveLayerIndex]);
        
        
}

// write out form for layerList in separate window
function writeLayerListForm() {
        var Win1 = open(appDir + "toc.htm","LayerListWindow","width=190,height=300,scrollbars=yes,resizable=yes");
        Win1.focus();
        Win1=null;

}

// set up the LayerVisible array for map display
function setupLayerVisible() {
        var toggleCount = LayerVisible.length;
        if (setLayerVisible.length<toggleCount) toggleCount = setLayerVisible.length;
        for (var i=0;i<toggleCount;i++) {
                LayerVisible[i] = setLayerVisible[i];
        }
}



// get list of layers, id/shape fields, scalefactors, etc.
function getLayers(theReply) {
        var theReplyUC = theReply.toUpperCase();
        LayerFields.length = 1;
        var startpos = 0;
        var endpos = 0;
        layerCount = 0;
        var pos = -1;
        var lpos = 1;
        var epos = 1;
        var zpos=1;
        var zpos2 = 1;
        var tempString="";
        var visString = "";
        var typeString="";
        var fieldString = "";
        var testString = "";
        var testString2 = "";
        var minString = "";
        var maxString = "";
        var fieldCount = 0;
        LayerName.length=1;
        LayerType.length=1;
        LayerVisible.length=1;
        LayerExtent.length=1;
        LayerIsFeature.length=1;
        LayerID.length=1;
        LayerIDField.length=1;
        LayerShapeField.length=1;
        LayerMinScale.length=1;
        LayerMaxScale.length=1;
        LayerFieldTypeList.length=1;
        LayerFieldList.length=1;
        LayerRenderString.length=1;
        LayerFieldSizeList.length=1;
        LayerFieldPrecisionList.length=1;
        layerCount = 0;
        var layerMinX=0;
        var layerMinY=0;
        var layerMaxX=0;
        var layerMaxY=0;
        lpos = theReplyUC.indexOf("<LAYERINFO",zpos);

        while (lpos > -1) {
                
                if (lpos != -1) {
                        
                        zpos = theReplyUC.indexOf("</LAYERINFO",lpos);
                        if (zpos!=-1) {
                                pos = theReplyUC.indexOf("NAME=",lpos);
                                if (pos != -1) {
                                        startpos = pos + 6;
                                        endpos = theReply.indexOf(dQuote, startpos);
                                        tempString = theReply.substring(startpos,endpos);
                                        tempString = tempString.replace(/&apos;/g, "'");
                                        LayerName[layerCount] = tempString;
                                        testString2 = 'TYPE="FEATURECLASS"';
                                        pos = theReplyUC.indexOf(testString2,lpos);
                                        if ((pos != -1) && (pos<zpos)) 
                                                LayerIsFeature[layerCount]=true;
                                        else LayerIsFeature[layerCount]=false;
                                        startpos = theReplyUC.indexOf("VISIBLE=",lpos);
                                        if (startpos != -1) {
                                                startpos = startpos + 9;
                                                endpos = startpos + 4;
                                                visString = theReply.substring(startpos,endpos);
                                        }
                                        startpos = theReplyUC.indexOf("ID=",lpos);
                                        if ((startpos != -1) && (startpos<zpos)) {
                                                startpos = startpos + 4;
                                                endpos = theReply.indexOf(dQuote, startpos);
                                                tempString = theReply.substring(startpos,endpos);
                                                tempString = tempString.replace(/&apos;/g, "'");
                                                LayerID[layerCount] = tempString;
                                        } else {
                                                LayerID[layerCount] = LayerName[layerCount];
                                        }
                                        if (visString=="true") {LayerVisible[layerCount] = 1} else {LayerVisible[layerCount] = 0};
                                        startpos = theReplyUC.indexOf("MINSCALE=",lpos);
                                        if ((startpos != -1) && (startpos<zpos)) {
                                                startpos += 10;
                                                endpos = theReply.indexOf(dQuote, startpos);
                                                minString = theReply.substring(startpos,endpos);
                                                minString = setDecimalString(minString);
                                                LayerMinScale[layerCount] = parseFloat(minString);
                                        } else {
                                                LayerMinScale[layerCount] = 0;
                                        }
                                        startpos = theReplyUC.indexOf("MAXSCALE=",lpos);
                                        if ((startpos != -1) && (startpos<zpos)) {
                                                startpos += 10;
                                                endpos = theReply.indexOf(dQuote, startpos);
                                                maxString = theReply.substring(startpos,endpos);
                                                maxString = setDecimalString(maxString);
                                                LayerMaxScale[layerCount] = parseFloat(maxString);
                                        } else {
                                                LayerMaxScale[layerCount] = 1.7976931348623157E308;
                                        }
                                        if (LayerIsFeature[layerCount]) {
                                                startpos = theReplyUC.indexOf("<FCLASS TYPE=",lpos);
                                                zpos2= theReplyUC.indexOf("</FCLASS",lpos);
                                                if (startpos != -1) {
                                                        startpos = startpos+14;
                                                        endpos = theReply.indexOf(dQuote, startpos);
                                                        typeString = theReply.substring(startpos,endpos);
                                                } else {
                                                        typeString = "image";
                                                }
                                        } else {
                                                typeString = "image";
                                        }
                                        LayerType[layerCount] = typeString;
                                        
                                        var theXYs = getEnvelopeXYs(theReply, lpos);
                                        tempString = theXYs[0] + "|" + theXYs[1] + "|" + theXYs[2] + "|" + theXYs[3];
                                        endpos = xmlEndPos;
                                        theXYs=null;
                                        LayerExtent[layerCount] = tempString;
                                        LayerFieldList[layerCount] = "";
                                        LayerFieldTypeList[layerCount] = "";
                                        LayerFieldSizeList[layerCount] = "";
                                        LayerFieldPrecisionList[layerCount] = "";
                                        LayerIDField[layerCount] = "";
                                        LayerShapeField[layerCount] = "";
                                        if (LayerIsFeature[layerCount]) {
                                                var jpos = 1;
                                                var fldCount = 0;
                                                FeatureLayerCount += 1;
                                                while ((jpos<zpos) && (jpos!=-1)) {
                                                        jpos = theReply.indexOf("<FIELD name=",endpos);
                                                        if (zpos2 > jpos) {
                                                                
                                                                if (jpos != -1) {
                                                                        startpos = jpos + 13
                                                                        endpos = theReply.indexOf(dQuote, startpos);
                                                                        tempString = theReply.substring(startpos,endpos);
                                                                        
                                                                        startpos = theReply.indexOf("type=",endpos);
                                                                        startpos= startpos + 6;
                                                                        endpos = theReply.indexOf(dQuote, startpos);
                                                                        testString = theReply.substring(startpos,endpos);
                                                                        if (testString=="-99") LayerIDField[layerCount] = tempString;
                                                                        if (testString=="-98") LayerShapeField[layerCount] = tempString;
                                                                        if (fldCount>0) {
                                                                                LayerFieldList[layerCount] = LayerFieldList[layerCount] + ",";
                                                                                LayerFieldTypeList[layerCount] = LayerFieldTypeList[layerCount] + ",";
                                                                                LayerFieldSizeList[layerCount] = LayerFieldSizeList[layerCount] + ",";
                                                                                LayerFieldPrecisionList[layerCount] = LayerFieldPrecisionList[layerCount] + ",";
                                                                        }
                                                                        LayerFieldList[layerCount] = LayerFieldList[layerCount] + tempString ;
                                                                        LayerFieldTypeList[layerCount] = LayerFieldTypeList[layerCount] +  testString;
                                                                        startpos = theReply.indexOf("size=",jpos);
                                                                        startpos= startpos + 6;
                                                                        endpos = theReply.indexOf(dQuote, startpos);
                                                                        testString = theReply.substring(startpos,endpos);
                                                                        LayerFieldSizeList[layerCount] = LayerFieldSizeList[layerCount] +  testString;
                                                                        startpos = theReply.indexOf("precision=",jpos);
                                                                        startpos += 11;
                                                                        endpos = theReply.indexOf(dQuote, startpos);
                                                                        testString = theReply.substring(startpos,endpos);
                                                                        LayerFieldPrecisionList[layerCount] = LayerFieldPrecisionList[layerCount] +  testString;
                                                                        
                                                                        fldCount += 1;
                                                                        
                                                                }
                                                                
                                                        }
                                                        else {
                                                                // search for next Layer
                                                                endpos = zpos;
                                                                jpos = -1;
                                                                
                                                        }
                                                }
                                                if (ClassRenderLayer.length>0) {
                                                        var sr1 = -1
                                                        for (var u=0;u<ClassRenderLayer.length;u++) {
                                                                if (ClassRenderLayer[u]==LayerName[layerCount]) sr1=u;
                                                        }
                                                        if (sr1>-1) {
                                                                LayerRenderString[layerCount] = ClassRenderString[sr1];
                                                        } else {
                                                                LayerRenderString[layerCount]="";
                                                        }
                                                }
                                        
                                        } else {
                                                LayerRenderString[layerCount]="";
                                        }
                                        layerCount += 1;
                                        endpos = zpos;
                                        
                                }
                                lpos = theReplyUC.indexOf("<LAYERINFO",zpos);
                        } else {
                                lpos = -1;
                        }
                        
                }
        }
        LayerName.reverse();
        LayerVisible.reverse();
        LayerType.reverse();
        LayerIDField.reverse();
        LayerShapeField.reverse();
        LayerExtent.reverse();
        LayerIsFeature.reverse();
        LayerMinScale.reverse();
        LayerMaxScale.reverse();
        LayerFieldTypeList.reverse();
        LayerFieldList.reverse();
        LayerFieldSizeList.reverse();
        LayerFieldPrecisionList.reverse();
        LayerID.reverse();
        LayerRenderString.reverse();
        if (ActiveLayerIndex>=layerCount) {
                ActiveLayerIndex = 0;
        }
        if (!LayerIsFeature[ActiveLayerIndex]) {
                var chk = 0;
                
                for (var i=layerCount-1;i>=0;i--) {
                        if (LayerIsFeature[i]) chk = i;
                }
                ActiveLayerIndex = chk;
        }
        ActiveLayer = LayerID[ActiveLayerIndex];
        ActiveLayerType = LayerType[ActiveLayerIndex];
        if (FeatureLayerCount==0) {
                canQuery=false;
                useZoomActive=false;
                useIdentify=false;
                useSelect=false;
                useQuery=false;
                useFind=false;
                useBuffer=false;
                useStoredQuery=false;
                useHyperLink=false;
                queryZoom=false;
        }
        if (noListLayer.length<LayerName.length) {
                noListLayer.length = LayerName.length;
                for (var i=0;i<LayerName.length;i++) {
                        if (noListLayer[i]==null) {
                                noListLayer[i]=false;
                        }
                }
        }
}

// set the Layer Field array using the current Active Layer's fields
function setLayerFields(layerIndex) {
        LayerFields.length=1;
        LayerFieldType.length=1;
        var tempList = new Array();
        if (swapSelectFields) {
                selectFields=selFieldList[layerIndex];
                if (!selectFields)
                        alert("selFieldList " + layerIndex);
        }
        if (LayerFieldList[layerIndex]!="") {
                if (useFieldAlias) {
                        AliasFieldName.length=0;
                        AliasFieldAlias.length=0;
                        var msg = LayerName[layerIndex] + " - aliases: ";
                        if (fieldAliasList[layerIndex]!=null) {
                                if (fieldAliasList[layerIndex]!="") {
                                        if (fieldAliasList[layerIndex].indexOf("|")==-1) {
                                                var tempPair = fieldAliasList[layerIndex].split(":");
                                                AliasFieldName[0] = tempPair[0];
                                                AliasFieldAlias[0] = tempPair[1];
                                                msg += fieldAliasList[layerIndex];
                                                tempPair=null;
                                        } else {
                                                tempList = fieldAliasList[layerIndex].split("|");
                                                for (var i=0;i<tempList.length;i++) {
                                                        var tempPair = tempList[i].split(":");
                                                        AliasFieldName[i] = tempPair[0];
                                                        AliasFieldAlias[i] = tempPair[1];
                                                        msg += tempList[i] + " ";
                                                
                                                }
                                        }
                                } else {
                                        AliasFieldName[0] = "";
                                        AliasFieldAlias[0] = "";
                                }
                        } else {
                                AliasFieldName[0] = "";
                                AliasFieldAlias[0] = "";                        
                        }
                }
                var fList = LayerFieldList[layerIndex].split(",");
                var ftList = LayerFieldTypeList[layerIndex].split(","); 
                var fieldCount = 0;
                for (var i=0;i<fList.length;i++) {
                        var useIt = selectFields.toUpperCase().indexOf(fList[i].toUpperCase());
                        if ((useIt!=-1) || (selectFields=="#ALL#")) {
                                if (fList[i].toUpperCase()!=LayerShapeField[layerIndex].toUpperCase()) {
                                        LayerFields[fieldCount] = fList[i];
                                        LayerFieldType[fieldCount] = ftList[i];
                                        fieldCount += 1;
                                }
                        }
                }
                LayerFieldCount=fieldCount;
                canQuery=true;
                fList=null;
                ftList=null;
        } else {
                alert(msgList[21]);
                canQuery=false;
        
        }
}

// get the Field names from the LayerFieldList array
function getLayerFieldNames(layerIndex) {
        if (LayerFieldList[layerIndex]!="") {
                var fList = LayerFieldList[layerIndex].split(",");
        } else {
                var fList=null;
        } 
        return fList;
}

// get the Field types from the LayerFieldTypeList array
function getLayerFieldTypes(layerIndex) {
        if (LayerFieldList[layerIndex]!="") {
                var ftList = LayerFieldTypeList[layerIndex].split(","); 
        } else {
                var ftList=null;
        } 
        return ftList;
}

// get the Field types from the LayerFieldTypeList array
function getLayerFieldSizes(layerIndex) {
        if (LayerFieldList[layerIndex]!="") {
                var ftList = LayerFieldSizeList[layerIndex].split(","); 
        } else {
                var ftList=null;
        } 
        return ftList;
}

// get the Field types from the LayerFieldTypeList array
function getLayerFieldPrecisions(layerIndex) {
        if (LayerFieldList[layerIndex]!="") {
                var ftList = LayerFieldPrecisionList[layerIndex].split(",");    
        } else {
                var ftList=null;
        } 
        return ftList;
}


// display layer information
function showLayerInfo(layerIndex) {
        if ((useExternalWindow) || (!useTextFrame)) {
                Win1 = window.open("","QueryWindow","width=575,height=250,scrollbars=yes,resizable=yes");
                theFrame = "opener";
                if (parent.MapFrame!=null) theFrame = "opener.parent.MapFrame";
        } else {
                Win1 = parent.TextFrame;
                Win1.document.open();
        }
        Win1.document.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head><title>' + titleList[2] + ' - ' + LayerName[layerIndex] + '</title></head>');
        Win1.document.writeln('<body bgcolor="' + textFrameBackColor + '" text="Black" link="Blue" vlink="Gray" LEFTMARGIN=0 onload="window.focus()">');
        Win1.document.writeln('<center><FONT FACE="Arial" SIZE="-1"><b>' + titleList[2] +'</b>');
        Win1.document.writeln('<table border="1" cellspacing="0" cellpadding="2" nowrap bgcolor="' + tableBackColor + '">');
        
        Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>' + msgList[22] + '</b></font></td><TD COLSPAN="3"><FONT FACE="Arial" SIZE="-1">' +  LayerName[layerIndex] + '</td></tr>');
        Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>' + msgList[23] + '</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">' +  LayerID[layerIndex] + '</td></tr>');
        Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>' + msgList[24] + '</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">');
        if (LayerIsFeature[layerIndex]) {
                Win1.document.write('Feature - ' + LayerType[layerIndex]);
        } else {
                Win1.document.write('Image');
        }
        Win1.document.writeln('</td></tr>');
        Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>' + msgList[25] + '</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">' +  LayerExtent[layerIndex] + '</td></tr>');
        Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>' + msgList[26] + '</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">' +  LayerMinScale[layerIndex] + '</td></tr>');
        Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>' + msgList[27] + '</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">' +  LayerMaxScale[layerIndex] + '</td></tr>');
        if (LayerIsFeature[layerIndex]) {
                
                var fieldNames = getLayerFieldNames(layerIndex);
                var fieldTypes = getLayerFieldTypes(layerIndex);
                var fieldSizes = getLayerFieldSizes(layerIndex);
                var fieldPrecisions = getLayerFieldPrecisions(layerIndex);
                if (fieldNames!=null) {
                        Win1.document.writeln('<tr><TD COLSPAN="4"><FONT FACE="Arial" SIZE="-1"><b>&nbsp;</b></font></TD></TR>');
                        Win1.document.writeln('<tr><TH COLSPAN="4"><FONT FACE="Arial" SIZE="-1"><b>' + msgList[28] + '</b></font></TH></TR>');
                        Win1.document.writeln('<tr><TD><FONT FACE="Arial" SIZE="-1"><b>' + msgList[22] + '</b></font></TD><TD><FONT FACE="Arial" SIZE="-1"><b>' + msgList[23] + '</b></font></TD>');
                        Win1.document.writeln('<TD><FONT FACE="Arial" SIZE="-1"><b>' + msgList[29] + '</b></font></TD><TD><FONT FACE="Arial" SIZE="-1"><b>' + msgList[30] + '</b></font></TD></TR>');
                        for (var i=0;i<fieldNames.length;i++) {
                                Win1.document.writeln('<tr><td><FONT FACE="Arial" SIZE="-1">' + fieldNames[i] + '</font></TD>');
                                Win1.document.write('<td><FONT FACE="Arial" SIZE="-1">[' + fieldTypes[i] + '] - ');
                                var f = fieldTypes[i];
                                var theType = msgList[31];
                                if (f=="12") {
                                        theType = msgList[32];
                                } else if (f=="-99") {
                                        theType = msgList[33];
                                } else if (f=="-98") {
                                        theType = msgList[34];
                                } else if (f=="4") {
                                        theType = msgList[35];
                                } else if (f=="8") {
                                        theType = msgList[36];
                                } else if (f=="-7") {
                                        theType = msgList[37];
                                } else if (f=="6") {
                                        theType = msgList[38];
                                } else if (f=="5") {
                                        theType = msgList[39];
                                } else if (f=="2005") {
                                        theType = msgList[40];
                                } else if (f=="91") {
                                        theType = msgList[41];
                                }
                                Win1.document.writeln(theType + '</font></TD>');
                                Win1.document.writeln('<TD><FONT FACE="Arial" SIZE="-1">' + fieldSizes[i] + '</font></TD>');
                                Win1.document.writeln('<td><FONT FACE="Arial" SIZE="-1">' + fieldPrecisions[i] + '</font></td>');
                                Win1.document.writeln('</TR>');
                        }
                } else {
                        Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>' + msgList[28] + '</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">' + msgList[42] + '</td></tr>');
        
                }
                fieldNames=null;
                fieldTypes=null;
                fieldSizes=null;
                fieldPrecisions=null;
        } else {
        Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>' + msgList[43] + '</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">' + msgList[44] + '</td></tr>');
                        Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>' + msgList[28] + '</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">' + msgList[42] + '</td></tr>');
        }
        Win1.document.writeln('</table>');
        Win1.document.writeln('</font></center></body></html>');
        Win1.document.close();

}

