﻿dojo.provide("Indy.PropertyAssessmentViewer.Search");
var navigatorVersion = navigator.appVersion;
var navigatorIE6 = navigatorVersion.indexOf("MSIE 6", 0);
var navigatorIE7 = navigatorVersion.indexOf("MSIE 7", 0);
var navigatorIE8 = navigatorVersion.indexOf("MSIE 8", 0);
Indy.PropertyAssessmentViewer.Search.SearchByAddress = function() {
    var geocode = function(streetNumberElement, streetAddressElement) {
        var instructions = dojo.byId("searchByAddressInstruct");
        instructions.innerHTML = 'Enter the Street Number and Street Name to search. <br /><br />';
        var candidatesElement = dojo.byId("candidatesRow");
        candidatesElement.style.visibility = "hidden";
        var streetNumber = dojo.byId(streetNumberElement).value;
        var streetAddress = dojo.byId(streetAddressElement).value;
        console.log(streetNumber, streetAddress);

        var address = streetNumber + ' ' + streetAddress;
        var zone = '';
        var level = 'Parcels';
        var minCandidateScore = 50;
        var minMatchScore = 65;
        var url = configDataForMap.externalServices.geocodeService;
        //Later, should use JS libraries (it's more reliable)
        var outputProjection = myMap.spatialReference.wkid;
        var parameters = {
            address: address,
            zone: zone,
            level: level,
            outputProjection: outputProjection,
            minimumCandidateScore: minCandidateScore,
            minimumMatchScore: minMatchScore
        }
        //Function that runs when the Web method returns data
        var onComplete = function(data) {
            console.log(data);
            console.log("Address found: " + data.MatchFound);
            if (data.MatchFound == true) {
                console.log("Standardized address:" + data.StandardizedAddress.WholeAddress);
                var resStreetNumber = data.StandardizedAddress.ParsedAddress.StreetNumber;
                var resPrefixDirection = data.StandardizedAddress.ParsedAddress.PrefixDirection;
                var resStreetName = data.StandardizedAddress.ParsedAddress.StreetName;
                var resStreetType = data.StandardizedAddress.ParsedAddress.StreetType;
                var resSuffixDirection = data.StandardizedAddress.ParsedAddress.SuffixDirection;
                Indy.PropertyAssessmentViewer.Search.SearchByAddress.query(resStreetNumber, resPrefixDirection, resStreetName, resStreetType, resSuffixDirection);
            } else if (data.MatchFound == false && data.AddressCandidates.length != 0) {
                Indy.PropertyAssessmentViewer.Search.SearchByAddress.showCandidatesDialog(data.AddressCandidates);
            } else if (data == null) {
                var instructions = dojo.byId("searchByAddressInstruct");
                instructions.innerHTML = 'Geocode Service is not accessable at the moment. Try again later.<br /><br />';
                hideSearchByAddressLoad();
            } else if (data.AddressCandidates.length == 0) {
                var instructions = dojo.byId("searchByAddressInstruct");
                instructions.innerHTML = 'Address you entered does not match addresses in the database. Please, review your entry.<br /><br />';
                hideSearchByAddressLoad();
            }
        }
        //Function that runs in case if call to the Web method is incomplete or there are errors in received data
        var onError = function(error) {
            console.log(error);
            var instructions = dojo.byId("searchByAddressInstruct");
            instructions.innerHTML = 'Error occured during attempt to access the Geocode Web service';
            hideSearchByAddressLoad();
        }
        //        try{
        //            Indy.Services.Geocode.simpleGeocode(address, zone, level, minCandidateScore, minMatchScore, map, listCandidates, onComplete, onError);
        //        }catch(e){
        //            console.log("Indy.Services.Test.Geocode.simpleGeocode-> " + e.type + e.message);
        //        }
        Indy.Services.Utilities.callService(url, parameters, onComplete, onError);
    }

    var showCandidatesDialog = function(addressCandidates) {
        var instructions = dojo.byId("searchByAddressInstruct");
        instructions.innerHTML = 'Exact match was not found. Enter another Street Number and Street Name to search or select from the list of candidates <br /><br />';
        var candidatesOptions = '';
        if (navigatorIE6 != -1 || navigatorIE7 != -1 || navigatorIE8 != -1) {
            candidatesOptions = '<option>trancate this</option><option selected=selected value="Select Candidate">Select Candidate...</option>';
        } else {
            candidatesOptions = '<option selected=selected value="Select Candidate">Select Candidate...</option>';
        }
        var selectCandidateBox = dojo.byId("Select1");
        for (var i = 0; i < addressCandidates.length; i++) {
            var candidateWholeAddress = addressCandidates[i].WholeAddress;
            var resStreetNumber = addressCandidates[i].ParsedAddress.StreetNumber;
            var resPrefixDirection = addressCandidates[i].ParsedAddress.PrefixDirection;
            var resStreetName = addressCandidates[i].ParsedAddress.StreetName;
            var resStreetType = addressCandidates[i].ParsedAddress.StreetType;
            var resSuffixDirection = addressCandidates[i].ParsedAddress.SuffixDirection;
            var addressString = resStreetNumber + "," + resPrefixDirection + "," + resStreetName + "," + resStreetType + "," + resSuffixDirection;
            //candidatesOptions = candidatesOptions + '<option value="' + addressString + '">' + candidateWholeAddress + '</option>';
            candidatesOptions = candidatesOptions + '<option value="' + addressString + '">' + resStreetNumber + ' ' + resPrefixDirection + ' ' + resStreetName + ' ' + resStreetType + ' ' + resSuffixDirection + '</option>';
        }
        selectCandidateBox.innerHTML = candidatesOptions;
        selectCandidateBox.outerHTML = selectCandidateBox.outerHTML;

        var candidatesElement = dojo.byId("candidatesRow");
        candidatesElement.style.visibility = "visible";
        hideSearchByAddressLoad();
    }

    var onChange = function() {
        showSearchByAddressLoad();
        var selectCandidateBox = dojo.byId("Select1");
        var selectedCandidate = selectCandidateBox.value;
        var selectedCandidateArray = selectedCandidate.split(",");
        var streetNumber = selectedCandidateArray[0];
        var prefixDirection = selectedCandidateArray[1];
        var streetName = selectedCandidateArray[2];
        var streetType = selectedCandidateArray[3];
        var suffixDirection = selectedCandidateArray[4];
        Indy.PropertyAssessmentViewer.Search.SearchByAddress.query(streetNumber, prefixDirection, streetName, streetType, suffixDirection);
    }

    var query = function(streetNumber, prefixDirection, streetName, streetType, suffixDirection) {
        /**!!!!!!!!!!!!!For CCGIS.Parcels (hardcoded)!!!!!!!!!!!!!**/
        //In case if some of the fields are empty strings
        var addressArray = [streetNumber, prefixDirection, streetName, streetType, suffixDirection];
        var queryAddressArray = []
        for (var i = 0; i < addressArray.length; i++) {
            if (addressArray[i] == "") {
                queryAddressArray[i] = ' ';
            } else {
                queryAddressArray[i] = addressArray[i];
            }
        }
        //var address1 = "http://tritenko09865/arcgis/rest/services/ParcelsCCGIS/MapServer/0";
        var address1 = configDataForMap.parcels.mapServiceURL + "/" + configDataForMap.parcels.layerId;
        queryTask = new esri.tasks.QueryTask(address1);
        query = new esri.tasks.Query();
        query.returnGeometry = false;
        query.outFields = ['OBJECTID'];
        if (queryAddressArray[1] == ' ' || queryAddressArray[4] == ' ') {
            query.where = "STNUMBER = " + queryAddressArray[0] + " AND " + "STREET_NAME =" + "'" + queryAddressArray[2] + "'" + " AND " + "(PRE_DIR = " + "'" + queryAddressArray[1] + "' OR PRE_DIR IS NULL)" + " AND " + "SUFFIX = " + "'" + queryAddressArray[3] + "'" + " AND " + "(SUF_DIR = " + "'" + queryAddressArray[4] + "' OR SUF_DIR IS NULL)";
        } else if (queryAddressArray[1] == ' ' && queryAddressArray[4] != ' ') {
            query.where = "STNUMBER = " + queryAddressArray[0] + " AND " + "STREET_NAME =" + "'" + queryAddressArray[2] + "'" + " AND " + "(PRE_DIR = " + "'" + queryAddressArray[1] + "' OR PRE_DIR IS NULL)" + " AND " + "SUFFIX = " + "'" + queryAddressArray[3] + "'" + " AND " + "SUF_DIR = " + "'" + queryAddressArray[4] + "'";
        } else if (queryAddressArray[1] != ' ' && queryAddressArray[4] == ' ') {
            query.where = "STNUMBER = " + queryAddressArray[0] + " AND " + "STREET_NAME =" + "'" + queryAddressArray[2] + "'" + " AND " + "PRE_DIR = " + "'" + queryAddressArray[1] + "'" + " AND " + "SUFFIX = " + "'" + queryAddressArray[3] + "'" + " AND " + "(SUF_DIR = " + "'" + queryAddressArray[4] + "' OR SUF_DIR IS NULL)";   
        }
        else {
            query.where = "STNUMBER = " + queryAddressArray[0] + " AND " + "STREET_NAME =" + "'" + queryAddressArray[2] + "'" + " AND " + "PRE_DIR = " + "'" + queryAddressArray[1] + "'" + " AND " + "SUFFIX = " + "'" + queryAddressArray[3] + "'" + " AND " + "SUF_DIR = " + "'" + queryAddressArray[4] + "'";
        }
        queryTask.execute(query, showQueryResults);
        function showQueryResults(results) {
            console.log(results);
            if (results.features.length != 0) {
                var searchText = results.features[0].attributes.OBJECTID;
                console.log(searchText);
                Indy.PropertyAssessmentViewer.Search.SearchByAddress.find(searchText);
            } else {
                var instructions = dojo.byId("searchByAddressInstruct");
                instructions.innerHTML = 'Given address does not exist in the used parcel feature class. Verify the entry parameters. <br/><br/>';
                hideSearchByAddressLoad();
            }
        }
    }

    var find = function(searchText) {
        //var findParamUrl = "http://tritenko09865/arcgis/rest/services/ParcelsCCGIS/MapServer";
        var findParamUrl = configDataForMap.parcels.mapServiceURL;
        findTask = new esri.tasks.FindTask(findParamUrl);
        //create find parameters and define known values
        findParams = new esri.tasks.FindParameters();
        findParams.returnGeometry = true;
        findParams.layerIds = [parseFloat(configDataForMap.parcels.layerId)];
        findParams.searchFields = ['OBJECTID'];
        findParams.searchText = searchText;

        findTask.execute(findParams, showResults);

        function showResults(results) {
            console.log(results);
            myMap.graphics.clear();
            var curFeature = results[0];
            var graphic = curFeature.feature;
            var layerName = curFeature.layerName;
            var layerId = curFeature.layerId;
            var foundFieldName = curFeature.foundFieldName;
            var foundFieldValue = graphic.attributes[foundFieldName];

            switch (graphic.geometry.type) {
                case "point":
                    var symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 10, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 1), new dojo.Color([0, 255, 0, 0.25]));
                    break;
                case "polyline":
                    var symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASH, new dojo.Color([255, 0, 0]), 1);
                    break;
                case "polygon":
                    var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.SOLID, new dojo.Color("black"), 1), new dojo.Color([0, 255, 255, 0.7]));
                    break;
            }
            graphic.setSymbol(symbol);

            if (graphic.geometry.type == "point") {
                var pointX = graphic.geometry.x;
                var pointY = graphic.geometry.y;
                xmin = pointX - 1 / pointX;
                ymin = pointY - 1 / pointY;
                xmax = pointX + 1 / pointX;
                ymax = pointY + 1 / pointY;
                spatialReference = map.spatialReference;
                featureExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, spatialReference);
            } else {
                featureExtent = graphic.geometry.getExtent();
            }
            myMap.graphics.add(graphic);
            myMap.setExtent(featureExtent);
            hideSearchByAddressLoad();
            hideSearchByAddressDialog();
            clearTimeout(resizeTimer);
            resizeTimer = setTimeout(function() {
                myMap.resize();
                myMap.reposition();
            }, 500);
        }
    }

    return {
        geocode: geocode,
        showCandidatesDialog: showCandidatesDialog,
        onChange: onChange,
        query: query,
        find: find
    }
} ();


Indy.PropertyAssessmentViewer.Search.SearchByParcelID = function(){
    var query = function(parcelIDtext){
        showSearchByIDLoad();
        var parcelID = dojo.byId(parcelIDtext).value;
        /**!!!!!!!!!!!!!For CCGIS.Parcels (hardcoded)!!!!!!!!!!!!!**/
        Indy.PropertyAssessmentViewer.Search.SearchByParcelID.queryByParcelID(parcelID);
    }
    
    var queryByParcelID = function(parcelID){
        /**!!!!!!!!!!!!!For CCGIS.Parcels (hardcoded)!!!!!!!!!!!!!**/
        //var address1 = "http://tritenko09865/arcgis/rest/services/ParcelsCCGIS/MapServer/0";
	    var address1 = configDataForMap.parcels.mapServiceURL + "/" + configDataForMap.parcels.layerId;
	    queryTask = new esri.tasks.QueryTask(address1);
	    query = new esri.tasks.Query();
        query.returnGeometry = false;
        query.outFields = ['OBJECTID'];
        query.where = "PARCEL_C = " + "'" + parcelID + "'";
        queryTask.execute(query,showQueryResults);
        function showQueryResults(results){
            console.log(results);
            if (results.features.length != 0){
                var searchText = results.features[0].attributes.OBJECTID;
                console.log(searchText);  
                Indy.PropertyAssessmentViewer.Search.SearchByParcelID.find(searchText);
            }else{
                var instructions = dojo.byId("searchByIDInstruct");
                instructions.innerHTML = 'Given parcel ID does not exist in the used parcel feature class. Please, verify the number. <br/><br/>';
                hideSearchByIDLoad();
            }
        }
    }
    
    var queryByParcelIDAssesDB = function(parcelID){
        /**!!!!!!!!!!!!!For CCGIS.Parcels (hardcoded)!!!!!!!!!!!!!**/
        //hideStartupHelpDialog();
        dojo.byId("PnlLoadingMap").style.visibility = "visible";
        //var address1 = "http://tritenko09865/arcgis/rest/services/ParcelsCCGIS/MapServer/0";
        var address1 = configDataForMap.parcels.mapServiceURL + "/" + configDataForMap.parcels.layerId;
	    queryTask = new esri.tasks.QueryTask(address1);
	    query = new esri.tasks.Query();
        query.returnGeometry = false;
        query.outFields = ['OBJECTID'];
        query.where = "PARCEL_C = " + "'" + parcelID + "'";
        queryTask.execute(query,showQueryResults);
        function showQueryResults(results){
            console.log(results);
            if (results.features.length != 0){
                var searchText = results.features[0].attributes.OBJECTID;
                console.log(searchText);  
                Indy.PropertyAssessmentViewer.Search.SearchByParcelID.find(searchText);
            }else{
                Ext.MessageBox.alert('Incorrect Entry','Parcel with given ID does not exist in the used feature class.',null);
            }
        }
    }
    
    var find = function(searchText){
        //var findParamUrl = "http://tritenko09865/arcgis/rest/services/ParcelsCCGIS/MapServer";
        var findParamUrl = configDataForMap.parcels.mapServiceURL;
        findTask = new esri.tasks.FindTask(findParamUrl);
        //create parameters for find task and define known values
        findParams = new esri.tasks.FindParameters();
        findParams.returnGeometry = true;
        findParams.layerIds = [parseFloat(configDataForMap.parcels.layerId)];
        findParams.searchFields = ['OBJECTID'];
        findParams.searchText = searchText;
        
        findTask.execute(findParams,showResultsSearchByID);
        
        function showResultsSearchByID(results){
            console.log(results);
            myMap.graphics.clear();
            var curFeature = results[0];
            var graphic = curFeature.feature;
            var layerName = curFeature.layerName;
            var layerId = curFeature.layerId;
            var foundFieldName = curFeature.foundFieldName;
            var foundFieldValue = graphic.attributes[foundFieldName];

            switch (graphic.geometry.type) {
            case "point":
                var symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 10, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255,0,0]), 1), new dojo.Color([0,255,0,0.25]));
                break;
            case "polyline":
                var symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASH, new dojo.Color([255,0,0]), 1);
                break;
            case "polygon":
                var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.SOLID, new dojo.Color("black"), 1), new dojo.Color([0,255,255,0.7]));
                break;
            }
            graphic.setSymbol(symbol);
            
            if (graphic.geometry.type == "point"){
                var pointX = graphic.geometry.x;
                var pointY = graphic.geometry.y;
                xmin = pointX - 1/pointX;
                ymin = pointY - 1/pointY;
                xmax = pointX + 1/pointX;
                ymax = pointY + 1/pointY;
                spatialReference = myMap.spatialReference;
                featureExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, spatialReference);
            }else{
                featureExtent = graphic.geometry.getExtent();
            }
            myMap.graphics.add(graphic);
            myMap.setExtent(featureExtent);
            dojo.byId("PnlLoadingMap").style.visibility = "hidden";
            hideSearchByIDLoad();
            hideSearchByIDDialog();
            clearTimeout(resizeTimer);
            resizeTimer = setTimeout(function(){
                myMap.resize();
                myMap.reposition();
            }, 500);
        }
    }
    
    return {
        query:query,
        find:find,
        queryByParcelID:queryByParcelID,
        queryByParcelIDAssesDB:queryByParcelIDAssesDB
    }
}();