// ######################################################################################
// 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 -->
//      showSearch: shows a different search on the main page
//      showSearching: show the searching tag
//      showSearchError: show a search error message
//      createAttachOption: adds a item to a drop down list 
//
//      <-- These function shandle click events from the toolbar
//      searchPanel_onClick:
//    
// #####################################################################################

var quickFind, quickFindParams;
var returnToPanel = "about";
var txtWhereClause = "";
var locator;
var locatorTask = null;

function initSearch() {


    try {
        //dojo.connect(dojo.byId("txtFind"), "onkeydown", find_onKeyDown);
        //dojo.connect(dojo.byId("btnFind"), "onmousedown", function(evt) { doSearchFind() });

        dijit.byId("showOwner").setValue = true;
        showSearch();

        //    // auto suggest box
        //    var options = {
        //        script: "./AutoComplete.ashx?",
        //        varname: "name",
        //        json: true,
        //        maxresults: 35
        //    };
        //    var as = new bsn.AutoSuggest('txtFind', options);


//        // Advanced Query
//        var advParams = {
//            map: map,
//            fields: fields,
//            outFields: parcels_return_fields,
//            url: parcelSearchLayerURL
//        };
//        
//        var adv = new dijits.custom.AdvancedSearch(advParams, "AdvancedQueryDijit");
//        adv.startup();

//        var locator = new dijits.custom.Locator({ map: map, url: locatorURL }, "LocatorDijit");
//        locator.startup();

        // set up the locator
        dojo.connect(dijit.byId("locator_Search"),"onClick", doLocate);
        dojo.connect(dijit.byId("locator_Clear"), "onClick", doLocateClear);
        locatorTask = new esri.tasks.Locator(locatorURL);

        dojo.forEach(zoomPlaceTasks, function(params) {
            var z = new dijits.tools.ZoomToBtn(params, params.attachTo);
            z.init(map);
            z.startup();
        });


        initAdvancedSearch();

        showSearchPanel("about");


    } catch (Error) {
        console.warn("An Error occurred in initializing searches", Error);  
    }

}

function showSearch() {

    var contextHelp = dojo.byId("searchContextHelp");

    if (dijit.byId("showAcct").getValue()) {
        store.url = "./autocomplete.ashx?ty=acct";
        contextHelp.innerHTML = "Enter Account Number: ex: 50925"; 
    } else if (dijit.byId("showPID").getValue()) {
        store.url = "./autocomplete.ashx?ty=pid";
        contextHelp.innerHTML = "Enter Parcel ID: ex: 14 10  1  1 or XX XX XX XX";
    } else if (dijit.byId("showNCPIN").getValue()) {
       store.url = "./autocomplete.ashx?ty=ncpin";
       contextHelp.innerHTML = "Enter Parcel ID: ex: 2874274677";
    } else if (dijit.byId("showAddress").getValue()) {    
        store.url = "./autocomplete.ashx?ty=address";
        contextHelp.innerHTML = "Enter Property Address: ex: 905 WEST AVE";
    } else {
        store.url = "./autocomplete.ashx?ty=owner";
        contextHelp.innerHTML = "Enter Owner Name (Last First)";
    }

    dijit.byId("txtFind").reset();

    
    
}

//function showSearch(name) {

//    dojo.style('about', { 'display': 'block' });
//    dojo.style('search-owner', { 'display': 'none' });
//    dojo.style('search-find', { 'display': 'none' });
//    dojo.style('search-accountnum', { 'display': 'none' });
//    dojo.style('search-deed', { 'display': 'none' });

//    dojo.style(name, { 'display': 'block' });

//}

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 Wait</p></div>";
    dojo.byId("info").innerHTML = content;
    showSearchPanel("info");
}

function showSearchError(error) {
    console.debug(error);
    var yy = [];
    var returnToCmd = "showPanel('" + returnToPanel + "')";
    yy.push("<p><a href=\"#\" onmousedown=\"" + returnToCmd + "\">Search Again?</a></p>");
    yy.push("<p>Sorry, but there was an error in the query string</p>");

    yy.push("<div style=\"margin7px\">");

    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("");
    showSearchPanel("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;
}

// #################################################################################
//  Searches on the Main Search Panel
// #################################################################################
function doSearchFind() {

    try {

        var value = dojo.byId("txtFind").value
        if (value == "") {
            alert("you must enter a value in the textbox");
            return false;
        }

        returnToPanel = "about";
        var sWhere = "";
        if (dijit.byId("showAcct").getValue()) {
            sWhere = fields.acctnumber + " like '" + value + "%'";
        } else if (dijit.byId("showPID").getValue()) {
            sWhere = fields.pid + " like '" + value + "%'";
        } else if (dijit.byId("showNCPIN").getValue()) {
            sWhere = fields.ncpin + " like '" + value + "%'";
        } else if (dijit.byId("showAddress").getValue()) {
        
          
          if (dojo.isIE) {
          
            var val = value.toString();
            var index1 = val.indexOf('[', 0);
            var index2 = val.indexOf(']', 0);
            if (index1 > -1 && index2 > -1) {
              sWhere = fields.ncpin + " = '" + value.substring(index1 + 1, index2) + "'";            
            } else {
              sWhere = fields.address + " like '" + value + "%'";
            }  
          
          } else {
            var index1 = dojo.indexOf(value, '[');
            var index2 = dojo.indexOf(value, ']');
            if (index1 > -1 && index2 > -1) {
              sWhere = fields.ncpin + " = '" + value.substring(index1 + 1, index2) + "'";            
            } else {
              sWhere = fields.address + " like '" + value + "%'";
            }    
          
          }
          
          


        
                               
        } else {
            sWhere = fields.owner + " like '" + value + "%'";
        }
        ExecuteParcelSearch(sWhere);
        
        dijit.byId("txtFind").reset();

    } catch (Error) {
        showError("An error occurred in the search:", Error);
    }

}




function ExecuteParcelSearch(whereClause) {
    try {
        txtWhereClause = whereClause;

        // 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);
        showSearching();
    } 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 doSearchByDistance(pid) {

    parcelGraphics.hide();
    bulletGraphics.hide();
    allSelectionGraphics.hide();
    adjoinerGraphics.clear();
    map.infoWindow.hide();

    var queryTask = new esri.tasks.QueryTask(parcelSearchLayerURL);
    var query = new esri.tasks.Query();
    query.where = fields.pid + " = '" + pid + "'";
    query.outFields = parcels_return_fields;
    query.returnGeometry = true;

    //Execute task and call showResults on completion
    queryTask.execute(query, function(results) {
        var graphic = results.features[0];
        var pt = graphic.geometry.getExtent().getCenter();

        // ready the advanced panel...
        dojo.byId("as_Dist").style.display = "block";
        dojo.byId("as_Extent").style.display = "none";
        clearAdvancedSearch();
        dojo.byId("as_x").value = pt.x;
        dojo.byId("as_y").value = pt.y;
        showPanel('advanced');

    }, function(error) { console.debug(error); });

}


function initAdvancedSearch() {

    dojo.connect(dijit.byId("as_Clear"), "onClick", "clearAdvancedSearch");
    dojo.connect(dijit.byId("as_Search"), "onClick", "executeAdvancedSearch");

    clearAdvancedSearch();

}

function clearAdvancedSearch() {

    try {
        dojo.byId("as_minacreage").value = "";
        dojo.byId("as_maxacreage").value = "";
        dojo.byId("as_minvalue").value = "";
        dojo.byId("as_maxvalue").value = "";

        dojo.byId("as_ncpin").value = "";
        dojo.byId("as_ownername").value = "";
        dojo.byId("as_pid").value = "";
        dojo.byId("as_mailaddr").value = "";
        dojo.byId("as_mailcity").value = "";

        var ddl = dojo.byId("as_ddldistance");
        ddl.innerHTML = "";
        createAttachOption(ddl, "", "No Preference");
        createAttachOption(ddl, "9999", "Inside Map Extent");
        createAttachOption(ddl, "99999", "Touches Map Extent");
        ddl.value = "";
        
        dojo.byId("as_searchDistance").value = "";

    } catch (Error) {
        showError("clearAdvancedSearch", Error);
    }

}

function showDefaultAdvancedSearchPanels() {

    dojo.byId("as_Dist").style.display = "none";
    dojo.byId("as_Extent").style.display = "block";
    dojo.byId("as_x").value = -1;
    dojo.byId("as_y").value = -1;
}


function executeAdvancedSearch() {

    var queryTask = new esri.tasks.QueryTask(parcelSearchLayerURL);
    var query = new esri.tasks.Query();

    returnToPanel = "advanced";

    var minacreage = dojo.byId("as_minacreage").value;
    var maxacreage = dojo.byId("as_maxacreage").value;
    var minvalue = dojo.byId("as_minvalue").value;
    var maxvalue = dojo.byId("as_maxvalue").value;
    var ncpin = dojo.byId("as_ncpin").value;
    var ownername = dojo.byId("as_ownername").value;
    var pid = dojo.byId("as_pid").value;
    var mailaddr = dojo.byId("as_mailaddr").value;
    var mailcity = dojo.byId("as_mailcity").value;
    var x = dojo.byId("as_x").value;
    var y = dojo.byId("as_y").value;
    var d = dojo.byId("as_searchDistance").value;
    var unit = dojo.byId("as_searchunit").value;
    var ddlval = dojo.byId("as_ddldistance").value;
    
    var searchcode = "";
    
    if (ddlval != "")
        searchcode = ddlval;
        
    // check for buffer parameters
    if ((x !="") && (y !="") && (d != "")) 
        searchcode = "buffer";

    // create where clause
    var sWhere = [];

    // acreage
    if (minacreage != "")
        sWhere.push("(" + fields.acreage + ">=" + minacreage + ")");

    if (maxacreage != "")
        sWhere.push("(" + fields.acreage + "<=" + maxacreage + ")");

    if (minvalue != "")
        sWhere.push("(" + fields.taxvalue + ">=" + minvalue + ")");

    if (maxvalue != "")
        sWhere.push("(" + fields.taxvalue + "<=" + maxvalue + ")");

    if (pid != "")
        sWhere.push("(" + fields.pid + " like '" + pid + "%')");

    if (ncpin != "")
        sWhere.push("(" + fields.ncpin + " like '" + ncpin + "%')");

    if (ownername != "")
        sWhere.push("(" + fields.owner + " like '" + ownername + "%')");

    if (mailaddr != "")
        sWhere.push("(" + fields.mailingaddress + " like '" + mailaddr + "%')");

    if (mailcity != "")
        sWhere.push("(" + fields.mailcity + " like '" + mailcity + "%')");


    // Set up query tasks

    query = new esri.tasks.Query();
    txtWhereClause = sWhere.join(" AND ");
    query.where = txtWhereClause;
    query.outFields = parcels_return_fields;
    query.returnGeometry = true;
    dijit.byId("advancedDialog").hide();

    switch (searchcode) {
        case "9999":
            query.geometry = map.extent;
            query.spatialRelationship = esri.tasks.Query.SPATIAL_REL_CONTAINS;
            showSearching();
            queryTask.execute(query, showParcelSearchResults, showSearchError);
            break;
        case "99999":
            query.geometry = map.extent;
            query.spatialRelationship = esri.tasks.Query.SPATIAL_REL_INTERSECTS;
            showSearching();
            queryTask.execute(query, showParcelSearchResults, showSearchError);
            break;
        case "buffer":
                var miles = d;
                if (unit =="miles")
                    miles = d * 5280;    
        
                var pt = new esri.geometry.Point(x, y, map.spatialReference);
                var ptGraphic = new esri.Graphic(pt);
                var params = new esri.tasks.BufferParameters();
                params.distances = [miles];
                params.bufferSpatialReference = new esri.SpatialReference({ wkid: 2264 });
                params.outSpatialReference = map.spatialReference;
                params.unit = eval("esri.tasks.BufferParameters.UNIT_FOOT");
                params.features = [ptGraphic];
                gsvc = new esri.tasks.GeometryService("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");

                gsvc.buffer(params, function(features) {
                    console.debug(query);
                    query.geometry = features[0].geometry;
                    queryTask.execute(query, showParcelSearchResults, showSearchError);
                    showSearching();
                    zoomMap(features[0].geometry.getExtent().expand(1.3));
                    bufferGraphics = features;
                }, showSearchError);

                break;
        
        case "":
                showSearching();
                queryTask.execute(query, showParcelSearchResults, showSearchError);
                break;
            

                
                
            }


}


function doLocate() {

    dojo.byId("locator_info").innerHTML = "<div><img src=\"Images/callbackActivityIndicator.gif\" alt=\"busy\"/>Searching for address...</div>";

    // some things about the main app...
    clearCurrentTool();
    changeMapCursors();
    map.graphics.clear();

    var address = dojo.byId("locator_address").value;
    var address = {
        address: address
    };

    var showLocatorError = function(err) {
        dojo.byId("locartor_info").innerHTML = "There was an error in the search:" + err.Message;
    }

    locatorTask.addressToLocations(address, ["Loc_name", "Match_addr", "Score"], showLocatorResults, showLocatorError);


}


function doLocateClear() {
    map.graphics.clear();
    dojo.byId("locator_info").innerHTML = "";
    dojo.byId("locator_address").value = "";

    dojo.byId("locator_grid").innerHTML = ""
    dojo.byId("locator_results").style.display = "none";

}

function showLocatorResults(candidates) {
        dojo.byId("locator_info").innerHTML = "";

        var candidate;
        var infoTemplate = new esri.InfoTemplate("Location", "Address: ${address}<br />Score: ${score}<br />Source locator: ${locatorName}");
        var font = new esri.symbol.Font();


        var locatedPoints = [];
        
        var grid = dojo.byId("locator_grid");
        
        var points = new esri.geometry.Multipoint(this.map.spatialReference);
        dojo.forEach(candidates, function(candidate, indx) {
            if (candidate.score > 70) {

                // add the point to the map;                
                var marker = "images/markers/marker" + (locatedPoints.length + 1) + ".png";
                var symbol = new esri.symbol.PictureMarkerSymbol(marker, 20, 34);
                var attributes = { address: candidate.address, score: candidate.score, locatorName: candidate.attributes.Loc_name };
                var graphic = new esri.Graphic(candidate.location, symbol, attributes, infoTemplate);
                locatedPoints.push(graphic);
                map.graphics.add(graphic);
                map.graphics.add(new esri.Graphic(candidate.location, new esri.symbol.TextSymbol(attributes.address, font, new dojo.Color([255, 0, 0])).setOffset(15, 15)));
                points.addPoint(candidate.location);

                var html = [];
                html.push("<table><tbody><tr><td><img src=\"" + marker + "\" alt=\"" + (indx + 1) + "\"/></td>");
                html.push("<td><label><strong>" + candidate.address + "</strong> (" + candidate.score + ") <br/>" + candidate.attributes.Loc_name + "</label></td>");
                html.push("</tr></tbody></table>");

                var rDiv = document.createElement("div");
                rDiv.className = "locator-result";
                rDiv.innerHTML = html.join("");
                grid.appendChild(rDiv);
            }
        });

        switch (locatedPoints.length) {
            case 0:
                dojo.byId("locator_info").innerHTML = "No Results Found!";
                break;
            case 1:
                var pt = locatedPoints[0].geometry;
                zoomToPoint(pt, 1000);
                break;
            default:          
                dojo.byId("locator_results").style.display = "block";

                zoomToAllGraphics();
                break;
        }
}



