// extended db javascript template for ArcIMS HTML Viewer
// aimsDB.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
*/

// global variables
var aimsDBPresent = true;

//var theDBFrame = parent.DBFrame.document; - CAT - seems to be deprecated...
var dbLinkLayer = "Parcels";                                      // This must match the name tag of the <map axl file> layer entry for the parcel layer -
var dbLinkLayerID = "";                                            //  CAT created method aimsXML::getDBLinkLayerIndex() to dynamically determine this - you must still set the dbLinkLayer value obviously, otherwise we have nothing to link to.
var dbLinkLayerIndex = 0;                                         // CAT created method aimsXML::getDBLinkLayerIndex() to dynamically determine this - you must still set the dbLinkLayer value obviously, otherwise we have nothing to link to.
ActiveLayerIndex = dbLinkLayerIndex;
var dbQueryString = "";
var dbIdString = "";
var dbIdValue = "";
var dbNumValue = "";
var dbStreetValue = "";
var dbOwnerValue = "";
var dbDisplayValue = "";

// set the active layer parameters to the dbLinkLayer
function matchDBLinkLayer(layerName) {
    var j = -1;
    for (var i=0;i<layerCount;i++) {
        if (LayerName[i]==layerName) j = i;
    }
    if (j>-1) {
        dbLinkLayerIndex = j
        dbLinkLayerID = LayerID[dbLinkLayerIndex];
        dbLinkLayer = LayerName[dbLinkLayerIndex];
        ActiveLayerIndex = dbLinkLayerIndex;
        ActiveLayer = dbLinkLayerID;
    }
}

// db Identify - external db access
//  XMLMode=70... response will be sent to parseIDFieldData()
function dbIdentify(e) {
    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);
    showRetrieveData();
//alert(theString);
    sendToServer(imsQueryURL,theString,70);
}

/* Modularilized the parsing of the GIS - DB link field from the
   ArcXML reply
   @param theReply - The XML reply from the arcXML query.
   @param featureCount - The number of features returned by the query.
   @return parseGISLinkFields The comma-separated list of GIS-DB link field values.
   */
function parseGISLinkFields(theReply, featureCount) {
    var LinkValues = "";
    var startpos2 = 0;
    var startpos = 0;
    var pos = 0;
    var qpos = 0;
    var endpos = 1;
    var fieldString = mapIDField + "=";
    for (var i=0;i<featureCount;i++) {
        startpos2 = theReply.indexOf("<FIELDS ",endpos);
        pos = startpos2 + 8;
        qpos = fieldString.length + 1;
        startpos =theReply.indexOf(fieldString,pos);
        startpos = startpos + qpos
        endpos = theReply.indexOf(dQuote,startpos);
        tempString = theReply.substring(startpos,endpos);
        if (addIDQuotes) {
            tempString = '\'' + tempString + '\'';
        }
        if (i>0) tempString = "," + tempString;
            LinkValues = LinkValues + tempString;
    }
    return LinkValues;
}

/* Modularilized the parsing of the key GIS fields from the
   ArcXML reply
   @param theReply - The XML reply from the arcXML query.
   @param featureCount - The number of features returned by the query.
   @return parseGISIDFields The comma-separated list of fields values for the GIS key.
   */
function parseGISIDFields(theReply, featureCount) {
    var GISIDValues = "";
    var startpos2 = 0;
    var startpos = 0;
    var pos = 0;
    var qpos = 0;
    var endpos = 1;
    var idString = LayerIDField[dbLinkLayerIndex] + "=";
    for (var i=0;i<featureCount;i++) {
        startpos2 = theReply.indexOf("<FIELDS ",endpos);
        pos = startpos2 + 8;
        qpos = idString.length + 1;
        startpos =theReply.indexOf(idString,pos);
        startpos = startpos + qpos
        endpos = theReply.indexOf(dQuote,startpos);
        tempString = theReply.substring(startpos,endpos);
        if (i>0) tempString = "," + tempString;
        GISIDValues = GISIDValues + tempString;
    }
    return GISIDValues;
}
// get the attribute values from the identify XML response
//  then send request to external db access server
//  and request for map highlighting feature
function parseIDFieldData(theReply) {
//alert (theReply);
    var fList="";
    var iList="";
    var featureCount = justGetFeatureCount(theReply);
    if (featureCount > 0) {
        fList = parseGISLinkFields(theReply, featureCount);
        iList = parseGISIDFields(theReply, featureCount);
        currentlySelectedFeatureID = fList;
        // t.parent.Debugger.write("aimsDB.parseIDFieldData: " + currentlySelectedFeatureID);
        var featureString = "select " + dbFieldList + " from " + dbTableList + " where " + dbIDField + " IN (" + fList + ") order by " + dbIDField;

        writeDBResponsePage(featureString);

        if (highlightIdentify) {
            highlightedOne=LayerIDField[dbLinkLayerIndex] + " IN (" + iList + ")";
            sendMapXML();
        }
    } else {
        tempString = ActiveLayer + ":\n" + dbList[0];
        var Win1;
        if ((useExternalWindow) || (!useTextFrame)) {
            Win1 = window.open("","QueryWindow","width=575,height=120,scrollbars=yes,resizable=yes");
        } else {
            Win1 = parent.TextFrame.document;
            Win1.open();
        }
        Win1.writeln('<html><meta http-equiv="Content-Type" content="text/html; charset=' + charSet + '"><head>');
        Win1.writeln('  <title>' + dbList[1] + '</title>');
        Win1.writeln('</head>');
        Win1.writeln('<body BGCOLOR="White" TEXT="Black" LEFTMARGIN=0 TOPMARGIN=0>');
        Win1.writeln('<FONT FACE="Arial"><B>' + LayerName[ActiveLayerIndex] + '</B></font><FONT FACE="Arial" size="-2">');
        Win1.writeln('<br>' + dbList[2] + '</FONT>');
        Win1.writeln('</body></html>');
        Win1.close();
    }
    hideRetrieveData();
}

function getDBQuery(value) {

    dbLinkLayer = "Parcels";
    matchDBLinkLayer(dbLinkLayer);

    if (dbIDFieldIsText)
       setQueryString = mapIDField + " IN ('" + value + "')";
    else
        setQueryString = mapIDField + " IN (" + value + ")";
    selectionMode = 1;
    showBuffer = false;
    currentlySelectedFeatureID = "'" + value + "'";
    var theString = getDBEnvelope(setQueryString);
    sendDBXMLRequest(theString, 3001);
    hideRetrieveData();
}

function getDBQuery2(value1,value2) {
    // for vb implementation
    var queryString = "";
    queryString = mapIDField + " IN (" + value1 + ")";
    setQueryString=  queryString ;
    dbQueryString = dbIDField + " IN (" + value1 + ") AND " + dbDisplayField + " = '" + value2 + "'";
    dbQueryString = "select " + dbFieldList + " from " + dbTableList + " where " + dbQueryString + " order by " + dbIDField;
    hideRetrieveData();
    var theString = getDBEnvelope(queryString);
    sendDBXMLRequest(theString, 3001)
}

// create the ArcXML query request with feature id
//  used to match external db record to feature. . .
//  envelope will parsed from response
function getDBEnvelope(queryString) {
    var theFields = LayerIDField[dbLinkLayerIndex] + " " + LayerShapeField[dbLinkLayerIndex];
    var theString = '<ARCXML VERSION="1.1">\n<REQUEST>\n<GET_FEATURES outputmode="xml" geometry="false" envelope="true"';
    theString += ' compact="true" featurelimit="' + maxFeaturesReturned + '" beginrecord="' + queryStartRecord + '">\n';
    theString += '<LAYER id="' + LayerID[dbLinkLayerIndex] + '" ftype="' + ActiveLayerType + '" />';
    if (useLimitExtent) {
        // keep this within the limitExtent
        theString += '<SPATIALQUERY subfields="' + theFields + '" where="' + queryString + '" />';
        theString += '<SPATIALFILTER relation="area_intersection">\n';
        theString += '<ENVELOPE maxx="' + limitRight + '" maxy="' + limitTop + '" minx="' + limitLeft + '" miny="' + limitBottom + '" />\n';
        theString += '</SPATIALFILTER>\n';
        theString += '</SPATIALQUERY>\n';
    } else {
    theString += '<QUERY subfields="' + theFields + '" where="' + queryString + '" />';
    }
    theString += '</GET_FEATURES>';
    theString += '</REQUEST>';
    theString += '</ARCXML>';
    selectLayer=ActiveLayer;
    selectType=ActiveLayerType;
    selectCount=0;
    hightlightedOne="";
    selectPoints.length=1;
    selectLeft.length=1;
    selectRight.length=1;
    selectTop.length=1;
    selectBottom.length=1;
    return theString;
}

// after matching feature to external db record
//  parse out envelope and send zoom to envelope request.
function parseDBEnvelope(theReply) {
    var theError = getXMLErrorMessage(theReply);
    var featureCount = justGetFeatureCount(theReply);
    var theXYs = getEnvelopeXYs(theReply, 0)
    var endpos = 0;
    selectLeft[0] = theXYs[0];
    selectBottom[0] = theXYs[1];
    selectRight[0] = theXYs[2];
    selectTop[0] = theXYs[3];
    endpos = xmlEndPos;
    var inData = parseRecordString(theReply, endpos);
    //bunsongsikult
    if (featureCount > 1) {
        var lstData = parseFullRecordString(theReply);
    }
    endpos = xmlEndPos;
    var selectedData = clearLeadingSpace(inData);
    var fName1 = getFieldNames(selectedData);
    var fValue1 = getFieldValues(selectedData);
    selectPoints[0] = getIdValue(fName1, fValue1);
    //bunsongsikult
    if (featureCount > 1) {
      //highlight multiple objectid
      highlightedOne = LayerIDField[ActiveLayerIndex] + " IN (" + lstData + ")";
    } else {
      highlightedOne = LayerIDField[ActiveLayerIndex] + " IN (" + selectPoints[0] + ")";
    }
    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;
    } else {
        mWMargin = fWidth * selectMargin;
        mHMargin = fHeight * selectMargin;
    }
    saveLastExtent();
    eLeft = selectLeft[0] - mWMargin;
    eRight = selectRight[0] + mWMargin;
    eTop = selectTop[0] + mHMargin;
    eBottom = selectBottom[0] - mHMargin;
    legendTemp=legendVisible;
    legendVisible=false;
    layersVisible=false;
    selectCount = featureCount; // Added by CAT - to enable the Select by Owner, Address, etc - to actually result in a select.  3262003
    // parent.Debugger.document.write ("aimsDB.parseDBEnvelope: " + currentlySelectedFeatureID + " -- " + highlightedOne);
    if (dbAccessType == "VB") writeDBResponsePage(dbQueryString);
    sendMapXML();

}

// dynamically write out page with form that automatically submits upon loading. . .
//  sends request to external vb db access module with sql query
function writeDBResponsePage(featureString) {
//alert (featureString);
    var theFrame = "TextFrame";
    if ((useExternalWindow) || (!useTextFrame)) theFrame = "_blank";
    var Win1 = parent.DBFrame.document;
    var startpos = featureString.indexOf("IN (");
    startpos += 4;
    var endpos = featureString.indexOf(")",startpos);
    if (endpos==-1) endpos = featureString.length;
    var flist = featureString.substring(startpos, endpos);
    if (dbAccessType == "VB") {
        var f = Win1.forms[0];
        f.action = dbSQLurl;
        f.Database.value = dbDatabase;
        f.Connect.value = dbConnectString;
        f.IDField.value = dbIDField;
        f.SQL.value = featureString;
        f.Response.value = "1";
        f.Style.value = dbStyle;
        f.IDValue.value = flist;
        f.Function.value = "sendValue";
        f.ListDescript.value = dbFieldListDescript;

        f.submit();

    } else if ((dbAccessType == "ColdFusion") || (dbAccessType == "ASP"))  {
        theForm = Win1.forms[0];
        //theForm.SQLValue = featureString;
        theForm.IDValue.value = flist;
        theForm.DisplayValue.value = "**None**";
        var startRec = parent.MapFrame.queryStartRecord;
        var recordCnt = parent.MapFrame.currentSelectCount;
        theForm.sms.value=startRec;
        theForm.smt.value=recordCnt;
        theForm.smc.value=maxFeaturesDisplayed;
        theForm.sme.value=(((startRec + maxFeaturesDisplayed) <= recordCnt) ? startRec + maxFeaturesDisplayed : recordCnt);
        theForm.submit();

    }

    featureString=null;
    Win1 = null;

}

// Custom function to send ArcXML requests
//  points response to processDBXML()
function sendDBXMLRequest(XMLRequest, theType) {
    var theFunction = "parent.MapFrame.processDBXML";
    sendCustomToServer(XMLRequest,theFunction, theType)
}

// Custom XML processor for db access
function processDBXML(theReplyIn) {
    theReplyIn = replacePlus(theReplyIn);
    var theReply = unescape(theReplyIn);
    okToSend = true;
    if (debugOn>2) alert(msgList[13] + theReply);
    if (XMLMode == 3001) {
        // parse out envelope and send zoom to envelope request.
        parseDBEnvelope(theReply);
    }
    if (XMLMode == 3002) {
        alert("XMLMode=3002");
    }
}
