// aimsLayers.js
/*
*  JavaScript template file for ArcIMS HTML Viewer
*       dependent on aimsXML.js, ArcIMSparam.js, aimsCommon.js, aimsMap.js,
*       aimsDHTML.js
*/

var 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 FeatureLayerCount = 0;

    // field aliases arrays
var AliasFieldName = new Array();
var AliasFieldAlias = new Array();

var LayerListOpen=false;
var queryOpen = false;

var displayLayerInfoButton=false;

// 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);
                    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=",endpos);
                    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);
                        LayerID[layerCount] = theReply.substring(startpos,endpos);
                    } 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);
                        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);
                        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";

                            noOverLay=true;
                        }
                    } else {
                        typeString = "image";
                        noOverLay=true;
                    }
    
                    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] = "";
                    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;
}

// 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 (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 {
        var msg ="Unable to obtain Field names.\nUnable to query layer.";
        alert(msg);
        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.open();
    Win1.document.writeln('<html><head><title>Layer Information - ' + 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>Layer Information</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>Name:</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>Id:</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>Type:</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>Extent:</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>Min Scale:</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>Max Scale:</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>Fields:</b></font></TH></TR>');
            Win1.document.writeln('<tr><TD><FONT FACE="Arial" SIZE="-1"><b>Name:</b></font></TD><TD><FONT FACE="Arial" SIZE="-1"><b>Type:</b></font></TD>');
            Win1.document.writeln('<TD><FONT FACE="Arial" SIZE="-1"><b>Size:</b></font></TD><TD><FONT FACE="Arial" SIZE="-1"><b>Precision:</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 = "Unknown";
                if (f=="12") {
                    theType = "String";
                } else if (f=="-99") {
                    theType = "Id";
                } else if (f=="-98") {
                    theType = "Shape";
                } else if (f=="4") {
                    theType = "Integer";
                } else if (f=="8") {
                    theType = "Double";
                } else if (f=="-7") {
                    theType = "Boolean";
                } else if (f=="6") {
                    theType = "Floating";
                } else if (f=="5") {
                    theType = "Small Integer";
                } else if (f=="2005") {
                    theType = "BLOB";
                } else if (f=="91") {
                    theType = "Date";
                }
                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>Fields:</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">None</td></tr>');
    
        }
        fieldNames=null;
        fieldTypes=null;
        fieldSizes=null;
        fieldPrecisions=null;
    } else {
    Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>Address Match:</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">No</td></tr>');
            Win1.document.write('<tr><td><FONT FACE="Arial" SIZE="-1"><b>Fields:</b></font></td><td COLSPAN="3"><FONT FACE="Arial" SIZE="-1">None</td></tr>');
    }
    Win1.document.writeln('</table>');
    Win1.document.writeln('</font></center></body></html>');
    Win1.document.close();

}


