﻿var typeAddress = "";
var summaryDate = "";
var summaryBuffer = "";
var summaryLocation = "";
var summaryCodes = "";
var summaryCodes_CAD = "";
var summaryCount = 0;
var summaryCount_CAD = 0;
var codeArray = new Array();
var catArray = new Array();
var catsubcodeArray = new Array();
var idcodeArray = new Array();
var CAD_codeArray = new Array();
var CAD_catArray = new Array();
var CAD_catsubcodeArray = new Array();
var CAD_idcodeArray = new Array();
var selectedLocation = new Array();
var splitidx;
var usingRepeatCalls = false;

function resetSummaries() {
    try {
        summaryDate = "";
        summaryBuffer = "";
        summaryLocation = "";
        summaryCodes = "";
        summaryCount = 0;
    }
    catch (err) {
        errorWin(err.description, "resetSummaries");
    }
}

function requery() {
    try {
        if (selectedLocation.length > 0) {
            clearTables();
            map.graphics.clear();

            map.graphics.add(selectedLocation[0]);

            showWorking();
            var t = setTimeout(function() { doBuffer(selectedLocation[0]) }, 1000);
        }
    }
    catch (err) {
        errorWin(err.description, "requery");
    }
}

/*
function getGraphic - draws the drawn graphic on the map.
*/

function addGraphic(geometry) {
    try {
        resetSummaries();
        clearTables();

        geometry.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));

        var type = geometry.type;
        if (type === "point" || type === "multipoint") {
            summaryLocation = "GRAPHIC POINT";
            var symbol = new esri.symbol.SimpleMarkerSymbol();
            symbol.setStyle(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE);
            symbol.setColor(new dojo.Color([255, 0, 0, 0.75]));
            symbol.setSize(8);
        }
        else if (type === "line" || type === "polyline") {
            summaryLocation = "GRAPHIC LINE";
            var symbol = new esri.symbol.CartographicLineSymbol(esri.symbol.CartographicLineSymbol.STYLE_SOLID,
                            new dojo.Color([255, 0, 0]), 2, esri.symbol.CartographicLineSymbol.CAP_ROUND,
                            esri.symbol.CartographicLineSymbol.JOIN_ROUND);
        }
        else {
            summaryLocation = "GRAPHIC POLYGON";
            var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID,
                            new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255, 0, 0]), 2),
                            new dojo.Color([255, 255, 0, 0.5]));
        }

        map.graphics.clear();

        var infoTemplate = new esri.InfoTemplate();
        infoTemplate.title = "Location";

        var graphic = new esri.Graphic(geometry, symbol);
        graphic.setInfoTemplate(infoTemplate);
        map.graphics.add(graphic);

        selectedLocation = new Array();
        selectedLocation[0] = graphic;

        makeIconActive(document.getElementById("pan"));
        navToolbar.activate(esri.toolbars.Navigation.PAN);
        map.enablePan();

        showWorking();
        var t = setTimeout(function() { doBuffer(graphic) }, 1000);
    }
    catch (err) {
        errorWin(err.description, "addGraphic");
    }
}

function doBuffer(graphic) {
    try {
        // buffer graphic
        updateWorking('buffering selected location');
        var chkbox = document.getElementById("useAdvancedBuffer");
        if (chkbox.checked) {
            summaryBuffer = document.getElementById("sliderValue").value + " feet";
        }
        else {
            var w = document.getElementById("selectBuffer").selectedIndex;
            summaryBuffer = document.getElementById("selectBuffer").options[w].text;
        }

        var params = new esri.tasks.BufferParameters();
        params.features = [graphic];
        if (chkbox.checked) {
            params.distances = [document.getElementById("sliderValue").value];
        }
        else {
            params.distances = [document.getElementById("selectBuffer").value];
        }
        params.unit = esri.tasks.BufferParameters.UNIT_FOOT;
        params.bufferSpatialReference = new esri.SpatialReference({ wkid: parseInt(refScale_addressLocator) });
        params.outSpatialReference = map.spatialReference;
        geometryService.buffer(params, showBuffer);
    }
    catch (err) {
        errorWin(err.description, "doBuffer");
    }
}

/*
function getLocations - based on the location type selection, query
the location layer and return unique values in the location select
options.
*/

function getLocations() {
    try {
        var idx = document.getElementById("selectLocationType").value;
        splitidx = idx.split("|");

        if (splitidx[0] == "None") {
            var locationsCombo = document.getElementById("selectLocations");
            while (locationsCombo.options.length) {
                locationsCombo.remove(0);
            }
            return;
        }

        //alert(baseMap+"/"+splitidx[0]);
        var queryTask = new esri.tasks.QueryTask(overlayMap + "/" + splitidx[0]);

        // Query
        var query = new esri.tasks.Query();
        query.returnGeometry = false;
        //alert(splitidx[1]);
        query.outFields = [splitidx[1]];
        query.where = "OBJECTID > 0 AND " + splitidx[1] + " IS NOT NULL";
        queryTask.execute(query, completeLocations);
    }
    catch (err) {
        errorWin(err.description, "getLocations");
    }
}

/*
function completeLocations - after the query, populate the location select
options.
*/

function completeLocations(result) {
    try {
        var resultFeatures = result.features;
        //alert(resultFeatures.length);

        var locationsCombo = document.getElementById("selectLocations");
        if (locationsCombo == null) {
            alert("Missing combobox Locations!");
            return;
        }

        while (locationsCombo.options.length) {
            locationsCombo.remove(0);
        }

        var newOpt;

        for (var i = 0, il = resultFeatures.length; i < il; i++) {
            var featureAttributes = resultFeatures[i].attributes;
            //for (att in featureAttributes) {
            var trimmed = featureAttributes[splitidx[1]].replace(/^\s+|\s+$/g, '');
            if (trimmed != "") {
                newOpt = document.createElement("option");
                newOpt.value = featureAttributes[splitidx[1]];
                newOpt.text = trimmed;
                locationsCombo.options.add(newOpt);
            }
            //}
        }

        // sort the items
        arrTexts = new Array();
        arrValues = new Array();
        arrOldTexts = new Array();

        for (i = 0; i < locationsCombo.length; i++) {
            arrTexts[i] = locationsCombo.options[i].text;
            arrValues[i] = locationsCombo.options[i].value;
            arrOldTexts[i] = locationsCombo.options[i].text;
        }

        arrTexts.sort();

        for (i = 0; i < locationsCombo.length; i++) {
            locationsCombo.options[i].text = arrTexts[i];
            for (j = 0; j < locationsCombo.length; j++) {
                if (arrTexts[i] == arrOldTexts[j]) {
                    locationsCombo.options[i].value = arrValues[j];
                    j = locationsCombo.length;
                }
            }
        }

        //locationCombo.options[0].selected = true;
    }
    catch (err) {
        errorWin(err.description, "completeLocations");
    }
}

/*
function getLocationPoint - based on the location selected, requery location layer
and return its geometry.
*/

function getLocationPoint() {
    try {
        resetSummaries();
        clearTables();

        var w = document.getElementById("selectLocations").selectedIndex;
        summaryLocation = document.getElementById("selectLocations").options[w].text;

        var selLoc = document.getElementById("selectLocations").value;
        var idx = document.getElementById("selectLocationType").value;
        var splitidx = idx.split("|");

        var queryTask = new esri.tasks.QueryTask(overlayMap + "/" + splitidx[0]);

        //alert(baseMap+"/"+splitidx[0]);

        // Query
        var query = new esri.tasks.Query();
        query.returnGeometry = true;
        //alert(splitidx[1] + " " + selLoc);
        query.outFields = [splitidx[1]];
        //query.text = selLoc;
        query.where = splitidx[1] + " = '" + selLoc + "'";
        queryTask.execute(query, showLocationPoint);
    }
    catch (err) {
        errorWin(err.description, "getLocationPoint");
    }
}

/*
function showLocationPoint - based on queried location, place graphic to map.
*/

function showLocationPoint(results) {
    try {

        var infoTemplate = new esri.InfoTemplate("Location", "${*}");

        map.graphics.clear();

        if (results.geometryType == "esriGeometryPoint") {
            var symbol = new esri.symbol.SimpleMarkerSymbol();
            symbol.setStyle(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE);
            symbol.setColor(new dojo.Color([255, 0, 0, 0.75]));
            symbol.setSize(8);
        }
        else if (results.geometryType == "esriGeometryPolygon") {
            var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID,
                            new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 1),
                            new dojo.Color([255, 255, 0, 0.25]));
        }
        else {
            var symbol = new esri.symbol.CartographicLineSymbol(esri.symbol.CartographicLineSymbol.STYLE_SOLID,
                            new dojo.Color([255, 0, 0]), 2, esri.symbol.CartographicLineSymbol.CAP_ROUND,
                            esri.symbol.CartographicLineSymbol.JOIN_ROUND);
        }

        var resultFeatures = results.features;
        //alert(resultFeatures.length);
        for (var i = 0, il = resultFeatures.length; i < il; i++) {
            var graphic = resultFeatures[i];
            graphic.geometry.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_addressLocator) }));
            graphic.setSymbol(symbol);
            graphic.setInfoTemplate(infoTemplate);
            map.graphics.add(graphic);

            selectedLocation = new Array();
            selectedLocation[0] = graphic;
        }

        showWorking();
        var t = setTimeout(function() { doBuffer(graphic) }, 1000);
    }
    catch (err) {
        errorWin(err.description, "showLocationPoint");
    }
}

/*
function locate - use the house address to geocode.
*/

function locate() {
    try {
        loc = document.getElementById("txtAddress").value;
        if (loc == null || loc == "") {
            alert("Please enter an address!");
            return;
        }
        resetSummaries();
        clearTables();
        map.graphics.clear();
        typeAddress = "address";
        //var add = document.getElementById("address").value.split(",");
        //var address = {
        //Address: add[0],
        //City: add[1],
        //State: add[2],
        //Zip: add[3]
        //};

        var address = "";

        if (useZone) {
            address = { Street: document.getElementById("txtAddress").value, Zone: "" };
        }
        else {
            address = { Street: document.getElementById("txtAddress").value };
        }

        locator.addressToLocations(address, ["Loc_name"]);

    }
    catch (err) {
        errorWin(err.description, "locate");
    }
}

/*
function locateX - use the cross streets to geocode.
*/

function locateX() {
    try {
        var one = document.getElementById("txtX1").value;
        var two = document.getElementById("txtX2").value
        if (one == null || one == "") {
            alert("Please enter first cross street!");
            return;
        }
        if (two == null || two == "") {
            alert("Please enter second cross street!");
            return;
        }
        var locX = one.toUpperCase() + " & " + two.toUpperCase();
        typeAddress = "intersection";
        resetSummaries();
        clearTables();
        map.graphics.clear();

        var address = "";

        if (useZone) {
            address = { Street: locX, Zone: "" };
        }
        else {
            address = { Street: locX };
        }
        locator.addressToLocations(address, ["Loc_name"]);

    }
    catch (err) {
        errorWin(err.description, "locateX");
    }
}

/*
function showResults - used to evaluate address candidates. If score is >70 then place
point on map and buffer.  Else, populate candidate list.  If no candidates are found
then alert user.
*/

function showResults(candidates) {
    try {
        var candidate;
        var symbol = new esri.symbol.SimpleMarkerSymbol();
        var infoTemplate = new esri.InfoTemplate("Location", "Address: ${address}<br />Score: ${score}");

        symbol.setStyle(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE);
        symbol.setColor(new dojo.Color([255, 0, 0, 0.75]));
        symbol.setSize(8);

        if (typeAddress == "address") {
            document.getElementById("divCandidates").style.visibility = "hidden";
            document.getElementById("lblSelectAddress").style.visibility = "hidden";
            var addressCombo = document.getElementById("selectAddress");
        }
        else {
            document.getElementById("divCandidatesX").style.visibility = "hidden";
            document.getElementById("lblSelectAddressX").style.visibility = "hidden";
            var addressCombo = document.getElementById("selectIntersection");
        }

        while (addressCombo.options.length) {
            addressCombo.remove(0);
        }

        if (candidates.length == 0) {
            if (typeAddress == "address") {
                alert("The address could not be located!");
            }
            else {
                alert("The intersection could not be located!");
            }
            return;
        }

        var seventyDone = false;

        for (var i = 0, il = candidates.length; i < il; i++) {
            candidate = candidates[i];
            candidate.location.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_addressLocator) }));
            //alert(candidate.address);
            //alert(candidate.score);
            if (candidate.score > 70 && seventyDone == false) {

                resetSummaries();

                summaryLocation = candidate.address;

                var attributes = { address: candidate.address, score: candidate.score };
                //alert(candidate.address);
                //alert(candidate.score);
                var graphic = new esri.Graphic(candidate.location, symbol, attributes, infoTemplate);

                map.graphics.add(graphic);

                selectedLocation = new Array();
                selectedLocation[0] = graphic;

                showWorking();
                var t = setTimeout(function() { doBuffer(graphic) }, 1000);

                seventyDone = true;

                //return;
            }
            else {
                if (typeAddress == "address") {
                    document.getElementById("divCandidates").style.visibility = "visible";
                    document.getElementById("lblSelectAddress").style.visibility = "visible";
                    if (seventyDone) {
                        dojo.byId("lblSelectAddress").innerHTML = "Other address matches:";
                    }
                    else {
                        dojo.byId("lblSelectAddress").innerHTML = "Select address:";
                    }
                }
                else {
                    document.getElementById("divCandidatesX").style.visibility = "visible";
                    document.getElementById("lblSelectAddressX").style.visibility = "visible";
                    if (seventyDone) {
                        dojo.byId("lblSelectAddressX").innerHTML = "Other intersection matches:";
                    }
                    else {
                        document.getElementById("lblSelectAddressX").innerHTML = "Select intersection:";
                    }
                }

                newOpt = document.createElement("option");
                var pnt = candidate.location;
                var pntString = pnt.x + "," + pnt.y;
                newOpt.value = pntString;
                //var trimmed = featureAttributes[att].replace(/^\s+|\s+$/g, '') ;
                newOpt.text = candidate.address;
                addressCombo.options.add(newOpt);

            }
        }
    }
    catch (err) {
        errorWin(err.description, "showResults");
    }
}

/*
function getAddressPoint - if candidates were populated (score < 70), this function
takes the selected address from the candidate list and places on map and then buffers.
*/

function getAddressPoint() {
    try {
        resetSummaries();
        clearTables();
        map.graphics.clear();

        if (typeAddress == "address") {
            var selAddress = document.getElementById("selectAddress").value;
            var selidx = document.getElementById("selectAddress").selectedIndex;
            var strAddress = document.getElementById("selectAddress").options[selidx].text;
        }
        else {
            var selAddress = document.getElementById("selectIntersection").value;
            var selidx = document.getElementById("selectIntersection").selectedIndex;
            var strAddress = document.getElementById("selectIntersection").options[selidx].text;
        }

        var xy = selAddress.split(",");

        summaryLocation = strAddress;

        var symbol = new esri.symbol.SimpleMarkerSymbol();
        var infoTemplate = new esri.InfoTemplate("Location", "Address: " + strAddress);

        symbol.setStyle(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE);
        symbol.setColor(new dojo.Color([255, 0, 0, 0.75]));
        symbol.setSize(8);

        var pnt = new esri.geometry.Point(xy[0], xy[1], new esri.SpatialReference({ wkid: parseInt(refScale_addressLocator) }));
        var attributes = { address: strAddress };
        var graphic = new esri.Graphic(pnt, symbol, attributes, infoTemplate);
        //        if (parseInt(refScale_addressLocator) != parseInt(refScale_baseMap)) {
        //            geometryService.project([graphic], new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
        //        }
        map.graphics.add(graphic);

        selectedLocation = new Array();
        selectedLocation[0] = graphic;

        showWorking();
        var t = setTimeout(function() { doBuffer(graphic) }, 1000);
    }
    catch (err) {
        errorWin(err.description, "getAddressPoint");
    }
}

/*
function showBuffer - function to display buffer then call RMS and CAD queries.
*/

function showBuffer(graphics) {
    try {

        updateWorking('adding locational graphic to map');

        var symbol = new esri.symbol.SimpleFillSymbol(
        esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID,
            new dojo.Color([0, 0, 255, 0.65]), 1), new dojo.Color([0, 0, 255, 0.20]));

        var infoTemplate = new esri.InfoTemplate();
        infoTemplate.title = "Location";

        var pgraphic = new esri.Graphic(graphics[0].geometry);
        pgraphic.setInfoTemplate(infoTemplate);
        pgraphic.setSymbol(symbol);
        grphjson = pgraphic;
        grphjson.toJson();

                map.graphics.add(pgraphic);

        updateWorking('zooming to location');

        map.setExtent(graphics[0].geometry.getExtent().expand(1.5));

        runRMSQuery(pgraphic);

        if (cadMap != "") {
            if (document.getElementById("chkUseCAD").checked) {
                var t = setTimeout(function() { runCADQuery(pgraphic) }, 1000);
            }
        }
    }
    catch (err) {
        errorWin(err.description, "showBuffer");
    }
}

/*
function runRMSQuery - query RMS layer.
*/

function runRMSQuery(graphic) {
    try {

        updateWorking('running crime record query');
        
        var queryTask = new esri.tasks.QueryTask(crimeMap + "/0");

        // Build date string
        var theQueryString = "";
        summaryDate = "";

        var rslt;
        rslt = buildDateString();
        summaryDate = rslt[0];
        theQueryString = rslt[1];

        //alert(summaryDate);
        //alert(theQueryString);

        var crimeCodes = returnCrimeString();
        //alert(crimeCodes);
        //alert(crimeCodes.replace(/^\s+|\s+$/g, "").length);

        if (document.getElementById("chkAll").checked) {
            summaryCodes = "ALL";
        }
        else {
            if (crimeCodes != "'undefined'") {
                theQueryString = theQueryString + " AND " + symbolMatchField_RMS + " IN (" + crimeCodes + ")";
                summaryCodes = crimeCodes.replace(/\'/g, "");
            }
            else {
                if (document.getElementById("chkAll").checked) {
                    summaryCodes = "ALL";
                }
                else {
                    alert("All or some crime codes need to be selected!");
                    if (cadMap == "") {
                        var t = setTimeout(function() { hideWorking() }, 1000);
                    }
                    return;
                }
            }
        }

        //alert(theQueryString);

        // Query
        var query = new esri.tasks.Query();
        query.spatialRelationship = esri.tasks.Query.SPATIAL_REL_INTERSECTS;
        query.outSpatialReference = new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) });
        query.returnGeometry = true;
        query.outFields = fldsReturn_RMS;
        graphic.geometry.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
        query.geometry = graphic.geometry;
        query.where = theQueryString;
        queryTask.execute(query, completeQuery);
    }
    catch (err) {
        errorWin(err.description, "runRMSQuery");
    }
}

/*
function runCADQuery - query CAD layer.
*/

function runCADQuery(graphic) {
    try {

        updateWorking('running calls for service query');
        
        var queryTask = new esri.tasks.QueryTask(cadMap + "/0");

        // Build date string
        var theQueryString = "";
        summaryDate = "";

        var rslt;
        rslt = buildDateString();
        summaryDate = rslt[0];
        theQueryString = rslt[1];

        //alert(summaryDate);
        //alert(theQueryString);

        var cadCodes = returnCADString();
        //alert(cadCodes);
        //alert(cadCodes.replace(/^\s+|\s+$/g, "").length);

        if (document.getElementById("chkAllCAD").checked) {
            summaryCodes_CAD = "ALL";
        }
        else {
            if (cadCodes != "'undefined'") {
                theQueryString = theQueryString + " AND " + symbolMatchField_CAD + " IN (" + cadCodes + ")";
                summaryCodes_CAD = cadCodes.replace(/\'/g, "");
            }
            else {
                if (document.getElementById("chkAllCAD").checked) {
                    summaryCodes_CAD = "ALL";
                }
                else {
                    alert("All or some cad codes need to be selected!");
                    var t = setTimeout(function() { hideWorking() }, 1000);
                    return;
                }
            }
        }

        //alert(theQueryString);

        // Query
        var query = new esri.tasks.Query();
        query.spatialRelationship = esri.tasks.Query.SPATIAL_REL_INTERSECTS;
        query.outSpatialReference = new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) });
        query.returnGeometry = true;
        query.outFields = fldsReturn_CAD;
        graphic.geometry.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
        query.geometry = graphic.geometry;
        query.where = theQueryString;
        queryTask.execute(query, completeCADQuery);
    }
    catch (err) {
        errorWin(err.description, "runCADQuery");
    }
}

/*
function buildDateString - build the date query string.
*/

function buildDateString() {
    try {
        // Build date string
        var chkbox = document.getElementById("useAdvancedDateTime");
        var summaryDate = "";
        var theQueryString = "";

        if (chkbox.checked) {

            summaryDate = "Date: ";

            var dateran = getDateRange().split("|");
            if (dateran[0] != "") {
                if (theQueryString == "") { theQueryString = dateran[0]; }
                else { theQueryString = theQueryString + " AND " + dateran[0]; }
                //alert(theQueryString);
                summaryDate = summaryDate + " " + dateran[1];
            }

            var timeran = getTimeRange().split("|");
            if (timeran[0] != "") {
                if (theQueryString == "") { theQueryString = timeran[0]; }
                else { theQueryString = theQueryString + " AND " + timeran[0]; }
                summaryDate = summaryDate + " " + timeran[1];
            }

            var dow = getDayOfWeek().split("|");
            if (dow[0] != "") {
                if (theQueryString == "") { theQueryString = dow[0]; }
                else { theQueryString = theQueryString + " AND " + dow[0]; }
                summaryDate = summaryDate + " " + dow[1];
            }
            //alert(theQueryString);
        }
        else {

            var seldatevalue = document.getElementById("selectDate").value;
            var generalstring = "";
            switch (seldatevalue) {
                case "YTD":
                    {
                        // year to date
                        var targetDate = new Date();
                        var theYear = targetDate.getFullYear();
                        switch (dbType) {
                            case "CAT_EXPORT":
                                generalstring = dateIMAP_RMS + " >= " + theYear + "0101";     // format YYYYMMDD
                                break;
                            case "MSSQL":
                                generalstring = dateIMAP_RMS + " >= '" + theYear + "-01-01'";     // format YYYY-MM-DD
                                break;
                        }
                        var theYearS = theYear + "";
                        summaryDate = "From date: 01-01-" + theYearS;
                        break;
                    }
                case "LY":
                    {
                        // last year
                        var targetDate = new Date();
                        var theYear = targetDate.getFullYear() - 1;
                        switch (dbType) {
                            case "CAT_EXPORT":
                                generalstring = dateIMAP_RMS + " >= " + theYear + "0101 AND " + dateIMAP_RMS + " <= " + theYear + "1231";
                                break;
                            case "MSSQL":
                                generalstring = dateIMAP_RMS + " >= '" + theYear + "-01-01' AND " + dateIMAP_RMS + " <= '" + theYear + "-12-31'";
                                break;
                        }
                        var theYearS = theYear + "";
                        summaryDate = "For date: Last year(" + theYearS + ")";
                        break;
                    }
                case "LM":
                    {
                        // last month
                        var targetDate = new Date();
                        var theMonth = targetDate.getMonth() + 1;
                        if (theMonth == 1) {
                            theMonth = 12;
                            var theYear = targetDate.getFullYear() - 1;
                            var theLastDay = daysInMonth(theMonth, theYear);
                        }
                        else {
                            theMonth = theMonth - 1;
                            var theYear = targetDate.getFullYear();
                            var theLastDay = daysInMonth(theMonth, theYear);
                        }
                        monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "Decemeber"];
                        var monthtext = monthNames[theMonth - 1];
                        if (theMonth < 10) { theMonth = "0" + theMonth; }
                        if (theLastDay < 10) { theLastDay = "0" + theLastDay; }
                        switch (dbType) {
                            case "CAT_EXPORT":
                                generalstring = dateIMAP_RMS + " >= " + theYear + theMonth + "01 AND " + dateIMAP_RMS + " <= " + theYear + theMonth + theLastDay;
                                break;
                            case "MSSQL":
                                generalstring = dateIMAP_RMS + " >= '" + theYear + "-" + theMonth + "-01' AND " + dateIMAP_RMS + " <= '" + theYear + "-" + theMonth + "-" + theLastDay + "'";
                                break;
                        }
                        var theYearS = theYear + "";
                        summaryDate = "For date: Last month (" + monthtext + " " + theYearS + ")";
                        break;
                    }
                default:
                    {
                        var oneMinute = 60 * 1000;
                        var oneHour = oneMinute * 60;
                        var oneDay = oneHour * 24;
                        var theDays = seldatevalue;
                        var daysBack = oneDay * theDays;

                        var targetDate = new Date();
                        var dateInMs = targetDate.getTime();
                        dateInMs = dateInMs - daysBack;
                        targetDate.setTime(dateInMs);

                        var theYear = targetDate.getFullYear();
                        var theMonth = targetDate.getMonth() + 1;
                        if (theMonth < 10) { theMonth = "0" + theMonth; }
                        var theDay = targetDate.getDate();
                        if (theDay < 10) { theDay = "0" + theDay; }
                        switch (dbType) {
                            case "CAT_EXPORT":
                                generalstring = dateIMAP_RMS + " >= " + theYear + theMonth + theDay;
                                break;
                            case "MSSQL":
                                generalstring = dateIMAP_RMS + " >= '" + theYear + "-" + theMonth + "-" + theDay + "'";
                                break;
                        }
                        var theYearS = theYear + "";
                        summaryDate = "From date: " + theMonth + "-" + theDay + "-" + theYearS;
                        break;
                    }
            }

            if (generalstring != "") { theQueryString = generalstring; }

        }

        //alert(summaryDate);
        //alert(theQueryString);

        var rslt = new Array(summaryDate, theQueryString);
        //    rslt(0) = summaryDate;
        //    rslt(1) = theQueryString;

        return rslt;
    }
    catch (err) {
        errorWin(err.description, "buildDateString");
        return "";
    }
}

/*
function completeQuery - take RMS results and symbolize on map and setup infowindow
functionality.
*/

function completeQuery(fset) {
    //alert(fset.features.length);
    try {

        if (fset.features.length == 0) {
            alert("Crimes were not located by the search criteria!");
            var t = setTimeout(function() { hideWorking() }, 1000);
            printCrimes = null;
            return;
        }

        if (fset.features.length >= maxRecordCountRMS) {
            alert("The maximum allowed crime record count has been met!" +
            "\nThere are records that will not be reported.");
        }

        updateWorking('crime records located ' + fset.features.length);

        var infoTemplate = new esri.InfoTemplate();
        infoTemplate.title = "Identify Information";
        infoTemplate.content = infoWinTemp_RMS;

        var resultFeatures = fset.features;
        summaryCount = resultFeatures.length;

        var aryCodes = new Array();
        var aryOffense = new Array();

        printCrimes = new Array();

        lotsOfPoints = new Array();
        var locations = {};

        var myfont = new esri.symbol.Font("12pt", esri.symbol.Font.STYLE_NORMAL, esri.symbol.Font.VARIANT_NORMAL, esri.symbol.Font.WEIGHT_BOLD, "Trebuchet MS");

        for (var i = 0, il = resultFeatures.length; i < il; i++) {

            var featureAttributes = resultFeatures[i].attributes;

            if (showCrimePoints == true) {

                if (usingRepeatCalls == false) {
                    var symbol = new esri.symbol.PictureMarkerSymbol();
                    symbol.height = 28;
                    symbol.width = 28;
                    symbol.url = "images/rms_icons/" + findCategoryCode_RMS(featureAttributes[symbolMatchField_RMS]) + ".png";
                    var graphic = resultFeatures[i];
                    graphic.geometry.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
                    graphic.setSymbol(symbol);
                    graphic.setInfoTemplate(infoTemplate);
                    map.graphics.add(graphic);

                    printCrimes.push(graphic.toJson());

                    updateWorking('adding crime records to map ' + (i +1) + ' of ' + fset.features.length);

                    // label the points
                    if (useLabels_RMS == true) {
                        var labelPoint = new esri.geometry.Point(graphic.geometry.x, graphic.geometry.y, new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
                        var label = new esri.symbol.TextSymbol(featureAttributes[labelField_RMS]);
                        label.setColor(new dojo.Color([0, 0, 0, 0.9]));
                        label.setOffset(18, 14);
                        var txtgraphic = new esri.Graphic(labelPoint, label);
                        map.graphics.add(txtgraphic);
                        printCrimes.push(txtgraphic.toJson());
                    }
                    //                var nPoint = new esri.geometry.Point(graphic.geometry.x, graphic.geometry.y, new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
                    //                lotsOfPoints.push(nPoint);
                }
                else {
                    var location_name = featureAttributes["GEOADDRESS"];
                    // create a bucket for the location in the uber-array. If a bucket is available then just use it.
                    locations[location_name] = locations[location_name] || [];
                    // push the feature into the bucket
                    locations[location_name].push(resultFeatures[i]);
                }
            }
            else {
                printCrimes = new Array();
            }
            aryCodes[i] = findCategoryName(featureAttributes[symbolMatchField_RMS]);
        }

        if (usingRepeatCalls == true) {
            var infoTemplateR = new esri.InfoTemplate();
            infoTemplateR.title = "Repeat Call Information";
            infoTemplateR.content = "Address: ${GEOADDRESS}";
            // create repeat call circles
            for (var location_name in locations) {
                if (locations.hasOwnProperty(location_name)) {
                    var features = locations[location_name];
                    if (features.length > 1) {
                        var lsymbol = new esri.symbol.CartographicLineSymbol(esri.symbol.CartographicLineSymbol.STYLE_SOLID,
                            new dojo.Color([255, 0, 0, 0.75]), 1, esri.symbol.CartographicLineSymbol.CAP_ROUND,
                            esri.symbol.CartographicLineSymbol.JOIN_ROUND);
                        var symbol = new esri.symbol.SimpleMarkerSymbol();
                        symbol.setStyle(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE);
                        symbol.setColor(new dojo.Color([255, 0, 0, 0.50]));
                        symbol.setSize(features.length * 10);
                        symbol.outline = lsymbol;
                        var graphicR = features[0];
                        graphicR.geometry.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
                        graphicR.setSymbol(symbol);
                        graphicR.setInfoTemplate(infoTemplateR);
                        map.graphics.add(graphicR);
                        printCrimes.push(graphicR.toJson());
                    }
                }
            }
            var infoTemplateC = new esri.InfoTemplate();
            infoTemplateC.title = "Identify Information";
            infoTemplateC.content = infoWinTemp_RMS;
            // create crime points
            for (var location_name in locations) {
                if (locations.hasOwnProperty(location_name)) {
                    var features = locations[location_name];
                    if (features.length > 1) {
                        for (var j = 0, il = features.length; j < il; j++) {
                            var lsymbolC = new esri.symbol.CartographicLineSymbol(esri.symbol.CartographicLineSymbol.STYLE_SOLID,
                                new dojo.Color([255, 0, 0, 1]), 1, esri.symbol.CartographicLineSymbol.CAP_ROUND,
                                esri.symbol.CartographicLineSymbol.JOIN_ROUND);
                            var symbolC = new esri.symbol.SimpleMarkerSymbol();
                            symbolC.setStyle(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE);
                            symbolC.setColor(new dojo.Color([255, 0, 0, 1]));
                            symbolC.setSize(4);
                            symbolC.outline = lsymbolC;
                            var graphicC = features[j];
                            graphicC.geometry.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
                            graphicC.setSymbol(symbolC);
                            graphicC.setInfoTemplate(infoTemplateC);
                            map.graphics.add(graphicC);
                            printCrimes.push(graphicC.toJson());
                        }
                    }
                }
            }
        }

        //addClusteredPoints(lotsOfPoints, map, 2, map.extent);

        buildTable(resultFeatures);

        s = "";
        for (var i = 0, il = aryCodes.length; i < il; i++) {
            if (s == "") {
                s = aryCodes[i];
            }
            else {
                s += "|" + aryCodes[i];
            }
        }

        buildSummaryTable(s);

    }
    catch (err) {
        errorWin(err.description, "completeQuery");
        return "";
    }
}

/*
function completeCADQuery - take CAD results and symbolize on map and setup infowindow
functionality.
*/

function completeCADQuery(fset) {
    //alert(fset.features.length);
    try {
        if (fset.features.length == 0) {
            alert("CAD incidents were not located by the search criteria!");
            printCADs = null;
            return;
        }

        if (fset.features.length >= maxRecordCountCAD) {
            alert("The maximum allowed CAD record count has been met!" +
            "\nThere are records that will not be reported.");
        }

        var infoTemplate = new esri.InfoTemplate();
        infoTemplate.title = "Identify Information";
        infoTemplate.content = infoWinTemp_CAD;

        var resultFeatures = fset.features;
        //alert(resultFeatures.length);
        summaryCount_CAD = resultFeatures.length;

        var aryCodes = new Array();
        var aryOffense = new Array();

        printCADs = new Array();

        var myfont = new esri.symbol.Font("12pt", esri.symbol.Font.STYLE_NORMAL, esri.symbol.Font.VARIANT_NORMAL, esri.symbol.Font.WEIGHT_BOLD, "Trebuchet MS");

        for (var i = 0, il = resultFeatures.length; i < il; i++) {

            var featureAttributes = resultFeatures[i].attributes;

            if (showCADPoints == true) {

                //                var symbol = new esri.symbol.SimpleMarkerSymbol();
                //                symbol.setStyle(esri.symbol.SimpleMarkerSymbol.STYLE_DIAMOND);
                //                symbol.setColor(new dojo.Color([255, 0, 0, 0.75]));
                //                symbol.setSize(10);

                var symbol = new esri.symbol.PictureMarkerSymbol();
                symbol.height = 10;
                symbol.width = 10;
                symbol.url = "images/cad_icons/" + findCategoryCode_CAD(featureAttributes[symbolMatchField_CAD]) + ".png";

                var graphic = resultFeatures[i];
                graphic.geometry.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
                graphic.setSymbol(symbol);
                graphic.setInfoTemplate(infoTemplate);
                map.graphics.add(graphic);

                printCADs.push(graphic.toJson());

                updateWorking('adding calls for service records to map ' + (i + 1) + ' of ' + fset.features.length);

                // label the points
                if (useLabels_CAD == true) {
                    var labelPoint = new esri.geometry.Point(graphic.geometry.x, graphic.geometry.y, new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }))
                    var label = new esri.symbol.TextSymbol(featureAttributes[labelField_CAD]);
                    label.setColor(new dojo.Color([0, 0, 0, 0.9]));
                    label.setOffset(18, 14);
                    var txtgraphic = new esri.Graphic(labelPoint, label);
                    map.graphics.add(txtgraphic);
                    printCADs.push(txtgraphic.toJson());
                }
            }
            else {
                printCADs = new Array();
            }
            aryCodes[i] = findCategoryName_CAD(featureAttributes[symbolMatchField_CAD]);
        }

        buildTable_CAD(resultFeatures);

        s = "";
        for (var i = 0, il = aryCodes.length; i < il; i++) {

            if (s == "") {
                s = aryCodes[i];
            }
            else {
                s += "|" + aryCodes[i];
            }
        }

        buildSummaryTable_CAD(s);
    }
    catch (err) {
        errorWin(err.description, "completeCADQuery");
        return "";
    }
}

function buildSummaryTable_CAD(ary) {

    try {

        updateWorking('building calls for service summary table');

        var aryCodes = ary.split("|");

        aryCodes.sort();

        var count = [];
        var msg = "";

        for (var i = 0; i < aryCodes.length; i++) {
            if (count[aryCodes[i]]) {
                count[aryCodes[i]] += 1;
            }
            else {
                count[aryCodes[i]] = 1;
            }
        }

        var a = [];
        var l = aryCodes.length;
        for (var i = 0; i < l; i++) {
            for (var j = i + 1; j < l; j++) {
                // If this[i] is found later in the array
                if (aryCodes[i] === aryCodes[j])
                    j = ++i;
            }
            a.push(aryCodes[i]);
        }

        aryCodes = a;

        msg = "";
        for (i in count) {
            if (msg == "") {
                msg = i;
            }
            else {
                msg += "|" + i;
            }
        }

        var holdcount = count;

        var c = "";
        for (i in holdcount) {
            if (c == "") {
                c = holdcount[i];
            }
            else {
                c += "|" + holdcount[i];
            }
        }

        var total = 0;
        for (i in count) total += count[i];
        for (i in count) count[i] = (count[i] / total) * 100;

        var t = "";
        var totalcount = 0;
        for (i in count) {
            if (t == "") {
                t = roundNumber(count[i], 0);
            }
            else {
                t += "|" + roundNumber(count[i], 0);
            }
            totalcount += 1;
        }

        var categorynames = [];
        var percentages = [];
        var totals = [];

        if (totalcount > 1) {
            categorynames = msg.split("|");
            percentages = t.split("|");
            totals = c.split("|");
        }
        else {
            categorynames[0] = msg;
            percentages[0] = t;
            totals[0] = c;
        }

        // get the reference for the body
        var myDiv = document.getElementById("divSummaryCAD");

        document.getElementById("tipSummaryCAD").style.visibility = "visible";
        document.getElementById("tipCSV_CAD").style.visibility = "visible";

        // creates <table> and <tbody> elements
        mytable = document.createElement("table");
        mytable.id = "tableSummary_CAD";
        mytable.className = "yui";

        mytableheader = document.createElement("thead");

        mytableheader.id = "cHead";

        mycurrent_row = document.createElement("tr");
        mycurrent_cell = document.createElement("th");
        mycurrent_a = document.createElement("a");
        mycurrent_a.href = "";
        mycurrent_a.title = "";
        mycurrent_a.innerHTML = "Incident Category";
        mycurrent_cell.appendChild(mycurrent_a);
        mycurrent_row.appendChild(mycurrent_cell);

        mycurrent_cell = document.createElement("th");
        mycurrent_a = document.createElement("a");
        mycurrent_a.href = "";
        mycurrent_a.title = "";
        mycurrent_a.innerHTML = "Count";
        mycurrent_cell.appendChild(mycurrent_a);
        mycurrent_row.appendChild(mycurrent_cell);

        mycurrent_cell = document.createElement("th");
        mycurrent_a = document.createElement("a");
        mycurrent_a.href = "";
        mycurrent_a.title = "";
        mycurrent_a.innerHTML = "Percent";
        mycurrent_cell.appendChild(mycurrent_a);
        mycurrent_row.appendChild(mycurrent_cell);

        mytableheader.appendChild(mycurrent_row);
        mytable.appendChild(mytableheader);

        mybody = document.createElement("tbody");

        for (var i = 0; i < categorynames.length; i++) {

            mycurrent_row = document.createElement("tr");
            mycurrent_cell = document.createElement("td");
            currenttext = document.createTextNode(categorynames[i]);
            mycurrent_cell.appendChild(currenttext);
            mycurrent_row.appendChild(mycurrent_cell);

            mycurrent_cell = document.createElement("td");
            currenttext = document.createTextNode(totals[i]);
            mycurrent_cell.appendChild(currenttext);
            mycurrent_row.appendChild(mycurrent_cell);

            mycurrent_cell = document.createElement("td");
            currenttext = document.createTextNode(percentages[i] + "%");
            mycurrent_cell.appendChild(currenttext);
            mycurrent_row.appendChild(mycurrent_cell);

            mybody.appendChild(mycurrent_row);
        }

        mytable.appendChild(mybody);
        myDiv.appendChild(mytable);
        mytable.setAttribute("border", "0");
        mytable.setAttribute("cellspacing", "1");

        $("#tableSummary_CAD").tablesorter({ sortList: [[2, 1]], widgets: ['zebra'] });

        var t = setTimeout('hideWorking()', 1000);

    }
    catch (err) {
        errorWin(err.description, "buildSummaryTable_CAD");
    }
}

function buildSummaryTable(ary) {

    try {

        updateWorking('building crime record summary table');

        var aryCodes = ary.split("|");

        aryCodes.sort();

        var count = [];
        var msg = "";

        for (var i = 0; i < aryCodes.length; i++) {
            if (count[aryCodes[i]]) {
                count[aryCodes[i]] += 1;
            }
            else {
                count[aryCodes[i]] = 1;
            }
        }

        var a = [];
        var l = aryCodes.length;
        for (var i = 0; i < l; i++) {
            for (var j = i + 1; j < l; j++) {
                // If this[i] is found later in the array
                if (aryCodes[i] === aryCodes[j])
                    j = ++i;
            }
            a.push(aryCodes[i]);
        }

        aryCodes = a;

        msg = "";
        for (i in count) {
            if (msg == "") {
                msg = i;
            }
            else {
                msg += "|" + i;
            }
        }

        var holdcount = count;

        var c = "";
        for (i in holdcount) {
            if (c == "") {
                c = holdcount[i];
            }
            else {
                c += "|" + holdcount[i];
            }
        }

        var total = 0;
        for (i in count) total += count[i];
        for (i in count) count[i] = (count[i] / total) * 100;

        var t = "";
        var totalcount = 0;
        for (i in count) {
            if (t == "") {
                t = roundNumber(count[i], 0);
            }
            else {
                t += "|" + roundNumber(count[i], 0);
            }
            totalcount += 1;
        }

        var categorynames = [];
        var percentages = [];
        var totals = [];

        if (totalcount > 1) {
            categorynames = msg.split("|");
            percentages = t.split("|");
            totals = c.split("|");
        }
        else {
            categorynames[0] = msg;
            percentages[0] = t;
            totals[0] = c;
        }

        // get the reference for the body
        var myDiv = document.getElementById("divSummaryRMS");

        //    var myDivChart = document.getElementById("divSummaryRMS_Chart");
        //    myDivChart.style.visibility = "visible";

        //    var div = document.createElement("div");
        //    div.style.width = "300px";
        //    div.style.height = "225px";
        //    dijit.byId("divSummaryRMS_Chart_Inner").setContent(div);

        document.getElementById("tipSummaryRMS").style.visibility = "visible";
        document.getElementById("tipCSV").style.visibility = "visible";

        // creates <table> and <tbody> elements
        mytable = document.createElement("table");
        mytable.id = "tableSummary_RMS";
        mytable.className = "yui";

        mytableheader = document.createElement("thead");
        mytableheader.id = "aHead";
        mycurrent_row = document.createElement("tr");

        mycurrent_cell = document.createElement("th");
        mycurrent_a = document.createElement("a");
        mycurrent_a.href = "";
        mycurrent_a.title = "";
        mycurrent_a.innerHTML = "Crime Category";
        mycurrent_cell.appendChild(mycurrent_a);
        mycurrent_row.appendChild(mycurrent_cell);

        mycurrent_cell = document.createElement("th");
        mycurrent_a = document.createElement("a");
        mycurrent_a.href = "";
        mycurrent_a.title = "";
        mycurrent_a.innerHTML = "Count";
        mycurrent_cell.appendChild(mycurrent_a);
        mycurrent_row.appendChild(mycurrent_cell);

        mycurrent_cell = document.createElement("th");
        mycurrent_a = document.createElement("a");
        mycurrent_a.href = "";
        mycurrent_a.title = "";
        mycurrent_a.innerHTML = "Percent";
        mycurrent_cell.appendChild(mycurrent_a);
        mycurrent_row.appendChild(mycurrent_cell);

        mytableheader.appendChild(mycurrent_row);
        mytable.appendChild(mytableheader);

        mybody = document.createElement("tbody");

        // add chart
        //    var chartTwo = new dojox.charting.Chart2D(div);
        //    chartTwo.setTheme(dojox.charting.themes.MiamiNice);
        //    chartTwo.addPlot("default", {
        //         type: "Pie",
        //         font: "normal normal 8pt Tahoma",
        //         fontColor: "black",
        //         radius: 65,
        //         labelOffset: -25
        //     });
        //    
        //    var series = [];
        for (var i = 0; i < categorynames.length; i++) {

            mycurrent_row = document.createElement("tr");
            mycurrent_cell = document.createElement("td");
            currenttext = document.createTextNode(categorynames[i]);
            mycurrent_cell.appendChild(currenttext);
            mycurrent_row.appendChild(mycurrent_cell);

            mycurrent_cell = document.createElement("td");
            currenttext = document.createTextNode(totals[i]);
            mycurrent_cell.appendChild(currenttext);
            mycurrent_row.appendChild(mycurrent_cell);

            mycurrent_cell = document.createElement("td");
            currenttext = document.createTextNode(percentages[i] + "%");
            mycurrent_cell.appendChild(currenttext);
            mycurrent_row.appendChild(mycurrent_cell);

            //        series.push({ y: totals[i], text: categorynames[i], stroke: "black", tooltip: categorynames[i] + ": " + totals[i] + " (" + percentages[i] + "%)" });

            mybody.appendChild(mycurrent_row);
        }

        mytable.appendChild(mybody);
        myDiv.appendChild(mytable);
        mytable.setAttribute("border", "0");
        mytable.setAttribute("cellspacing", "1");

        //    chartTwo.addSeries("Series A", series);
        //    var anim_a = new dojox.charting.action2d.MoveSlice(chartTwo, "default");
        //    var anim_b = new dojox.charting.action2d.Highlight(chartTwo, "default");
        //    var anim_c = new dojox.charting.action2d.Tooltip(chartTwo, "default");
        //    chartTwo.render();

        //    var divLegend = document.createElement("div");
        //    divLegend.id = "Legend";
        //    dijit.byId("divSummaryRMS_Chart_Inner").domNode.appendChild(divLegend);

        //    var legendTwo = new dojox.charting.widget.Legend({ chart: chartTwo }, "Legend");

        $("#tableSummary_RMS").tablesorter({ sortList: [[2, 1]], widgets: ['zebra'] });

        if (cadMap == "") { var t = setTimeout('hideWorking()', 1000); }

    }
    catch (err) {
        errorWin(err.description, "buildSummaryTable");
    }
}

function unquote(s) {
    re = new RegExp("^\"((?:\n|.)*)\"$");
    var m = null;
    if (m = s.match(re)) {
        s = m[1];
    }
    return s;
};
/*
function buildTable - take results and construct the result table.
*/

function buildTable(resultFeatures) {

    try {

        updateWorking('building crime record result table');
        
        var splitReal = fldsSmallReturnTableReal_RMS.split("|");
        var splitAlias = fldsSmallReturnTableAlias_RMS.split("|");

        // get the reference for the body
        var myDiv = document.getElementById("divTableBody");
//        var oldTable = document.getElementById("tableOne");

//        if (oldTable != null) {
//            myDiv.removeChild(oldTable);
//        }

        // creates <table> and <tbody> elements
        mytable = document.createElement("table");
        mytable.id = "tableOne";
        mytable.className = "yui";

        mytableheader = document.createElement("thead");
        mytableheader.id = "AttributeHead";
        mycurrent_row = document.createElement("tr");

        if (showCrimePoints == true) {

            mycurrent_cell = document.createElement("th");
            currenttext = document.createTextNode("Map");
            mycurrent_cell.appendChild(currenttext);
            mycurrent_row.appendChild(mycurrent_cell);

            mycurrent_cell = document.createElement("th");
            currenttext = document.createTextNode("Symbol");
            mycurrent_cell.appendChild(currenttext);
            mycurrent_row.appendChild(mycurrent_cell);

        }

        var featureAttributes = resultFeatures[0].attributes;
        for (att in featureAttributes) {
            bool = -1;

            for (i = 0; i < splitReal.length; i++) {
                if (splitReal[i] == att) {
                    bool = i;
                }
            }

            if (bool > -1) {
                mycurrent_cell = document.createElement("th");
                mycurrent_a = document.createElement("a");
                mycurrent_a.href = "#";
                mycurrent_a.title = "Click header to sort";
                mycurrent_a.innerHTML = splitAlias[bool];
                mycurrent_cell.appendChild(mycurrent_a);
                mycurrent_row.appendChild(mycurrent_cell);
            }
        }

        mytableheader.appendChild(mycurrent_row);
        mytable.appendChild(mytableheader);

        mytablefooter = document.createElement("tfoot");
        mytablefooter.id = "AttributeFoot";
        mycurrent_row = document.createElement("tr");
        mycurrent_row.id = "pagerOne";

        mycurrent_cell = document.createElement("td");
        if (showCrimePoints == true) {
            mycurrent_cell.colSpan = splitReal.length + 2;
        }
        else {
            mycurrent_cell.colSpan = splitReal.length;
        }
        mycurrent_cell.align = "left";

        mycurrent_p = document.createElement("p");
        //    alert(summaryCount.toString());
        //    alert(summaryLocation);
        //    alert(summaryDate);
        //    alert(summaryBuffer);
        //    alert(summaryCodes);
        mycurrent_p.innerHTML = "SUMMARY: " + "<br />" + "Number selected: " + summaryCount.toString() +
            "<br />" + "Location: " + summaryLocation.toUpperCase() +
            "<br />" + summaryDate +
            "<br />" + "Buffer distance: " + summaryBuffer +
            "<br />" + "Crime types: " + summaryCodes;
        mycurrent_cell.appendChild(mycurrent_p);

        mycurrent_row.appendChild(mycurrent_cell);

        mytablefooter.appendChild(mycurrent_row);
        mytable.appendChild(mytablefooter);

        mybody = document.createElement("tbody");

        for (var j = 0, jl = resultFeatures.length; j < jl; j++) {

            var graphic = resultFeatures[j];
            graphic.geometry.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
            var pnt = new esri.geometry.Point();
            pnt = graphic.geometry;

            var featureAttributes = resultFeatures[j].attributes;

            mycurrent_row = document.createElement("tr");

            if (showCrimePoints == true) {

                mycurrent_cell = document.createElement("td");
                mycurrent_cell.align = "center";
                inhtml = '<img src="images/nav_zoomin.png" alt="Highlight record" onclick=highlightRecord(' + pnt.x + ',' + pnt.y + ') />';
                mycurrent_cell.innerHTML = inhtml;
                mycurrent_row.appendChild(mycurrent_cell);
                mybody.appendChild(mycurrent_row);

                img = "images/rms_icons/" + findCategoryCode_RMS(featureAttributes[symbolMatchField_RMS]) + ".png";

                mycurrent_cell = document.createElement("td");
                mycurrent_cell.align = "center";
                inhtml = '<img src="' + img + '" alt="Code symbol"  />';
                mycurrent_cell.innerHTML = inhtml;
                mycurrent_row.appendChild(mycurrent_cell);
                mybody.appendChild(mycurrent_row);

            }

            for (att in featureAttributes) {
                bool = -1;
                for (i = 0; i < splitReal.length; i++) {
                    if (splitReal[i] == att) {
                        bool = i;
                    }
                }
                if (bool > -1) {
                    mycurrent_cell = document.createElement("td");
                    currenttext = document.createTextNode(featureAttributes[att]);
                    mycurrent_cell.appendChild(currenttext);
                    mycurrent_row.appendChild(mycurrent_cell);
                    mybody.appendChild(mycurrent_row);
                }
            }
        }

        // appends <tbody> into <table>
        mytable.appendChild(mybody);
        // appends <table> into <body>
        myDiv.appendChild(mytable);
        // sets the border attribute of mytable to 2;
        mytable.setAttribute("border", "0");
        mytable.setAttribute("cellspacing", "1");
        mytable.className = "yui";
        mytable.id = "tableOne";

        if (showCrimePoints == true) {
            //$("#tableOne").tablesorter({ debug: false, sortList: [[2, 0]], widgets: ['zebra', 'columnHighlight'] });
            $("#tableOne").tablesorter({ sortList: [[2, 1]], headers: { 0: { sorter: false }, 1: { sorter: false} }, widgets: ['zebra'] });
        }
        else {
            $("#tableOne").tablesorter({ sortList: [[0, 1]], widgets: ['zebra'] });
        }

    }
    catch (err) {
        errorWin(err.description, "buildTable");
        return "";
    }
}

function buildTable_CAD(resultFeatures) {

    try {

        updateWorking('building calls for service result table');

        var splitReal = fldsSmallReturnTableReal_CAD.split("|");
        var splitAlias = fldsSmallReturnTableAlias_CAD.split("|");

        // get the reference for the body
        var myDiv = document.getElementById("divTableBody_CAD");
//        var oldTable = document.getElementById("tableTwo");

//        if (oldTable != null) {
//            myDiv.removeChild(oldTable);
//        }

        // creates <table> and <tbody> elements
        mytable = document.createElement("table");
        mytable.id = "tableTwo";
        mytable.className = "yui";

        mytableheader = document.createElement("thead");
        mytableheader.id = "cadAttributeHead";
        mycurrent_row = document.createElement("tr");

        if (showCADPoints == true) {

            mycurrent_cell = document.createElement("th");
            currenttext = document.createTextNode("Map");
            mycurrent_cell.appendChild(currenttext);
            mycurrent_row.appendChild(mycurrent_cell);

            mycurrent_cell = document.createElement("th");
            currenttext = document.createTextNode("Symbol");
            mycurrent_cell.appendChild(currenttext);
            mycurrent_row.appendChild(mycurrent_cell);

        }

        var featureAttributes = resultFeatures[0].attributes;
        for (att in featureAttributes) {
            bool = -1;

            for (i = 0; i < splitReal.length; i++) {
                if (splitReal[i] == att) {
                    bool = i;
                }
            }

            if (bool > -1) {
                mycurrent_cell = document.createElement("th");
                mycurrent_a = document.createElement("a");
                mycurrent_a.href = "#";
                mycurrent_a.title = "Click header to sort";
                mycurrent_a.innerHTML = splitAlias[bool];
                mycurrent_cell.appendChild(mycurrent_a);
                mycurrent_row.appendChild(mycurrent_cell);
            }
        }

        mytableheader.appendChild(mycurrent_row);
        mytable.appendChild(mytableheader);

        mytablefooter = document.createElement("tfoot");
        mytablefooter.id = "cadAttributeFoot";
        mycurrent_row = document.createElement("tr");
        mycurrent_row.id = "cadpagerOne";

        mycurrent_cell = document.createElement("td");
        if (showCADPoints == true) {
            mycurrent_cell.colSpan = splitReal.length + 2;
        }
        else {
            mycurrent_cell.colSpan = splitReal.length;
        }
        mycurrent_cell.align = "left";

        mycurrent_p = document.createElement("p");
        //    alert(summaryCount.toString());
        //    alert(summaryLocation);
        //    alert(summaryDate);
        //    alert(summaryBuffer);
        //    alert(summaryCodes);
        mycurrent_p.innerHTML = "SUMMARY: " + "<br />" + "Number selected: " + summaryCount_CAD.toString() +
        "<br />" + "Location: " + summaryLocation.toUpperCase() +
        "<br />" + summaryDate +
        "<br />" + "Buffer distance: " + summaryBuffer +
        "<br />" + "Incident types: " + summaryCodes_CAD;
        mycurrent_cell.appendChild(mycurrent_p);

        mycurrent_row.appendChild(mycurrent_cell);

        mytablefooter.appendChild(mycurrent_row);
        mytable.appendChild(mytablefooter);

        mybody = document.createElement("tbody");

        for (var j = 0, jl = resultFeatures.length; j < jl; j++) {

            var graphic = resultFeatures[j];
            graphic.geometry.setSpatialReference(new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));
            var pnt = new esri.geometry.Point();
            pnt = graphic.geometry;

            var featureAttributes = resultFeatures[j].attributes;

            mycurrent_row = document.createElement("tr");

            if (showCADPoints == true) {

                mycurrent_cell = document.createElement("td");
                mycurrent_cell.align = "center";
                inhtml = '<img src="images/nav_zoomin.png" alt="Highlight record" onclick=highlightRecord(' + pnt.x + ',' + pnt.y + ') />';
                mycurrent_cell.innerHTML = inhtml;
                mycurrent_row.appendChild(mycurrent_cell);
                mybody.appendChild(mycurrent_row);

                img = "images/cad_icons/" + findCategoryCode_CAD(featureAttributes[symbolMatchField_CAD]) + ".png";

                mycurrent_cell = document.createElement("td");
                mycurrent_cell.align = "center";
                inhtml = '<img src="' + img + '" alt="Code symbol"  />';
                mycurrent_cell.innerHTML = inhtml;
                mycurrent_row.appendChild(mycurrent_cell);
                mybody.appendChild(mycurrent_row);

            }

            for (att in featureAttributes) {
                bool = -1;
                for (i = 0; i < splitReal.length; i++) {
                    if (splitReal[i] == att) {
                        bool = i;
                    }
                }
                if (bool > -1) {
                    mycurrent_cell = document.createElement("td");
                    currenttext = document.createTextNode(featureAttributes[att]);
                    mycurrent_cell.appendChild(currenttext);
                    mycurrent_row.appendChild(mycurrent_cell);
                    mybody.appendChild(mycurrent_row);
                }
            }
        }

        // appends <tbody> into <table>
        mytable.appendChild(mybody);
        // appends <table> into <body>
        myDiv.appendChild(mytable);
        // sets the border attribute of mytable to 2;
        mytable.setAttribute("border", "0");
        mytable.setAttribute("cellspacing", "1");
        mytable.className = "yui";
        mytable.id = "tableTwo";

        if (showCADPoints == true) {
            $("#tableTwo").tablesorter({ sortList: [[2, 0]], headers: { 0: { sorter: false }, 1: { sorter: false} }, widgets: ['zebra'] });
        }
        else {
            $("#tableTwo").tablesorter({ sortList: [[0, 0]], widgets: ['zebra'] });
        }

    }
    catch (err) {
        errorWin(err.description, "buildTable_CAD");
        return "";
    }
}

function highlightRecord(x, y) {

    try {

        for (i = 0; i < map.graphics.graphics.length; i++) {
            pdel = new esri.Graphic();
            pdel = map.graphics.graphics[i];
            if (pdel.infoTemplate != null) {
                ptitle = pdel.infoTemplate.title;
                if (ptitle == "Highlight") {
                    map.graphics.remove(pdel);
                }
            }
        }

        var pnt = new esri.geometry.Point(x, y, new esri.SpatialReference({ wkid: parseInt(refScale_baseMap) }));

        var infoTemplate = new esri.InfoTemplate();
        infoTemplate.title = "Highlight";

        var symbol = new esri.symbol.SimpleMarkerSymbol();
        symbol.setStyle(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE);
        symbol.setColor(new dojo.Color([255, 0, 0, 0.25]));
        symbol.outline = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2);
        symbol.setSize(24);

        var graphic = new esri.Graphic(pnt, symbol);
        graphic.setInfoTemplate(infoTemplate);
        map.graphics.add(graphic);

    }
    catch (err) {
        errorWin(err.description, "highlightRecord");
    }
}

function readRMSCodeTable() {

    try {

        var myCodeTable = document.getElementById("CODES");

        for (i = 0; i < myCodeTable.rows.length; i++) {

            myCells = myCodeTable.rows[i].cells;
            //             CODE                         CATEGORY                     SUB
            codeArray[i] = myCells[1].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[2].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[3].innerHTML.replace(/^\s+|\s+$/g, '');
            catArray[i] = myCells[2].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[1].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[3].innerHTML.replace(/^\s+|\s+$/g, '');
            //                              CATEGORY                                         SUB                                                            CODE
            catsubcodeArray[i] = myCells[2].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[3].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[1].innerHTML.replace(/^\s+|\s+$/g, '');
        }

        codeArray.sort();
        catArray.sort();
        catsubcodeArray.sort();

        createCrimeList2();

    }
    catch (err) {
        errorWin(err.description, "readRMSCodeTable");
    }
}

function readCADCodeTable() {

    try {

        var myCodeTable = document.getElementById("CADCODES");

        for (i = 0; i < myCodeTable.rows.length; i++) {

            myCells = myCodeTable.rows[i].cells;
            //             CODE                         CATEGORY                     SUB
            CAD_codeArray[i] = myCells[1].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[2].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[3].innerHTML.replace(/^\s+|\s+$/g, '');
            CAD_catArray[i] = myCells[2].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[1].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[3].innerHTML.replace(/^\s+|\s+$/g, '');
            CAD_catsubcodeArray[i] = myCells[2].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[3].innerHTML.replace(/^\s+|\s+$/g, '') + "|" + myCells[1].innerHTML.replace(/^\s+|\s+$/g, '');

        }

        CAD_codeArray.sort();
        CAD_catArray.sort();
        CAD_catsubcodeArray.sort();

        createCADList();

    }
    catch (err) {
        errorWin(err.description, "readCADCodeTable");
    }
}

function returnCrimeString() {

    var mycrimes = treeCrime.getAllChecked();
    var returnstring = "";

    var tmp = "'" + mycrimes + "'";

    if (tmp.indexOf(",") == -1) {
        returnstring = "'" + idcodeArray[mycrimes] + "'";
    }
    else {
        var myArray = mycrimes.split(",");
        for (i = 0; i < myArray.length; i++) {

            if (returnstring == "") {
                returnstring = "'" + idcodeArray[myArray[i]] + "'";
            }
            else {
                returnstring = returnstring + ", '" + idcodeArray[myArray[i]] + "'";
            }
        }
    }
    //alert(returnstring);
    return returnstring;
}

function returnCADString() {

    var myincidents = treeCAD.getAllChecked();
    var returnstring = "";

    var tmp = "'" + myincidents + "'";

    if (tmp.indexOf(",") == -1) {
        returnstring = "'" + CAD_idcodeArray[myincidents] + "'";
    }
    else {
        var myArray = myincidents.split(",");
        for (i = 0; i < myArray.length; i++) {
            if (returnstring == "") {
                returnstring = "'" + CAD_idcodeArray[myArray[i]] + "'";
            }
            else {
                returnstring = returnstring + ", '" + CAD_idcodeArray[myArray[i]] + "'";
            }
        }
    }
    return returnstring;
}

function createCrimeList2() {

    try {

        var newArray = new Array();
        var currentRec = "";
        var child = 0;
        var parnt = 0;
        var id = 1;

        // get the reference for the body
        var myDiv = document.getElementById("divCrimeLegendBody");
        var oldTable = document.getElementById("tableLegend");

        if (oldTable != null) {
            myDiv.removeChild(oldTable);
        }

        // creates <table> and <tbody> elements
        mytable = document.createElement("table");
        mytable.id = "tableLegend";
        //mytable.border = "1";

        mybody = document.createElement("tbody");

        //0 cat  1 sub 2 code
        for (i = 0; i < catsubcodeArray.length; i++) {

            mycurrent_row = document.createElement("tr");

            var minArray = catsubcodeArray[i].split("|");
            var content = minArray[0];

            if (currentRec != content) {
                var currentRec = content;
                child = 0;
                var parnt = id;
            }
            else {
                child = 1;
            }

            if (child == 0) {
                var array1 = new Array(id, "0", minArray[0]);
                mycurrent_cell = document.createElement("td");
                //            currenttext = document.createTextNode(minArray[0]);
                //            mycurrent_cell.appendChild(currenttext);
                mycurrent_cell.valign = "middle";
                blank = "images/blank.png";
                img = "images/rms_icons/" + minArray[2] + ".png";
                inhtml = '<img src="' + img + '" alt="" height="20px" width="20px" style="border-width: 0px; vertical-align: middle;"/>';
                inhtml = inhtml + '<img src="' + blank + '" alt="" height="16px" width="16px" style="border-width: 0px; vertical-align: middle;"/>';
                mycurrent_cell.innerHTML = inhtml + minArray[0];
                mycurrent_row.appendChild(mycurrent_cell);
                mybody.appendChild(mycurrent_row);
            }
            else {
                var array1 = new Array(id, parnt, "(" + minArray[2] + ") " + minArray[1]);
                mycurrent_cell = document.createElement("td");
                mycurrent_cell.valign = "middle";
                blank = "images/blank.png";
                inhtml = '<img src="' + blank + '" alt="" height="16px" width="16px" style="border-width: 0px; vertical-align: middle;"/>';
                img = "images/rms_icons/" + minArray[2] + ".png";
                inhtml = inhtml + '<img src="' + img + '" alt="" height="20px" width="20px" style="border-width: 0px; vertical-align: middle;"/>';
                inhtml = inhtml + '<img src="' + blank + '" alt="" height="16px" width="16px" style="border-width: 0px; vertical-align: middle;"/>';
                mycurrent_cell.innerHTML = inhtml + "(" + minArray[2] + ") " + minArray[1];
                mycurrent_row.appendChild(mycurrent_cell);
                mybody.appendChild(mycurrent_row);
            }

            newArray[i] = array1;

            idcodeArray[id] = minArray[2];

            id += 1;
        }

        treeCrime = new dhtmlXTreeObject("divCodes", "100%", "100%", 0);
        treeCrime.setImagePath("images/tree/");
        treeCrime.enableCheckBoxes(1);
        treeCrime.enableThreeStateCheckboxes(true);
        treeCrime.loadJSArray(newArray);

        // appends <tbody> into <table>
        mytable.appendChild(mybody);
        // appends <table> into <body>
        myDiv.appendChild(mytable);

    }
    catch (err) {
        errorWin(err.description, "createCrimeList2");
    }
}

function createCrimeList() {

    var newArray = new Array();
    var currentRec = "";
    var child = 0;
    var parnt;

    for (i = 0; i < codeArray.length; i++) {

        var minArray = codeArray[i].split("|");
        var content = minArray[1];

        if (currentRec != content) {
            var currentRec = content;
            child = 0;
            var parnt = minArray[0];
        }
        else {
            child = 1;
        }

        if (child == 0) {
            var array1 = new Array(minArray[0], 0, minArray[1]);
        }
        else {
            var array1 = new Array(minArray[0], parnt, minArray[2]);
        }

        newArray[i] = array1;
    }

    treeCrime = new dhtmlXTreeObject("divCodes", "100%", "100%", 0);
    treeCrime.setImagePath("images/tree/");
    treeCrime.enableCheckBoxes(1);
    treeCrime.enableThreeStateCheckboxes(true);
    treeCrime.loadJSArray(newArray);
}

function createCADList() {

    var newArray = new Array();
    var currentRec = "";
    var child = 0;
    var parnt = 0;
    var id = 1;

    //0 cat  1 sub 2 code
    for (i = 0; i < CAD_catsubcodeArray.length; i++) {

        var minArray = CAD_catsubcodeArray[i].split("|");
        var content = minArray[0];

        if (currentRec != content) {
            var currentRec = content;
            child = 0;
            var parnt = id;
        }
        else {
            child = 1;
        }

        if (child == 0) {
            var array1 = new Array(id, "0", minArray[0]);
        }
        else {
            var array1 = new Array(id, parnt, minArray[1]);
        }

        newArray[i] = array1;

        CAD_idcodeArray[id] = minArray[2];

        id += 1;
    }

    treeCAD = new dhtmlXTreeObject("divCADCodes", "100%", "100%", 0);
    treeCAD.setImagePath("images/tree/");
    treeCAD.enableCheckBoxes(1);
    treeCAD.enableThreeStateCheckboxes(true);
    treeCAD.loadJSArray(newArray);
}

function codeClicked(evt) {

    if (evt == "All") {

        bool = document.getElementById("chkAll").checked;

        if (bool) {
            document.getElementById("divCodes").style.display = "none";
        }
        else {
            document.getElementById("divCodes").style.display = "block";
        }
    }
}

function CAD_codeClicked(evt) {
    if (evt == "All") {
        bool = document.getElementById("chkAllCAD").checked;
        if (bool) {
            document.getElementById("divCADCodes").style.display = "none";
        }
        else {
            document.getElementById("divCADCodes").style.display = "block";
        }
    }
}

function findCategoryCode_CAD(codeCAD) {
    var myCat = "";
    var rslt = "UNKNOWN";
    for (i = 0; i < CAD_codeArray.length; i++) {
        var codeSplit = CAD_codeArray[i].split("|");
        if (codeSplit[0] == codeCAD) {
            rslt = codeCAD;
            break;
        }
    }
    return rslt;
}

function findCategoryCode_RMS(codeCrime) {
    var myCat = "";
    var rslt = "UNKNOWN";
    for (i = 0; i < codeArray.length; i++) {
        var codeSplit = codeArray[i].split("|");
        if (codeSplit[0] == codeCrime) {
            rslt = codeCrime;
            break;
        }
    }
    return rslt;
}

function findCategoryName(codeCrime) {
    var myCat = "";
    for (i = 0; i < codeArray.length; i++) {
        var codeSplit = codeArray[i].split("|");
        if (codeSplit[0] == codeCrime) {
            myCat = codeSplit[1];
            break;
        }
    }

    for (i = 0; i < codeArray.length; i++) {
        var codeSplit = codeArray[i].split("|");
        if (codeSplit[1] == myCat) {
            return codeSplit[1];
        }
    }
}

function findCategoryName_CAD(codeCAD) {
    var myCat = "";
    for (i = 0; i < CAD_codeArray.length; i++) {
        var codeSplit = CAD_codeArray[i].split("|");
        if (codeSplit[0] == codeCAD) {
            myCat = codeSplit[1];
            break;
        }
    }

    for (i = 0; i < CAD_codeArray.length; i++) {
        var codeSplit = CAD_codeArray[i].split("|");
        if (codeSplit[1] == myCat) {
            return codeSplit[1];
        }
    }
}
