Source: widget/ToolWidget.js

/**
 * Geoprocessing tools widget for the map.
 * Identifies flooded roads and buildings. Also, enables depth maps.
 * @module app/widget/ToolWidget
 * @requires module:app/widget/MapWidget
 * @author JS
 * @copyright Nova Scotia Community College 2017
 */
define([
        "dojo/_base/declare",
        "dojo/_base/lang",
        "dojo/on",
        "dojo/dom",
        "dojo/topic",
        "dijit/_WidgetBase",
        "dijit/_OnDijitClickMixin",
        "dijit/registry",
        "dijit/form/CheckBox",
        "dijit/form/Button",
        "esri/domUtils",

       "esri/tasks/query",
       "esri/tasks/QueryTask",
       "esri/geometry/geometryEngine",
       "esri/symbols/SimpleMarkerSymbol",
       "esri/symbols/SimpleLineSymbol",
       "esri/symbols/SimpleFillSymbol",
       "esri/Color",
       "esri/graphic",
       "esri/tasks/Geoprocessor",
       "esri/layers/ImageParameters",
       "esri/layers/FeatureLayer",
       "esri/renderers/SimpleRenderer",
       "esri/config",
       "esri/layers/ArcGISImageServiceLayer",
        "esri/InfoTemplate",
        "esri/tasks/IdentifyTask",
        "esri/tasks/IdentifyParameters",
        "dijit/form/Select"
],
    function (
        declare,
        lang,
        on,
        dom,
        topic,
        _WidgetBase,
        _OnDijitClickMixin,
        registry,
        CheckBox,
        Button,
        domUtils,

        Query,
        QueryTask,
        geometryEngine,
        SimpleMarkerSymbol,
        SimpleLineSymbol,
        SimpleFillSymbol,
        Color,
        Graphic,
        Geoprocessor,
        ImageParameters,
        FeatureLayer,
        SimpleRenderer,
        esriConfig,
        ArcGISImageServiceLayer,
        InfoTemplate,
        IdentifyTask,
        IdentifyParameters,
        Select
    ) {

        return declare([_WidgetBase, _OnDijitClickMixin], {
            baseClass: "Geoprocessing",
            title: null,

            options: {
                map: null,
                pane: null
            },
            /** @constructor
             * @param {object} args Object of properties to mixin
             * @param {object} srcRefNode Dom node for the widget to attach to
             **/
            constructor: function (param, srcRefNode) {
                /** mix in settings and defaults
                 * @mixin args
                 */
                declare.safeMixin(this.options, param);
                /** Dom widget node */
                this.domNode = srcRefNode;
                // store localized strings
                this.title = this.options.title || "Tools";
                this.set("map", this.options.map);
                this.set("pane", this.options.pane);
            },
            /**
             * Sets title and html content of the base class content pane.
             * Occurs after the constructor has run and dom elements have been created.
             *
             **/
            postCreate: function () {
                if (this.pane) {
                    this.pane.set("title", this.title);
                    this.pane.set("content",
                        "<div id='waterDepth'><table style= 'font-weight: bold; font-family: sans-serif'><tr><td><input type='checkbox' id='queryDepth' type='checkbox'></td> <td><label  for ='queryDepth'> Display Water Depth</label ></td><td id = 'target' ></td> </tr></table><p class='desc' id='depthDesc'></p><img id = 'depthlegend'></div><hr class='nice'><table><tr><td>Critical Facilities</td><td><button id='btnBuildings' type='button'></button></td></tr><tr><td>Roads</td><td><button id='btnRoads' type='button'></button></td></tr><tr><td>Critical Facilities and Roads</td><td><button id='btnBoth' type='button'></button></td></tr><tr><td colspan='2'><div style='text-align:center'><button id='clear' type='button'></button><div></td></tr></table><table><tr><td><img id = 'roadsimg'></td><td id ='roads'></td><td id ='roadsval'></td></tr><tr><td><img  id = 'Ambulance Depotimg'></td><td id ='Ambulance Depot'></td><td id='Ambulance Depotval'</td></tr><tr><td><img  id = 'Continuing Careimg'></td><td id ='Continuing Care'></td><td id='Continuing Careval'</td></tr><tr><td><img  id = 'Fire Stationimg'></td><td id ='Fire Station'></td><td id='Fire Stationval'</td></tr><tr><td><img  id = 'Hospitalimg'></td><td id ='Hospital'></td><td id='Hospitalval'</td></tr><tr><td><img  id = 'Police Stationimg'></td><td id ='Police Station'></td><td id='Police Stationval'</td></tr></table>")
                }
            },
            /**
             * Starts the widget after it has been constructed.
             * Checks to make sure the required map is loaded.
             * @public
             *
             **/
            startup: function () {
                // map not defined
                if (!this.map) {
                    this.destroy();
                    //console.log("CoordWidget::map required");
                }
                // when map is loaded
                if (this.map.loaded) {
                    this._init();
                } else {
                    on(this.map, "load", lang.hitch(this, function () {
                        this._init();
                    }));

                }
            },
            /**
             * Destroys widget
             * @public
             *
             **/
            destroy: function () {
                this.inherited(arguments);
            },
            /**
             * The main logic for the widget
             * @private
             *
             **/
            _init: function () {
                esriConfig.defaults.io.timeout = 120000
                buildingURL = "//agrgims.cogs.nscc.ca/arcgis/rest/services/mcfm/Maritime_EMO/MapServer/0"
                depthURL = "//agrgims.cogs.nscc.ca/arcgis/rest/services/mcfm/DepthMapsMosaic/ImageServer"
                StudyAreas = "//agrgims.cogs.nscc.ca/arcgis/rest/services/mcfm_pro/sa_flood/MapServer/"
                GPURL = "//agrgims.cogs.nscc.ca/arcgis/rest/services/RoadsGeoprocessing/RoadsServerSide/GPServer/RoadsServerSide"
                RoadsResultURL = "//agrgims.cogs.nscc.ca/arcgis/rest/services/RoadsGeoprocessing/RoadsServerSide/MapServer/jobs/"
                localmap = this.map
                topic.subscribe("floodUpdate/slider", function () {
                    buildingtypes = ['Ambulance Depot', 'Continuing Care', 'Fire Station', 'Hospital', 'Police Station']
                        //console.log(buildingtypes[i])
                        //document.getElementById(buildingtypes[i]).innerHTML = 'hew'
                    for (var i = 0; i < buildingtypes.length; i++) {
                        buildingtypes[i]
                            //console.log(buildingtypes[i])
                        document.getElementById(buildingtypes[i] + 'img').src = ''
                        document.getElementById(buildingtypes[i]).innerHTML = ''
                        document.getElementById(buildingtypes[i] + 'val').innerHTML = ''
                    }
                    document.getElementById("roads").innerHTML = ''
                    document.getElementById("roadsval").innerHTML = ''
                    document.getElementById("roadsimg").src = ''
                    localmap.graphics.clear()
                    if (typeof roadsFeatureLayer !== 'undefined') {
                        localmap.removeLayer(roadsFeatureLayer)
                    }
                })
                var layerAlpha = new Select({
                    className: "selLayer",
                    name: "selectdepth",

                    //                        style: {
                    //                            width: "70px"
                    //                        },
                    options: [{
                        selected: "selected",
                        label: "100%",
                        value: "1"
                    }, {
                        label: "90%",
                        value: ".9"
                    }, {
                        label: "80%",
                        value: ".8"
                    }, {
                        label: "70%",
                        value: ".7"
                    }, {
                        label: "60%",
                        value: ".6"
                    }, {
                        label: "50%",
                        value: ".5"
                    }, {
                        label: "40%",
                        value: ".4"
                    }, {
                        label: "30%",
                        value: ".3"
                    }, {
                        label: "20%",
                        value: ".2"
                    }, {
                        label: "10%",
                        value: ".1"
                    }, {
                        label: "0%",
                        value: "0"
                    }]
                }, "target");
                //try {
                //    layerAlpha.set("value", depthlayer.opacity);
                //} catch (error) {
                //    console.error(error);
                //    console.error("unable to set transparency to " + depthlayer.opacity + " of " + depthlayer.id);
                //    layerAlpha.set("value", "1");
                //}
                //                console.log(layerAlpha)
                layerAlpha.on("change", lang.hitch(this, function (value) {
                    if (typeof depthlayer !== 'undefined') {
                        depthlayer.setOpacity(layerAlpha.value);
                        //console.log(document.getElementById("target"))
                    }
                }));

                depthlayer = new ArcGISImageServiceLayer(depthURL, {
                    //opacity: document.getElementsByName("depthopacity")[0].value
                })

                function showDepth() {
                    document.getElementById('depthlegend').src = 'app/resources/legends/DepthLegend.png'
                    document.getElementById('depthDesc').innerHTML = 'Click on map to query flood depth.'

                    var refresh = false
                    depthlayer.setDefinitionExpression(layerDefinitions, refresh)


                    depthlayer.setOpacity(layerAlpha.value)

                    var info = new InfoTemplate()
                    info.setTitle("Depth (m)")

                    info.setContent(getTextContent)

                    function getTextContent(Raster) {

                        var depth = Raster.attributes["Raster.ItemPixelValue"]["0"]
                        if (depth != "NoData") {
                            return (depth / 100).toFixed(1)
                        } else {
                            return ("No Data")
                        }
                    }

                    depthlayer.setInfoTemplate(info)
                    console.log(info)
                        //localmap.infoWindow.resize(100)
                        //depthlayer.setOpacity(0.0)
                    localmap.addLayer(depthlayer, 3)
                    localmap.infoWindow.resize(200, 50)
                }
                //function clicking(evt) {
                //    console.log(evt.mapPoint)
                //}
                localmap.on("click", function (evt) {
                    console.log(evt.mapPoint)
                })
                var queryDepth = new CheckBox({
                    name: "queryDepth",
                    checked: false,
                    onChange: function (c) {
                        if (c) {
                            registry.byId("checkBoxfloodlayer").set('checked', false);
                            console.log(c)
                            layerDefinitions = "level_cm =" + registry.byId('twlSlider').value;

                            showDepth()
                            test = topic.subscribe("floodUpdate/slider", function (val) {
                                if (c) {
                                    localmap.infoWindow.hide()

                                    layerDefinitions = "level_cm =" + val

                                    showDepth()
                                }
                            })

                        } else {
                            document.getElementById('depthlegend').src = ''
                            document.getElementById('depthDesc').innerHTML = ''
                            if (test) {
                                test.remove()
                            }
                            //localmap.setMapCursor("default");
                            localmap.infoWindow.hide()
                            console.log("not B")
                            depthlayer.setInfoTemplate(null)
                            console.log(depthlayer)
                            if (depthlayer) {
                                localmap.removeLayer(depthlayer)
                            }
                        }
                    }
                }, "queryDepth").startup();

                var clearBtn = new Button({
                    label: "Clear Results",
                    onClick: lang.hitch(this, function () {
                        buildingtypes = ['Ambulance Depot', 'Continuing Care', 'Fire Station', 'Hospital', 'Police Station']
                            //console.log(buildingtypes[i])
                            //document.getElementById(buildingtypes[i]).innerHTML = 'hew'
                        for (var i = 0; i < buildingtypes.length; i++) {
                            buildingtypes[i]
                            console.log(buildingtypes[i])
                            document.getElementById(buildingtypes[i] + 'img').src = ''
                            document.getElementById(buildingtypes[i]).innerHTML = ''
                            document.getElementById(buildingtypes[i] + 'val').innerHTML = ''
                        }
                        document.getElementById("roads").innerHTML = ''
                        document.getElementById("roadsval").innerHTML = ''
                        document.getElementById("roadsimg").src = ''
                        this.map.graphics.clear()
                        if (typeof roadsFeatureLayer !== 'undefined') {
                            this.map.removeLayer(roadsFeatureLayer)
                        }
                    })
                }, "clear").startup()

                function floodGeometry() {
                    vURL = StudyAreas + registry.byId('fsbLCA')._lastValueReported

                    //console.log(vURL)
                    //graphicmap = this.map

                    queryflood = new QueryTask(vURL);
                    query = new Query();
                    query.returnGeometry = true;
                    query.outFields = ["level_cm"];
                    levelcm = "level_cm =" + registry.byId('twlSlider').value;
                    query.where = levelcm
                }
                var btnBuildings = new Button({
                    label: "Go",
                    onClick: lang.hitch(this, function () {
                        registry.byId('btnBoth').set('disabled', true)
                        registry.byId('btnRoads').set('disabled', true)
                        registry.byId("twlSlider").disabled = true
                        registry.byId("btnMinus").disabled = true
                        registry.byId("btnPlus").disabled = true

                        if (localmap.graphics) {
                            localmap.graphics.clear();
                        }
                        registry.byId('btnBuildings').set('disabled', true)
                        buildingtypes = ['Ambulance Depot', 'Continuing Care', 'Fire Station', 'Hospital', 'Police Station']
                            //console.log(buildingtypes[i])
                            //document.getElementById(buildingtypes[i]).innerHTML = 'hew'
                        for (var i = 0; i < buildingtypes.length; i++) {
                            buildingtypes[i]
                                //console.log(buildingtypes[i])
                            document.getElementById(buildingtypes[i] + 'img').src = ''
                            document.getElementById(buildingtypes[i]).innerHTML = ''
                            document.getElementById(buildingtypes[i] + 'val').innerHTML = ''
                        }
                        floodGeometry()
                        console.log(query)
                        queryflood.execute(query, function (featureSet) {
                            var resultFeatures = featureSet.features[0];
                            floodgeometry = resultFeatures.geometry;

                            //console.log(buildingtypes)

                            for (var i = 0; i < buildingtypes.length; i++) {
                                //console.log("start")
                                var querybuilding = new QueryTask(buildingURL);
                                var query = new Query();
                                query.outFields = ["build_type"]
                                query.returnGeometry = true;
                                where = "build_type = '" + buildingtypes[i] + "'"
                                buildingLocal = buildingtypes[i]

                                query.where = where
                                    //console.log("whered")
                                    //query.outFields = ["objectid"]
                                querybuilding.execute(query, function (results) {
                                    //console.log("queried")
                                    buildinggeometry = []
                                        //console.log(results)

                                    for (var g = 0, gl = results.features.length; g < gl; g++) {
                                        var buildings = results.features[g];
                                        buildinggeometry.push(buildings.geometry)
                                    }

                                    var intersect = geometryEngine.intersect(buildinggeometry, floodgeometry)
                                        //console.log(intersect)
                                    countnotnull = 0, j = intersect.length;

                                    while (j--) {
                                        if (intersect[j] != null)
                                            countnotnull++;
                                    }
                                    //console.log(countnotnull)
                                    console.log(results)
                                    document.getElementById(results.features[0].attributes.build_type + 'img').src = 'app/resources/' + results.features[0].attributes.build_type.replace(/ /g, '') + '.png'
                                    document.getElementById(results.features[0].attributes.build_type).innerHTML = results.features[0].attributes.build_type + ': '
                                    document.getElementById(results.features[0].attributes.build_type + 'val').innerHTML = countnotnull
                                    floodbuilding = []
                                        //console.log(intersect)
                                    for (var k = 0, kl = intersect.length; k < kl; k++) {
                                        if (intersect[k] !== null) {
                                            floodbuilding.push(intersect[k])
                                        }
                                    }
                                    //console.log("pushed")
                                    var simpleMarkerSymbol = new SimpleMarkerSymbol(
                                        SimpleMarkerSymbol.STYLE_CIRCLE,
                                        25,
                                        new SimpleLineSymbol(
                                            SimpleLineSymbol.STYLE_SOLID,
                                            new Color([255, 0, 0, 0.9]),
                                            3
                                        ),
                                        new Color([0, 0, 0, 0])
                                    )

                                    //var graphic = new Graphic()
                                    markers = [];
                                    //build = buildingtypes[i]
                                    //console.log(build)
                                    for (var h = 0, hl = floodbuilding.length; h < hl; h++) {
                                        markers[h] = new Graphic()
                                        markers[h].setGeometry(floodbuilding[h])
                                        markers[h].setSymbol(simpleMarkerSymbol)
                                        localmap.graphics.add(markers[h])
                                            //console.log(markers.length + buildingtypes[i])
                                    }
                                    registry.byId('btnBuildings').set('disabled', false)
                                    registry.byId('btnBoth').set('disabled', false)
                                    registry.byId('btnRoads').set('disabled', false)
                                    registry.byId("twlSlider").disabled = false
                                    registry.byId("btnMinus").disabled = false
                                    registry.byId("btnPlus").disabled = false
                                })

                            }
                        }, function (buildingError) {
                            registry.byId('btnBuildings').set('disabled', false)
                            registry.byId('btnBoth').set('disabled', false)
                            registry.byId('btnRoads').set('disabled', false)
                            registry.byId("twlSlider").disabled = false
                            registry.byId("btnMinus").disabled = false
                            registry.byId("btnPlus").disabled = false
                            document.getElementById("Ambulance Depot").innerHTML = "No flood layer there. Increase level."

                        })
                    })
                }, "btnBuildings").startup()

                var btnRoads = new Button({
                    label: "Go",
                    onClick: lang.hitch(this, function () {
                            if (typeof roadsFeatureLayer !== 'undefined') {
                                localmap.removeLayer(roadsFeatureLayer)
                            }
                            registry.byId('btnRoads').set('disabled', true)
                            registry.byId('btnBuildings').set('disabled', true)
                            registry.byId('btnBoth').set('disabled', true)
                            registry.byId("twlSlider").disabled = true
                            registry.byId("btnMinus").disabled = true
                            registry.byId("btnPlus").disabled = true

                            document.getElementById("roads").innerHTML = ''
                            document.getElementById("roadsimg").src = ''
                            document.getElementById("roadsval").innerHTML = ''

                            //floodGeometry()
                            levelcm = "level_cm =" + registry.byId('twlSlider').value;

                            var params = {
                                "LCA": registry.byId('fsbLCA').get('item').said,
                                "FloodLevel": registry.byId('twlSlider').value
                            }
                            var gp = new Geoprocessor(GPURL)
                                //console.log(params)
                            gp.setOutSpatialReference({
                                "wkid": 3857
                            });
                            gp.submitJob(params, displayTrack, jobstatus, joberror);

                            function displayTrack(jobinfo) {

                                //console.log(jobinfo)
                                var roadsLayer = RoadsResultURL + jobinfo.jobId + "/0"
                                    //console.log(roadsLayer)
                                roadsFeatureLayer = new FeatureLayer(roadsLayer)
                                    //console.log(roadsFeatureLayer)
                                var simpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                                    new Color([255, 100, 0]), 2)
                                var renderer = new SimpleRenderer(simpleLineSymbol)
                                roadsFeatureLayer.setRenderer(renderer)
                                    //console.log(roadsFeatureLayer)
                                    //graphicmap.removeLayer(roadsFeatureLayer)
                                localmap.addLayer(roadsFeatureLayer)
                                    //console.log(roadsjson)
                                gp.getResultData(jobinfo.jobId, "RoadsLength", function (displayResult) {
                                    //console.log(displayResult.value)
                                    document.getElementById("roadsimg").src = 'app/resources/Roads.png'
                                    document.getElementById("roads").innerHTML = "Flooded Roads: "
                                    document.getElementById("roadsval").innerHTML = (displayResult.value / 1000).toFixed(2) + " km"
                                })

                                registry.byId('btnRoads').set('disabled', false)
                                registry.byId('btnBuildings').set('disabled', false)
                                registry.byId('btnBoth').set('disabled', false)
                                registry.byId("twlSlider").disabled = false
                                registry.byId("btnMinus").disabled = false
                                registry.byId("btnPlus").disabled = false
                                    //registry.byId('btnRoads').set('label', 'Roads')
                            }

                            function jobstatus(jobinfo) {
                                //console.log(jobinfo)
                                //console.log(jobinfo.jobStatus)
                                //domUtils.show(registry.byId('buildings'));
                                var jobstatus = '';
                                switch (jobinfo.jobStatus) {
                                    case 'esriJobSubmitted':
                                        //registry.byId('btnRoads').set('label', 'Submitted...')
                                        document.getElementById("roads").innerHTML = 'Submitted...';
                                        //console.log(jobinfo.jobStatus)
                                        break;
                                    case 'esriJobExecuting':
                                        //registry.byId('btnRoads').set('label', 'Executing...')
                                        document.getElementById("roads").innerHTML = 'Executing...';
                                        //console.log(jobinfo.jobStatus)
                                        break;
                                    case 'esriJobSucceeded':
                                        //domUtils.hide(registry.byId('buildings'));
                                        //console.log(jobinfo.jobStatus)
                                        break;
                                }
                                // registry.byId('status').innerHTML = jobstatus;

                            }

                            function joberror(jobinfo) {
                                registry.byId('btnRoads').set('disabled', false)
                                registry.byId('btnBuildings').set('disabled', false)
                                registry.byId('btnBoth').set('disabled', false)
                                registry.byId("twlSlider").disabled = false
                                registry.byId("btnMinus").disabled = false
                                registry.byId("btnPlus").disabled = false
                                    //registry.byId('btnRoads').set('label', 'Flooded Infrastructure')
                                document.getElementById("roads").innerHTML = "Failed. Try again"
                            }
                            //}
                            //else {
                            //    registry.byId('btnRoads').set('disabled', false)
                            //    registry.byId('btnBuildings').set('disabled', false)
                            //    registry.byId('btnBoth').set('disabled', false)
                            //    registry.byId("twlSlider").disabled = false
                            //    registry.byId("btnMinus").disabled = false
                            //    registry.byId("btnPlus").disabled = false
                            //    //registry.byId('btnRoads').set('label', 'Flooded Infrastructure')
                            //    document.getElementById("Ambulance Depot").innerHTML = "No flood layer there. Increase level."
                            //}
                            //})

                        }

                    )
                }, "btnRoads").startup();

                var btnBoth = new Button({
                    label: "Go",
                    onClick: lang.hitch(this, function () {
                            if (localmap.graphics) {
                                localmap.graphics.clear();
                            }
                            if (typeof roadsFeatureLayer !== 'undefined') {
                                localmap.removeLayer(roadsFeatureLayer)
                            }
                            //console.log("started")
                            registry.byId('btnBoth').set('disabled', true)
                            registry.byId('btnBuildings').set('disabled', true)
                            registry.byId('btnRoads').set('disabled', true)
                            registry.byId("twlSlider").disabled = true
                            registry.byId("btnMinus").disabled = true
                            registry.byId("btnPlus").disabled = true

                            //registry.byId('btnBoth').set('label', 'Calculating')
                            buildingtypes = ['Ambulance Depot', 'Continuing Care', 'Fire Station', 'Hospital', 'Police Station']
                                //console.log(buildingtypes[i])
                                //document.getElementById(buildingtypes[i]).innerHTML = 'hew'
                            for (var i = 0; i < buildingtypes.length; i++) {
                                buildingtypes[i]
                                    //console.log(buildingtypes[i])
                                document.getElementById(buildingtypes[i] + 'img').src = ''
                                document.getElementById(buildingtypes[i]).innerHTML = ''
                                document.getElementById(buildingtypes[i] + 'val').innerHTML = ''
                            }
                            document.getElementById("roads").innerHTML = ''
                            document.getElementById("roadsval").innerHTML = ''
                            document.getElementById("roadsimg").src = ''
                            floodGeometry()
                            console.log(levelcm)

                            queryflood.execute(query, function (featureSet) {

                                if (featureSet.features.length > 0) {

                                    var params = {
                                        "LCA": registry.byId('fsbLCA').get('item').said,
                                        "FloodLevel": registry.byId('twlSlider').value
                                    }
                                    var gp = new Geoprocessor(GPURL)

                                    gp.setOutSpatialReference({
                                        "wkid": 3857
                                    });
                                    gp.submitJob(params, displayTrack, jobstatus, joberror);

                                    function displayTrack(jobinfo) {
                                        var roadsLayer = RoadsResultURL + jobinfo.jobId + "/0"
                                        roadsFeatureLayer = new FeatureLayer(roadsLayer)
                                        var simpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
                                            new Color([255, 100, 0]), 2)
                                        var renderer = new SimpleRenderer(simpleLineSymbol)
                                        roadsFeatureLayer.setRenderer(renderer)
                                        localmap.addLayer(roadsFeatureLayer)
                                        gp.getResultData(jobinfo.jobId, "RoadsLength", function (displayResult) {
                                            document.getElementById("roadsimg").src = 'app/resources/Roads.png'
                                            document.getElementById("roads").innerHTML = "Flooded Roads: "
                                            document.getElementById("roadsval").innerHTML = (displayResult.value / 1000).toFixed(2) + " km"
                                        })

                                        var resultFeatures = featureSet.features[0];
                                        floodgeometry = resultFeatures.geometry;

                                        //console.log(buildingtypes)

                                        for (var i = 0; i < buildingtypes.length; i++) {
                                            //console.log("start")
                                            var querybuilding = new QueryTask(buildingURL);
                                            var query = new Query();
                                            query.outFields = ["build_type"]
                                            query.returnGeometry = true;
                                            where = "build_type = '" + buildingtypes[i] + "'"
                                            buildingLocal = buildingtypes[i]

                                            query.where = where

                                            querybuilding.execute(query, function (results) {
                                                buildinggeometry = []

                                                for (var g = 0, gl = results.features.length; g < gl; g++) {
                                                    var buildings = results.features[g];
                                                    buildinggeometry.push(buildings.geometry)
                                                }

                                                var intersect = geometryEngine.intersect(buildinggeometry, floodgeometry)
                                                countnotnull = 0, j = intersect.length;

                                                while (j--) {
                                                    if (intersect[j] != null)
                                                        countnotnull++;
                                                }
                                                console.log(results)
                                                document.getElementById(results.features[0].attributes.build_type + 'img').src = 'app/resources/' + results.features[0].attributes.build_type.replace(/ /g, '') + '.png'
                                                document.getElementById(results.features[0].attributes.build_type).innerHTML = results.features[0].attributes.build_type + ': '
                                                document.getElementById(results.features[0].attributes.build_type + 'val').innerHTML = countnotnull
                                                floodbuilding = []
                                                for (var k = 0, kl = intersect.length; k < kl; k++) {
                                                    if (intersect[k] !== null) {
                                                        floodbuilding.push(intersect[k])
                                                    }
                                                }
                                                var simpleMarkerSymbol = new SimpleMarkerSymbol(
                                                    SimpleMarkerSymbol.STYLE_CIRCLE,
                                                    25,
                                                    new SimpleLineSymbol(
                                                        SimpleLineSymbol.STYLE_SOLID,
                                                        new Color([255, 0, 0, 0.9]),
                                                        3
                                                    ),
                                                    new Color([0, 0, 0, 0])
                                                )

                                                var markers = [];

                                                for (var h = 0, hl = floodbuilding.length; h < hl; h++) {
                                                    markers[h] = new Graphic()
                                                    markers[h].setGeometry(floodbuilding[h])
                                                    markers[h].setSymbol(simpleMarkerSymbol)
                                                    localmap.graphics.add(markers[h])
                                                }
                                            })

                                        }
                                        registry.byId('btnBoth').set('disabled', false)
                                        registry.byId('btnBuildings').set('disabled', false)
                                        registry.byId('btnRoads').set('disabled', false)
                                        registry.byId("twlSlider").disabled = false
                                        registry.byId("btnMinus").disabled = false
                                        registry.byId("btnPlus").disabled = false
                                            //registry.byId('btnBoth').set('label', 'Flooded Infrastructure')
                                    }

                                    function jobstatus(jobinfo) {

                                        var jobstatus = '';
                                        switch (jobinfo.jobStatus) {
                                            case 'esriJobSubmitted':
                                                //registry.byId('btnBoth').set('label', 'Submitted...')
                                                document.getElementById("roads").innerHTML = 'Submitted...';
                                                //console.log(jobinfo.jobStatus)
                                                break;
                                            case 'esriJobExecuting':
                                                //registry.byId('btnBoth').set('label', 'Executing...')
                                                document.getElementById("roads").innerHTML = 'Executing...';
                                                //console.log(jobinfo.jobStatus)
                                                break;
                                            case 'esriJobSucceeded':
                                                //domUtils.hide(registry.byId('buildings'));
                                                //console.log(jobinfo.jobStatus)
                                                break;
                                        }
                                        // registry.byId('status').innerHTML = jobstatus;

                                    }

                                    function joberror(jobinfo) {
                                        registry.byId('btnBoth').set('disabled', false)
                                        registry.byId('btnBuildings').set('disabled', false)
                                        registry.byId('btnRoads').set('disabled', false)
                                        registry.byId("twlSlider").disabled = false
                                        registry.byId("btnMinus").disabled = false
                                        registry.byId("btnPlus").disabled = false
                                            //registry.byId('btnBoth').set('label', 'Flooded Infrastructure')
                                        document.getElementById("roads").innerHTML = "Failed. Try again"
                                    }
                                } else {
                                    registry.byId('btnBoth').set('disabled', false)
                                    registry.byId('btnBuildings').set('disabled', false)
                                    registry.byId('btnRoads').set('disabled', false)
                                    registry.byId("twlSlider").disabled = false
                                    registry.byId("btnMinus").disabled = false
                                    registry.byId("btnPlus").disabled = false
                                        //registry.byId('btnBoth').set('label', 'Flooded Inf rastructure')
                                    document.getElementById("Ambulance Depot").innerHTML = "No flood layer there. Increase level."
                                }
                            })
                            topic.subscribe("floodUpdate/slider", function () {
                                buildingtypes = ['Ambulance Depot', 'Continuing Care', 'Fire Station', 'Hospital', 'Police Station']

                                for (var i = 0; i < buildingtypes.length; i++) {
                                    buildingtypes[i]
                                        //console.log(buildingtypes[i])
                                    document.getElementById(buildingtypes[i] + 'img').src = ''
                                    document.getElementById(buildingtypes[i]).innerHTML = ''
                                    document.getElementById(buildingtypes[i] + 'val').innerHTML = ''
                                }
                                document.getElementById("roads").innerHTML = ''
                                document.getElementById("roadsval").innerHTML = ''
                                document.getElementById("roadsimg").src = ''
                                localmap.graphics.clear()
                                if (typeof roadsFeatureLayer !== 'undefined') {
                                    localmap.removeLayer(roadsFeatureLayer)
                                }
                            })
                        }

                    )
                }, "btnBoth").startup();

            }
        });
    });