﻿// ######################################################################################
// Purpose: This module deals with all the searches in the application
//
//  functions:
//      initSearch: this is called from map::onBaseLayerloaded function. reuires that the parcel layer exists.  It initializes the searches in the app.
//
//      <-- These functions are general helper functions -->
//      showSearching: show the searching tag
//      showSearchError: show a search error message
//      createAttachOption: adds a item to a drop down list 
//
//      <-- These functions deal with zoom in the advanced zooming panel -->
//      doSearchMonument:  zooms to the x/y coords embedded in the value of the dropdown list
//      doCityZoom: searches the city layer for the selected city and zooms to the city
//      doSubGroupZoom: searches the Subdivision group layer by SUBGROUP
//      doZoomScale: performs the zoom to scale function given a scale in feet
//      doZoomScale_click: Triggered when user clicks zoom to scale search from either the print panel or the zoom panel
//      doZoom_Complete: When the zoom function completes, it zooms the map to the extent of the results set
//      clearZooms: Clears the input controls on the ZOOM Panel.
//
//      <--- These functions deal with zoom to streets
//      initStreetsFilteringSelect:
//      streetsAutoComplete_Click: Triggered when user click search for street button
//          - searches street using find function
//          - When the result set is brought back from REST API, then goes to 'streetsAutoComplete_ClickCompleted' function
//      streetsAutoComplete_ClickCompleted: Highlights a zooms to the street requested
//
//      <-- These function shandle click events from the toolbar
//      searchPanel_onClick:
//      advancedSearchPanel_onClick:
//      bufferSearchPanel_onClick: 
//    
//      <--- these functions have to do with searching parcels -->
//      doSearchByOwnerName: Searches by owner first and last name
//      doSearchAddress: Searches by Property Address
//      doSearchPID: Searches by Parcel ID
//      clearSearchPanel: clears the search panel
//      initAdvancedSearch: Initializes the dropdown list -- called from initSearch function
//      doAdvancedSearch: Executes the Advanced Parcel Query
//      clearAdvancedSearch: clears the advanced search panel
//      initBufferTool: shows the buffer tool div
//      addBufferGeometry:  Adds the Buffer geometry.  note: also called from printResults after paging...
//
//      parcelQuery (Structure/Object)
//          - Holds the information for the query
//          - has the ability to go back to the database for excel reports, etc.
// #####################################################################################

// Elements in AdvancedSearch:
var townshipElementName = "seltownship";
var cityElementName = "selcity2";
var acreageElementName = "selacreage";
var toYearElementName = "selYYYY2";
var fromYearElementName = "selYYYY1";
var toMonthElementName = "selMM2";
var fromMonthElementName = "selMM1";
var totalValueElementName = "selvalue";
var landUseElementName = "selluse";
var impValueElementName = "selimproved";
var subdivisionElementName = "selsub";
var bookElementName = "txtdeedbook";
var pageElementName = "txtdeedpage";

var selectedParcelGeometry;
var useSelectedParcel;
var returnToPanel = "SEARCH";
var txtWhereClause;

var bufferSymbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 3);

//var bufferSymbol = new esri.symbol.SimpleFillSymbol(
//        esri.symbol.SimpleFillSymbol.STYLE_SOLID,
//        new esri.symbol.SimpleLineSymbol(
//          esri.symbol.SimpleLineSymbol.STYLE_SOLID,
//          new dojo.Color([255, 0, 0, 0.65]), 2
//        ),
//        new dojo.Color([255, 0, 0, 0.35])
//      );

function initSearch() {


    try {

        // quick find
        quickFind = new esri.tasks.FindTask(searchURL);
        quickFindParams = new esri.tasks.FindParameters();
        quickFindParams.layerIds = [parcels_layerID];
        quickFindParams.searchFields = parcels_quickFind_Fields;
        quickFindParams.returnGeometry = true;
        dojo.connect(dojo.byId("txtownerl"), "onkeydown", function(evt) { if (isEnter(evt)) { doSearchByOwnerName(); } });
        dojo.connect(dojo.byId("txtownerf"), "onkeydown", function(evt) { if (isEnter(evt)) { doSearchByOwnerName(); } });
 
        //zoom to scale
        if (!dojo.isIE)
            dojo.connect(dojo.byId("txtzoomscale"), "onkeydown", function(evt) { if (isEnter(evt)) { doZoomScale_click('txtzoomscale'); } });

        initAdvancedSearch();
        

    } catch (Error) {
        showConfigurationError("Error initializing Searches: " + Error.message);
    }

    try {

        // street directions
        var ddl = dojo.byId("ddlstdir");
        createAttachOption(ddl, "", "");
        createAttachOption(ddl, "N", "N");
        createAttachOption(ddl, "S", "S");
        createAttachOption(ddl, "E", "E");
        createAttachOption(ddl, "W", "W");
    } catch (Error) {
        console.warn("error! initializing Street direction", Error);
    }

    // Get Suffixes
    dojo.xhrGet({
        url: cravenWebServiceURL + "/StreetSuffixes",
        handleAs: "json",
        contentType: "application/json; charset=utf-8",
        load: function(data, args) {
            var contentNode = dojo.byId("ddlstsuffix");
            createAttachOption(contentNode, "", "");
            dojo.forEach(data.d, function(s) {
                createAttachOption(contentNode, s, s);
            });
        },
        error: function(error, args) { console.warn("error! initializing Street Suffixes", error); }
    });

    // Get Monuments
    dojo.xhrGet({
    url: cravenWebServiceURL + "/CravenCountyMonuments",
        handleAs: "json",
        contentType: "application/json; charset=utf-8",
        load: function(data, args) {
            var contentNode = dojo.byId("ddlmonuments");
            createAttachOption(contentNode, "", "");
            dojo.forEach(data.d, function(s) {
                createAttachOption(contentNode, s.Value, s.Text);
            });
            dojo.connect("ddlmonuments", "onchange", doSearchMonument);
        },
        error: function(error, args) { console.warn("error! initializing Mouments", error); }
    });

    // get city names: CityNames
    dojo.xhrGet({
        url: cravenWebServiceURL + "/CityNames",
        handleAs: "json",
        contentType: "application/json; charset=utf-8",
        load: function(data, args) {

            var contentNode = dojo.byId("ddlcityzoom");
            createAttachOption(contentNode, "", "");
            dojo.forEach(data.d, function(s) {
                createAttachOption(contentNode, s, s);
            });

        },
        error: function(error, args) { console.warn("error! initializing Street Suffixes", error); }
    });


    // get Sub division Drop Down List
    dojo.xhrGet({
        url: cravenWebServiceURL + "/SubGroups",
        handleAs: "json",
        contentType: "application/json; charset=utf-8",
        load: function(data, args) {
            var contentNode = dojo.byId("ddlsubgroupzoom");
            var contentNode2 = dojo.byId("selsub");
            createAttachOption(contentNode, "", "");
            createAttachOption(contentNode2, "", "ALL");
             dojo.forEach(data.d, function(s) {
                createAttachOption(contentNode, s, s);
                createAttachOption(contentNode2, s, s);
            });
        },
        error: function(error, args) { console.warn("error! initializing Street Suffixes", error); }
    });
}

function showSearching(msg) {
    if (msg == null)
        msg = "Searching Database";

    var content = "<div style=\"margin: 7px 7px 7px 7px;text-align:center;\"><p><img src=\"Images/callbackActivityIndicator.gif\" alt=\"busy\"/></p><p>" + msg + "</p><p> Please Waiting</p></div>";
    dojo.byId("INFO").innerHTML = content;
    showPanel("INFO");
}

function showSearchError(error) {
    console.debug(error);
    var yy = [];
    var returnToCmd = "showPanel('" + returnToPanel + "')";
    yy.push("<p><a href=\"#\" onmousedown=\"" + returnToCmd + "\"><img src=\"images/jpgs/search_again.jpg\" title=\"Search Again?\"/></a></p>");
    yy.push("<p class=\"attention\">Sorry, but there was an error in the query string</p>");
    
    yy.push("<div style=\"margin7px:color:blue\">");

    dojo.forEach(error.details, function(detail) {
        yy.push("<div>" + detail + "</div>");
    });

    yy.push("<p>Query attempted:</p>");
    yy.push("<p>" + txtWhereClause + "</p>");

    yy.push("</div>");
    dojo.byId("INFO").innerHTML = yy.join("");
    showPanel("INFO");

}

// #################################################################################
//  Initialization function - these occur when the ap starts up
// #################################################################################
function createAttachOption(control, value, text) {
    var opt = document.createElement("option");
    opt.setAttribute("value", value);
    opt.innerHTML = text;
    control.appendChild(opt);
    return false;
}
// #################################################################################

function doSearchByOwnerName() {

    try {

        clearSearchResults();
        clearAllGraphics();


        var lName = dojo.byId("txtownerl").value;
        var fName = dojo.byId("txtownerf").value;
        var oName = "";
        if (lName != "" && fName != "")
            oName = lName + ", " + fName;

        if (lName != "" && fName == "")
            oName = lName;

        oName = oName;

        // reset the where clause global variable...
        parcelQuery.Owner = oName;
        
        returnToPanel = "SEARCH";

        if (oName === "") {
            ShowSearchNoParameters();
            return false;
        }

    } catch (Error) {
        alert("there was an error in doSearchByOwnerName: " + Error.message);
    }
    
    ExecuteParcelSearch(parcelQuery.getOwnerWhereClause(), "owner");
    
    
}


function doSearchAddress() {

    clearSearchResults();
    clearAllGraphics();
 

    var stname = dojo.byId("txtstname").value;
    var hn = dojo.byId("txtstnum").value;
    var stdir = dojo.byId("ddlstdir").value;
    var sttyp = dojo.byId("ddlstsuffix").value;
    parcelQuery.StreetName = stname;
    parcelQuery.StreetDir = stdir;
    parcelQuery.StreetType = sttyp;
    parcelQuery.HouseNum = hn;
    swhere = parcelQuery.getAddressWhereClause();
    returnToPanel = "SEARCH";
    

    if (stname == "") {
        ShowSearchNoParameters();
        return false;
    }

    //Execute task and call showResults on completion
    ExecuteParcelSearch(swhere, "address");

}

function doSearchPID() {

    clearSearchResults();
    clearAllGraphics();

    var twn = "";
    var mapno = "";
    var lot = "";
    
    twn = dojo.byId("txttwn").value;
    mapno = dojo.byId("txtmap").value;
    lot = dojo.byId("txtlot").value;

    if (twn == "" && mapno == "" && lot == "") {
        ShowSearchNoParameters();
        return false;
    }

    for (var i = mapno.length; i < 6; i++) {
        mapno += " ";
    }
    

    var pid = twn + "-" + mapno.toUpperCase() + "-" + lot.toUpperCase();

    // Set up query tasks
    returnToPanel = "SEARCH";
    
    parcelQuery.PID = pid;
    var swhere = parcelQuery.getPIDWhereClause();
    //alert(swhere);
    
    ExecuteParcelSearch(swhere, "pid");

}


function ShowSearchNoParameters() {
    
    var yy = [];
    var returnToCmd = "showPanel('" + returnToPanel + "')";
    yy.push("<p><a href=\"#\" onmousedown=\"" + returnToCmd + "\"><img src=\"images/jpgs/search_again.jpg\" title=\"Search Again?\"/></a></p>");
    yy.push("<p class=\"attention\">Sorry, but your query return no results from the database</p>");
    dojo.byId("grid").innerHTML = yy.join("");
    showPanel("RESULTS");
    return false;

}

function ExecuteParcelSearch(whereClause, sortBy) {
    try {   
    
        showSearching();          
    
        txtWhereClause = whereClause;
        
        setSort(sortBy, true);

        // Set up query tasks
        var queryTask = new esri.tasks.QueryTask(parcelSearchLayerURL);
        var query = new esri.tasks.Query();
        query.where = txtWhereClause;
        query.outFields = parcels_return_fields;
        query.returnGeometry = true;

        //Execute task and call showResults on completion
        queryTask.execute(query, showParcelSearchResults, showSearchError);

        
    } catch (Error) {
        showError("Error in Search: ", Error);
    }
}


function ExecuteParcelFind(searchFields, searchText, whereClause) {
    try {
        txtWhereClause = whereClause;
        var quickFind = new esri.tasks.FindTask(searchURL);
        var quickFindParams = new esri.tasks.FindParameters();
        quickFindParams.layerIds = [parcels_layerID];
        quickFindParams.searchFields = searchFields;
        quickFindParams.returnGeometry = true;
        quickFindParams.searchText = searchText;
        quickFind.execute(quickFindParams, convertFindResult2FeatureSet, showSearchError);
        showSearching();
    } catch (Error) {
        showError("Error in Search: ", Error);
    }
}


function clearSearchPanel() {
    // clear PID
    dojo.byId("txttwn").value = "";
    dojo.byId("txtmap").value = "";
    dojo.byId("txtlot").value = "";

    // clear address search
    dojo.byId("txtstname").value = "";
    dojo.byId("txtstnum").value = "";
    dojo.byId("ddlstdir").value = "";
    dojo.byId("ddlstsuffix").value = "";

    // clear owner name
    dojo.byId("txtownerl").value = "";
    dojo.byId("txtownerf").value = "";
}

function searchPanel_onClick() {
    showPanel('SEARCH');
    clearAllGraphics();
    clearSearchPanel();
}

function advancedSearchPanel_onClick() {
    showPanel('ADVANCEDSEARCH');
    clearAllGraphics();
    clearAdvancedSearch();
}

function bufferSearchPanel_onClick() {
    showPanel('BUFFER');
    clearAllGraphics();
    clearAdvancedSearch();
    initBufferTool(false);
}


function doAdvancedSearch() {

    // save the selected PID from being wacked when we clear the last search result out
    var selectedPID = parcelQuery.selectedPID
 
    clearSearchResults();
    clearAllGraphics();
    
    // get the parameters
    var township = dojo.byId(townshipElementName).value;
    var city = dojo.byId(cityElementName).value;
    var toYear = dojo.byId(toYearElementName).value;
    var fromYear = dojo.byId(fromYearElementName).value;
    var toMonth = dojo.byId(toMonthElementName).value;
    var fromMonth = dojo.byId(fromMonthElementName).value;
    var acreage = dojo.byId(acreageElementName).value;
    var totval = dojo.byId(totalValueElementName).value;
    var landuse = dojo.byId(landUseElementName).value;
    var impval = dojo.byId(impValueElementName).value;
    var bk = dojo.byId(bookElementName).value;
    var pg = dojo.byId(pageElementName).value;
    var subgroup = dojo.byId(subdivisionElementName).value;


    // advanced search
    parcelQuery.township = township;
    parcelQuery.city = city;
    totvals = totval.split(":");
    parcelQuery.minvalue = totvals[0];
    parcelQuery.maxvalue = totvals[1];
    parcelQuery.toYear = toYear;
    parcelQuery.fromYear = fromYear;
    parcelQuery.toMonth = toMonth;
    parcelQuery.fromMonth = fromMonth;
    var acres = acreage.split(":");
    parcelQuery.minacreage = acres[0];
    parcelQuery.maxacreage = acres[1];
    parcelQuery.impval = impval;
    parcelQuery.landuse = landuse;
    parcelQuery.book = bk;
    parcelQuery.page = pg;
    parcelQuery.subgroup = subgroup;


    var d = dojo.byId("bufferdistance").value;
    // Validate input...
    if (isNaN(d)) {
        dojo.byId("bufferdistance").value = '';
        d = 0;
    }
    
    // Set up query tasks
    var advQueryTask = new esri.tasks.QueryTask(parcelSearchLayerURL);
    // Set up query for the hazardous parcel
    var advQuery = new esri.tasks.Query();
    advQuery.where = parcelQuery.getAdvancedWhereClause();

    setSort("pid", true);

    console.debug(advQuery.where);
    txtWhereClause = advQuery.where;

    advQuery.outFields = parcels_return_fields;
    advQuery.returnGeometry = true;


    if (d > 0) {
        parcelQuery.radius = d;


        var bufferQueryCompleted = function(features) {
            console.debug("Finished buffering parcel: ");

            // add the buffer features to the map...
            addBufferGeometry(features);
            // Set up query for surrounding parcels
            advQuery.geometry = features[0].geometry;
            advQuery.outSpatialReference = map.spatialReference;
            advQuery.spatialRelationship = esri.tasks.Query.SPATIAL_REL_INTERSECTS;
            advQueryTask.execute(advQuery, function(features) {
            showParcelSearchResults(features);
                
            }, showSearchError);
        };


        returnToPanel = "BUFFER";
        var params = new esri.tasks.BufferParameters();
        var symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 1);
        var graphic = null;
        if (selectedPID != "") {           
            parcelQuery.selectedPID = selectedPID;
            
            // Set up query tasks
            var queryTask = new esri.tasks.QueryTask(parcelSearchLayerURL);
            var query = new esri.tasks.Query();
            var swhere = parcelFields.PID + " like '" + selectedPID + "%'";
            query.where = swhere;
            query.outFields = parcels_return_fields;
            query.returnGeometry = true;

            //Execute task and call showResults on completion
            queryTask.execute(query, function(results) {
                
                // get the feature
                var graphic = results.features[0];
                params.distances = [d];
                params.bufferSpatialReference = new esri.SpatialReference({ wkid: 2264 });
                params.outSpatialReference = map.spatialReference;
                params.unit = eval("esri.tasks.BufferParameters.UNIT_FOOT");
                params.features = [graphic];
                showSearching();
                gsvc.buffer(params, bufferQueryCompleted, showSearchError);
            
            }, showSearchError);
        } else {
            var pt = map.extent.getCenter();
            graphic = new esri.Graphic(pt);
            parcelQuery.x = pt.x;
            parcelQuery.y = pt.y; 
            
            params.distances = [d];
            params.bufferSpatialReference = new esri.SpatialReference({ wkid: 2264 });
            params.outSpatialReference = map.spatialReference;
            params.unit = eval("esri.tasks.BufferParameters.UNIT_FOOT");
            params.features = [graphic];
            showSearching();
            gsvc.buffer(params, bufferQueryCompleted, showSearchError);

        }

        
    } else {
    
        returnToPanel = "ADVANCEDSEARCH";
        //Execute task and call showResults on completion
        advQueryTask.execute(advQuery, showParcelSearchResults, showSearchError);
        showSearching();
    }

}




function clearAdvancedSearch() {
    dojo.byId(townshipElementName).value = "";
    dojo.byId(cityElementName).value = "";
    dojo.byId(subdivisionElementName).value = "";
    dojo.byId(toYearElementName).value = "";
    dojo.byId(fromYearElementName).value = "";
    dojo.byId(toMonthElementName).value = "";
    dojo.byId(fromMonthElementName).value = "";
    dojo.byId(acreageElementName).value = "0:0";
    dojo.byId(landUseElementName).value = "";
    dojo.byId(impValueElementName).value = "";
    dojo.byId(totalValueElementName).value = "";
    dojo.byId(bookElementName).value = "";
    dojo.byId(pageElementName).value = "";
    dojo.byId("bufferdistance").value = "";
}

function initAdvancedSearch() {

    // townships
    var ddltownship = dojo.byId(townshipElementName);
    createAttachOption(ddltownship, "", "ALL");
    createAttachOption(ddltownship, "1", "1");
    createAttachOption(ddltownship, "2", "2");
    createAttachOption(ddltownship, "3", "3");
    createAttachOption(ddltownship, "5", "5");
    createAttachOption(ddltownship, "6", "6");
    createAttachOption(ddltownship, "7", "7");
    createAttachOption(ddltownship, "8", "8");
    createAttachOption(ddltownship, "9", "9");

    // city element
    var ddlcity = dojo.byId(cityElementName);
    createAttachOption(ddlcity, "", "ALL");
    createAttachOption(ddlcity, "Bridgeton", "Bridgeton");
    createAttachOption(ddlcity, "Cove City", "Cove City");
    createAttachOption(ddlcity, "Dover", "Dover");
    createAttachOption(ddlcity, "Havelock", "Havelock");
    createAttachOption(ddlcity, "New Bern", "New Bern (includes annexes)");
    createAttachOption(ddlcity, "River Bend", "River Bend");
    createAttachOption(ddlcity, "Trent Woods", "Trent Woods");
    createAttachOption(ddlcity, "Vanceboro", "Vanceboro");

    // Year drop down list
    var fromYr = dojo.byId(fromYearElementName);
    var toYear = dojo.byId(toYearElementName);
    createAttachOption(fromYr, "", "year");
    createAttachOption(toYear, "", "year");
    var today = new Date();
    for (i = 2000; i <= today.getFullYear(); i++) {
        createAttachOption(fromYr, i, i);
        createAttachOption(toYear, i, i);
    }

    // Month drop down list
    var fromMn = dojo.byId(fromMonthElementName);
    createAttachOption(fromMn, "", "month");
    createAttachOption(fromMn, "01", "Jan");
    createAttachOption(fromMn, "02", "Feb");
    createAttachOption(fromMn, "03", "Mar");
    createAttachOption(fromMn, "04", "Apr");
    createAttachOption(fromMn, "05", "May");
    createAttachOption(fromMn, "06", "Jun");
    createAttachOption(fromMn, "07", "Jul");
    createAttachOption(fromMn, "08", "Aug");
    createAttachOption(fromMn, "09", "Sep");
    createAttachOption(fromMn, "10", "Oct");
    createAttachOption(fromMn, "11", "Nov");
    createAttachOption(fromMn, "12", "Dec");


    var toMn = dojo.byId(toMonthElementName);
    createAttachOption(toMn, "", "month");
    createAttachOption(toMn, "01", "Jan");
    createAttachOption(toMn, "02", "Feb");
    createAttachOption(toMn, "03", "Mar");
    createAttachOption(toMn, "04", "Apr");
    createAttachOption(toMn, "05", "May");
    createAttachOption(toMn, "06", "Jun");
    createAttachOption(toMn, "07", "Jul");
    createAttachOption(toMn, "08", "Aug");
    createAttachOption(toMn, "09", "Sep");
    createAttachOption(toMn, "10", "Oct");
    createAttachOption(toMn, "11", "Nov");
    createAttachOption(toMn, "12", "Dec");


    // acreage
    var selAcreage = dojo.byId(acreageElementName);
    createAttachOption(selAcreage, "0:0", "ALL");
    createAttachOption(selAcreage, "0:1", "Less than 1 Acre");
    createAttachOption(selAcreage, "1:5", "1 - 5 Acres");
    createAttachOption(selAcreage, "5:10", "5 - 10 Acres");
    createAttachOption(selAcreage, "10:25", "10 - 25 Acres");
    createAttachOption(selAcreage, "25:50", "25 - 50 Acres");
    createAttachOption(selAcreage, "50:100", "50 - 100 Acres");
    createAttachOption(selAcreage, "100:250", "100 - 250 Acres");
    createAttachOption(selAcreage, "250:500", "250 - 500 Acres");
    createAttachOption(selAcreage, "500:0", "More than 500 Acres");

    // total value
    var ddlval = dojo.byId(totalValueElementName);
    createAttachOption(ddlval, "", "ALL");
    createAttachOption(ddlval, "0:10000", "Less than $10,000");
    createAttachOption(ddlval, "10000:25000", "$10,000 - $25,000");
    createAttachOption(ddlval, "25000:50000", "$25,000 - $50,000");
    createAttachOption(ddlval, "50000:75000", "$50,000 - $75,000");
    createAttachOption(ddlval, "75000:100000", "$75,000 - $100,000");
    createAttachOption(ddlval, "100000:250000", "$100,000 - $250,000");
    createAttachOption(ddlval, "250000:500000", "$250,000 - $500,000");
    createAttachOption(ddlval, "500000:750000", "$500,000 - $750,000");
    createAttachOption(ddlval, "750000:1000000", "$750,000 - $1,000,000");
    createAttachOption(ddlval, "1000000:0", "More than $1,000,000");

    // improvement codes
    var ddlimp = dojo.byId(impValueElementName);
    createAttachOption(ddlimp, "", "Both improved and unimproved property");
    createAttachOption(ddlimp, "improved", "Improved : Property with taxable real estate structures");
    createAttachOption(ddlimp, "unimproved", "Unimproved : Property without taxable real estate structures");

    // land use values
    dojo.xhrGet({
        url: cravenWebServiceURL + "/CountyLandUseCodes",
        handleAs: "json",
        contentType: "application/json; charset=utf-8",
        load: function(data, args) {
            var contentNode = dojo.byId("selluse");
            createAttachOption(contentNode, "", "ALL");
            dojo.forEach(data.d, function(s) {
                createAttachOption(contentNode, s.Value, s.Text);
            });

        },
        error: function(error, args) { console.warn("error!", error); }
    });

}

   


// ################################################################
// Zoom Search functions
// ################################################################
function clearZooms() {

    try {
        dojo.byId("ddlmonuments").value = "";
        dojo.byId("ddlcityzoom").value = "";
        dojo.byId("ddlsubgroupzoom").value = "";
        dojo.byId("txtzoomscale").value = "";

        var o = dojo.byId("layout_scale");
        if (o != null)
            o.value = "";
        
        dijit.byId("ddlStreetNameSearch").attr('displayedValue') = "";
    } catch (Error) {
    console.debug("An error occurred in 'clearZooms' function");
    console.debug(Error);
    }
}


function doSearchMonument() {

    try {

        var ddl = dojo.byId("ddlmonuments");
        if ((ddl != null) && (ddl.value != "")) {
            var value = ddl.value;
            var values = value.split(":");
            //console.debug(values);
            var centerPt = new esri.geometry.Point(parseFloat(values[1]), parseFloat(values[0]), map.spatialReference);
            //console.debug(centerPt);
            var xmin, ymin, xmax, ymax;
            xmin = centerPt.x - (1000 / 2);
            ymin = centerPt.y - (1000 / 2);
            xmax = centerPt.x + (1000 / 2);
            ymax = centerPt.y + (1000 / 2);

            var nExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, map.spatialReference);
            //console.debug(nExtent);
            map.setExtent(nExtent);
        }
    } catch (Error) {
        alert(Error.message);
    }

}

function doCityZoom() {

     var ddl = dojo.byId("ddlcityzoom");
     if ((ddl != null) && (ddl.value != "")) {

         if (cityLayerID == -1) {
             cityLayerID = findLayerByName(cityLayerName, "map");
         }

         if (cityLayerID > -1) {

             // Set up query tasks
             var queryTask = new esri.tasks.QueryTask(searchURL + "/" + cityLayerID);
             // Set up query for the hazardous parcel
             var query = new esri.tasks.Query();
             query.where = "CITYNAME = '" + ddl.value + "'";

             query.outFields = parcels_return_fields;
             query.returnGeometry = true;

             //Execute task and call showResults on completion
             queryTask.execute(query, doZoom_Complete);
         }
        
     }

}

function doZoom_Complete(results) {
    try {

        var fullExt = esri.graphicsExtent(results.features);
        if (fullExt != null) {
            map.setExtent(fullExt.expand(1.5));
            clearZooms();
        }
    } catch (Error) {
        console.debug("An error occurred in 'doZoom_Complete' function");
        console.debug(Error);
    }
}

function doSubGroupZoom() {

    try {
        var ddl = dojo.byId("ddlsubgroupzoom");
        if ((ddl != null) && (ddl.value != "")) {

            if (subgroupLayerID == -1)
                subgroupLayerID = findLayerByName(subgroupLayerName, "map");
            

            if (subgroupLayerID > -1) {

                // Set up query tasks
                var queryTask = new esri.tasks.QueryTask(searchURL + "/" + subgroupLayerID);
                // Set up query for the hazardous parcel
                var query = new esri.tasks.Query();
                query.where = "SUBGROUP = '" + ddl.value + "'";

                query.outFields = parcels_return_fields;
                query.returnGeometry = true;

                //Execute task and call showResults on completion
                queryTask.execute(query, doZoom_Complete);
            }

        }
    } catch (Error) {
        console.debug("An error occurred in 'clearZooms' function");
        console.debug(Error);
        alert(Error.message);
    }
}

function doZoomScale(zoomscale) {

    try {
        zoomscale = parseInt(zoomscale);
        var centerPt = map.extent.getCenter();
        var w = map.width;
        var h = map.height;
        var dpi = baseMapLayer.dpi;
        var mapH = map.extent.getHeight();
        var mapW = map.extent.getWidth();
        var xDist = ((w / dpi) * (zoomscale)) / 2;
        var yDist = ((h / dpi) * (zoomscale)) / 2;

        var xmin, ymin, xmax, ymax;
        xmin = centerPt.x - xDist;
        ymin = centerPt.y - yDist;
        xmax = centerPt.x + xDist;
        ymax = centerPt.y + yDist;
        var nExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, map.spatialReference);
        map.setExtent(nExtent);
        clearZooms();
    } catch (Error) {
        console.debug(Error);
    }
}

function doZoomScale_click(elementName) {
    try {
        var scaleElement = dojo.byId(elementName)
        if (scaleElement != null) {

            var zoomscale = scaleElement.value;
            if (isNaN(zoomscale)) {
                scaleElement.value = "";
                return false;
            }
            zoomscale = parseInt(zoomscale);
            doZoomScale(zoomscale)
        }
    } catch (error) {
        alert("there was an error in the zoom to scale function: ");
    }
}

// ########################################################################
// Streets AutoComplete
// ########################################################################
function streetsAutoComplete_Click() {

    if (streetsLayerID == -1) {
        streetsLayerID = findLayerByName(streetsLayerName, "map");
     }

     if (streetsLayerID > -1) {
         var streetname = dijit.byId("ddlStreetNameSearch").attr('displayedValue');
         if (streetname != "") {
             var quickFind = new esri.tasks.FindTask(searchURL);
             var quickFindParams = new esri.tasks.FindParameters();
             quickFindParams.layerIds = [streetsLayerID];
             quickFindParams.searchFields = ["STREET"];
             quickFindParams.returnGeometry = true;
             quickFindParams.searchText = streetname;
             quickFind.execute(quickFindParams, streetsAutoComplete_ClickCompleted);
         }
     } else {
        showConfigurationError("Could not find the Streets Layer: " + streetsLayerName);
     }
     
}

function streetsAutoComplete_ClickCompleted(results) {

    map.graphics.clear();
    // Create symbols for result features
    var symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 255, 255]), 3);

    //Add result feature to map
    dojo.forEach(results, function(findresult) {
        var graphic = findresult.feature;
        graphic.setSymbol(symbol);
        map.graphics.add(graphic);
    });

    // zoom to extent
    var fullExt = esri.graphicsExtent(map.graphics.graphics);
    zoomMap(fullExt);

    clearZooms();

}
var streetStoreIsInitialized = false;
function initStreetsFilteringSelect() {

    if (!streetStoreIsInitialized) {
        dojo.xhrGet({
            url: cravenWebServiceURL + "/StreetNames",
            handleAs: "json",
            contentType: "application/json; charset=utf-8",
            load: function(data, args) {
                var items = [];
                dojo.forEach(data.d, function(d) {
                    var json = { name: d };
                    items.push(json);
                });
                var dataItems = {
                    identifier: 'name',
                    label: 'name',
                    items: items
                };
                var store = new dojo.data.ItemFileReadStore({ data: dataItems });
                dijit.byId('ddlStreetNameSearch').store = store;
                streetStoreIsInitialized = true;

            },
            error: function(error, args) { console.warn("error! darn it to heck", error); }
        });
    }
     
}





//////////////////////
// Buffer parcel code
//////////////////////
function initBufferTool(useParcel) {
    clearAdvancedSearch();
    useSelectedParcel = useParcel;
    dojo.byId("bufferdistance").value = "";
    var helpnode = dojo.byId("buffer-help-text")
    if (useParcel == false) {
        helpnode.innerHTML = "(Note: Radius will start from the center of the map extent)";
        selectedParcelGeometry = null;
    }
    else
        helpnode.innerHTML = "";
}


function addBufferGeometry(bufferFeatures) {

    for (var j = 0, jl = bufferFeatures.length; j < jl; j++) {
        bufferFeatures[j].setSymbol(bufferSymbol);
        bufferGraphics.add(bufferFeatures[j]);
    }
}

