﻿dojo.require("esri.map");
dojo.require("esri.geometry");
dojo.require("dojo.parser");
dojo.require("dijit.layout.TabContainer");
dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.form.ComboBox");
dojo.require("dijit.form.TextBox");
dojo.require("dijit.form.Button");
dojo.require("dijit.form.RadioButton");
dojo.require("dojo._base.xhr");
dojo.require("dojo.io.script");
dojo.require("esri.tasks.query");
dojo.require("esri.toolbars.navigation");
dojo.require("esri.tasks.geometry");
dojo.require("esri.toolbars.draw");
dojo.require("dijit.Dialog");
dojo.require("esri.tasks.identify");
dojo.require("dijit.form.SimpleTextarea");
dojo.require("dijit.form.ValidationTextBox");
dojo.require("dijit.Tooltip");
dojo.require("dojox.charting.Chart2D");
dojo.require("dojox.charting.plot2d.Pie");
dojo.require("dojox.charting.action2d.Highlight");
dojo.require("dojox.charting.action2d.MoveSlice");
dojo.require("dojox.charting.action2d.Tooltip");
dojo.require("dojox.charting.themes.MiamiNice");
dojo.require("dojox.charting.widget.Legend");



var vnServiceURL = 'http://vann-nett.nve.no/Innsyn/VNService.svc/';
var waterBodyMapServiceURL = 'http://vann-nett.nve.no/ArcGIS/rest/services/WaterbodyInnsyn/MapServer/';
var photoMapServiceURL = 'http://vann-nett.nve.no/ArcGIS/rest/services/photo/MapServer/';
var geometryService = 'http://vann-nett.nve.no/ArcGIS/rest/services/Geometry/GeometryServer/';
var administrativeMapServiceURL = 'http://vann-nett.nve.no/ArcGIS/rest/services/AdministrativeDataInnsyn/MapServer/';
var backgroundMapService = 'http://vann-nett.nve.no/ArcGIS/rest/services/GeoCacheVektor/MapServer/';
var backgroundOrtoMapService = 'http://vann-nett.nve.no/ArcGIS/rest/services/GeoCacheOrto/MapServer/';
var photoUploadURL = 'http://vann-nett.nve.no/Innsyn/photo.aspx';



var layerNameSubUnit = 'Vannområde';
var layerNameMunicipality = 'Kommune';
var layerNameCounty = 'Fylke';
var layerNameRiverBasinDistrict = 'Vannregion';
var layerNameCompetentAuthority = 'Vannregionmyndighet';

var map, identifyDijit, currentReferencePoint, currentEvt;
var _mapLoaded = false;
var mapNavigation;
var _geometryService;

var _norwayCacheLayerId = 'norwayCache';
var _norwayOrtoCacheLayerId = 'ortoCache';
var _areaLayerId = 'areaLayerService'; ;
var _waterLayerId = 'waterLayerService';
var _enableZoomPrev = false;
var _enableZoomNext = false;

var missingResponseTextTooltip = null;
var currentLanguage = 'no';

var pointerTooltip = null;

function initialize() {
    setStartupLanguage();
    BrowserDetect.init();
    //dojo.byId('debugDiv').innerHTML = BrowserDetect.browser + ' ' + BrowserDetect.version + ' on ' + BrowserDetect.OS;

    esri.config.defaults.io.proxyUrl = "proxy.ashx";
    window.setTimeout('dojo.connect(window, "resize", "adjustMapSizeHandler");', 1000);
    adjustMapSizeHandler();
    var mapDiv = dojo.byId('map1');
    var mapDivCoords = dojo.coords(mapDiv, false);
    //dojo.style(dojo.byId("mapStatus"), "position", "absolute");
    //dojo.style(dojo.byId("mapStatus"), "top", mapDivCoords.y);
    map = new esri.Map("map1");
    dojo.connect(map, "onLayerAdd", mapLoaded);
    dojo.connect(map, "onZoomEnd", mapZoomEnd);
    setTimeout('initPictureHandling();', 3000);
    setTimeout('setScaleText();', 2000);
    var tiledVectorMapServiceLayer = new esri.layers.ArcGISTiledMapServiceLayer(backgroundMapService);
    tiledVectorMapServiceLayer.id = _norwayCacheLayerId;
    tiledVectorMapServiceLayer.visible = true;
    map.addLayer(tiledVectorMapServiceLayer);


    //var tiledOrtoMapServiceLayer = new esri.layers.ArcGISTiledMapServiceLayer(backgroundOrtoMapService);
    //tiledOrtoMapServiceLayer.id = _norwayOrtoCacheLayerId;
    //tiledOrtoMapServiceLayer.visible = false;
    //map.addLayer(tiledOrtoMapServiceLayer);
    var areaLayers = new esri.layers.ArcGISDynamicMapServiceLayer(administrativeMapServiceURL);
    areaLayers.id = _areaLayerId;
    map.addLayer(areaLayers);

    var waterLayers = new esri.layers.ArcGISDynamicMapServiceLayer(waterBodyMapServiceURL);
    waterLayers.id = _waterLayerId;
    map.addLayer(waterLayers);
    mapNavigation = new esri.toolbars.Navigation(map);
    window.setTimeout('dojo.connect(mapNavigation, "onExtentHistoryChange", extentHistoryChangeHandler);', 5000);
    dojo.connect(map, "onMouseMove", showCoordinates);
    dojo.connect(map, "onMouseDrag", showCoordinates);

    checkForSystemMessages();

    _geometryService = new esri.tasks.GeometryService(geometryService);
    dojo.connect(_geometryService, "onAreasAndLengthsComplete", outputAreaAndLength);

    setTimeout('toggleLeftPanel(true)', 2000);
    dojo.byId("divInitialLoad").style.display = "none";

    pointerTooltip = new dijit.Tooltip
            (
                { id: "uxPointerTooltip", position: "above", connectId: ["toolbar_select"], label: "Klikk på ønsket vannforekomst for statistikk" }
            );

    var clearSelectionTooltip = new dijit.Tooltip
            (
                { id: "uxClearSelectionTooltip", position: "above", connectId: ["toolbar_clearMap"], label: "Fjern valg i kart og nullstill vertktøy" }
            );

    var zoomInTooltip = new dijit.Tooltip
            (
                { id: "uxzoomInTooltip", position: "above", connectId: ["toolbar_zoomIn"], label: "Forstørre ved å tegne firkant" }
            );

    var uploadPicturesTooltip = new dijit.Tooltip
            (
                { id: "uxUploadPicturesTooltip", position: "above", connectId: ["toolbar_uploadImage"], label: "Last opp bilder til kart" }
            );

    var showPicturesTooltip = new dijit.Tooltip
            (
                { id: "uxShowPicturesTooltip", position: "above", connectId: ["toolbar_viewImage"], label: "Vis bilder i kart" }
            );

    var fullExtentTooltip = new dijit.Tooltip
            (
                { id: "uxShowFullExtentTooltip", position: "above", connectId: ["toolbar_fullExtent"], label: "Vis hele kartet" }
            );

    var prevExtentTooltip = new dijit.Tooltip
            (
                { id: "uxZoomPrevTooltip", position: "above", connectId: ["toolbar_zoomprev"], label: "Zoom til forrige kartutsnitt" }
            );

    var nextExtentTooltip = new dijit.Tooltip
            (
                { id: "uxZoomNextTooltip", position: "above", connectId: ["toolbar_zoomnext"], label: "Zoom til neste kartutsnitt" }
            );

    var measureLineTooltip = new dijit.Tooltip
            (
                { id: "uxMeasureLineTooltip", position: "above", connectId: ["toolbar_measureLength"], label: "Mål linje" }
            );

    var measureLineTooltip = new dijit.Tooltip
            (
                { id: "uxMeasureAreaTooltip", position: "above", connectId: ["toolbar_measureSquare"], label: "Beregn areal og omkrets" }
            );

}


function initPictureHandling() {


    //    dojo.connect(map.graphics, "onMouseOver", function(evt) {
    //        var content = evt.graphic.getContent();
    //        map.infoWindow.setContent(content);
    //        var title = evt.graphic.getTitle();
    //        map.infoWindow.setTitle(title);
    //        //evt.graphic.setSymbol(highlightSymbol);
    //        map.infoWindow.show(evt.screenPoint, map.getInfoWindowAnchor(evt.screenPoint));
    //    });

    //    dojo.connect(map.graphics, "onMouseOut", function(evt) {
    //        map.infoWindow.hide();
    //        //evt.graphic.setSymbol(symbol);
    //    });

    dojo.connect(map, "onZoomEnd", handlePicturesZoom);
    dojo.connect(map, "onPanEnd", handlePicturesPan);
}




function handlePicturesPan(extent, endPoint) {
    handlePictures(extent, map.getLevel());
}


function handlePicturesZoom(extent, zoomFactor, anchor, level) {
    handlePictures(extent, level);
}

var _lastPictureExtent = null;
function isExtentInsideLastExtent(newExtent) {
    if (_lastPictureExtent == null)
        return false;
    else {
        if (newExtent.xmin > _lastPictureExtent.xmin &&
                newExtent.ymin > _lastPictureExtent.ymin &&
                newExtent.xmax < _lastPictureExtent.xmax &&
                newExtent.ymax < _lastPictureExtent.ymax)
            return true;
        else
            return false;
    }

}

var infoTemplate;
function handlePictures(extent, level) {
    var scale = getScale()
    if (taskToolbarMenuStateManager.currentEnabledTool.toolname != 'showPictures' || scale > 400000) {
        return;
    } else if (isExtentInsideLastExtent(extent)) {
        return;
    }
    _lastPictureExtent = extent;


    var queryTask = new esri.tasks.QueryTask(photoMapServiceURL + "/0");

    var query = new esri.tasks.Query();
    query.returnGeometry = true;
    query.outFields = ["Title", "Description", "PhotographerName", "DateTaken", "Category", "WaterBodyID", "DateUploaded", "FileNameSmall", "FileNameMedium", "FileNameLarge"];
    query.where = "FileNameLarge != ''";
    query.geometry = extent;

    infoTemplate = new esri.InfoTemplate();
    infoTemplate.setTitle("${Title}");
    infoTemplate.setContent("<div style='height:260px;overflow-y:scroll;overflow-x:hidden;'>"
                             + "<img src='../photos/${FileNameMedium}' /><br/>"
                             + "<b>Beskrivelse: </b>${Description}<br/>"
                             + "<b>Fotograf: </b>${PhotographerName}<br/>"
                             + "<b>Kategori: </b>${Category}<br/>"
                             + "<b>Dato: </b>${DateTaken}<br/>"
                             + "<b>Vannforekomst-id: </b>${WaterBodyID}<br/><br/>"
                             + "<a href='../photos/${FileNameLarge}' target='_blank'>Se stor versjon</a>"
                             + "</div>");
    map.infoWindow.resize(225, 350);
    map.infoWindow.hide();
    queryTask.execute(query, handlePictures2, errorFunction);
}

function handlePictures2(featureSet) {
    map.graphics.clear();

    //QueryTask returns a featureSet.  Loop through features in the featureSet and add them to the map.

    for (var i = 0, il = featureSet.features.length; i < il; i++) {
        //var highlightSymbol = new esri.symbol.PictureMarkerSymbol(featureSet.features[i].attributes['Url'], 40, 40);
        var symbol;
        //if (BrowserDetect.browser == "Explorer")
        symbol = new esri.symbol.PictureMarkerSymbol("../photos/" + featureSet.features[i].attributes['FileNameSmall'], 40, 40);
        //else
        //    symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, 15,
        //        new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color("#66CC00"), 4), new dojo.Color("#FFFF00"));
        //Get the current feature from the featureSet.
        //Feature is a graphic
        var graphic = featureSet.features[i];
        graphic.setSymbol(symbol);
        graphic.setInfoTemplate(infoTemplate);

        //Add graphic to the map graphics layer.
        map.graphics.add(graphic);
    }


}

function postToPhoto(x, y, waterBodyID) {
    var myForm = document.createElement("form");
    myForm.method = "post";
    myForm.action = photoUploadURL;

    var inputX = document.createElement("input");
    inputX.setAttribute("name", "x");
    inputX.setAttribute("value", x);
    myForm.appendChild(inputX);

    var inputY = document.createElement("input");
    inputY.setAttribute("name", "y");
    inputY.setAttribute("value", y);
    myForm.appendChild(inputY);

    var inputWaterBodyID = document.createElement("input");
    inputWaterBodyID.setAttribute("name", "WaterBodyID");
    inputWaterBodyID.setAttribute("value", waterBodyID);
    myForm.appendChild(inputWaterBodyID);

    document.body.appendChild(myForm);
    myForm.submit();
    document.body.removeChild(myForm);
}

function setStartupLanguage() {
    try {
        var language = 'no';
        var url = '';
        url = document.location.href;
        if (url.indexOf('?', 0) > -1 && url.indexOf('language', 0) > -1 && url.indexOf('=', 0) > -1) {
            var partsTemp = url.split('?');
            if (partsTemp.length == 2) {
                var parts = partsTemp[1].split('=');
                if (parts.length > 0) {
                    for (var i = 0; i < parts.length - 1; i++) {
                        if (parts[i] == 'language')
                            if (parts[i + 1] == 'no' || parts[i + 1] == 'en') {
                            switchLanguage(parts[i + 1]);
                            return;
                        }
                    }
                }
            }
        }
    } catch (err) { }
    switchLanguage('no');
}


function checkForSystemMessages() {
    var url = vnServiceURL + "getSystemMessages?solution=IN";
    dojo.xhrGet({ url: url, load: showSystemMessages, error: errorFunction, handleAs: "json" });
    setTimeout('checkForSystemMessages', 600 * 1000);
}

function showSystemMessages(message) {
    if (message != null && message.length > 0) {
        dojo.byId("statusMessage").style.display = 'inline';
        dojo.byId("systemMessageText").innerHTML = message;
    }
    else {
        dojo.byId("statusMessage").style.display = 'none';
    }
}


function mapZoomEnd(extent, zoomFactor, anchor, level) {
    setScaleText();
    showWaterBodies();
}

var setScaleText = function() {
    var scale = getScale();
    var scaleText = '1:' + scale;
    dojo.byId('uxScale').innerHTML = scaleText;

}

var showWaterBodies = function() {
    var tocTransitionalWater = dijit.byId('tocTransitionalWater');
    var tocCostalWater = dijit.byId('tocCostalWater');
    var tocGroundWater = dijit.byId('tocGroundWater');
    var tocLakeWater = dijit.byId('tocLakeWater');
    var tocRiverWater = dijit.byId('tocRiverWater');


    var waterBodyLayer = map.getLayer(_waterLayerId);
    var visibleLayers = [];
    if (getScale() <= 400000) {
        if (tocTransitionalWater.checked) {
            visibleLayers.push(0);
        }
        if (tocCostalWater.checked) {
            visibleLayers.push(1);
        }
        if (tocGroundWater.checked) {
            visibleLayers.push(2);
        }
        if (tocLakeWater.checked) {
            visibleLayers.push(3);
        }
        if (tocRiverWater.checked) {
            visibleLayers.push(4);
        }
    }
    waterBodyLayer.setVisibleLayers(visibleLayers);
}



var myStatistics = null;
function showStatistics(layerName, id) {

    if (myStatistics == null) {
        myStatistics = new StatisticsArea();
    }
    myStatistics.getStatisticsHeading(layerName, id)

    var statisticsAreaDialog = dijit.byId("statisticsAreaDialog");
    dojo.connect(statisticsAreaDialog, "hide", "hideStatistics")
}

function showStatisticsTab(tab) {

    var statisticsCharacterizationTab = dojo.byId('statisticsCharacterizationTab');
    var statisticsCharacterizationTabContent = dojo.byId('statisticsCharacterizationTabContent');
    var statisticsPressureTab = dojo.byId('statisticsPressureTab');
    var statisticsPressureTabContent = dojo.byId('statisticsPressureTabContent');
    var statisticsHMWBTab = dojo.byId('statisticsHMWBTab');
    var statisticsHMWBTabContent = dojo.byId('statisticsHMWBTabContent');
    var statisticsHMWB2008Tab = dojo.byId('statisticsHMWB2008Tab');
    var statisticsHMWB2008TabContent = dojo.byId('statisticsHMWB2008TabContent');

    switch (tab) {
        case 'Pressure':
            statisticsCharacterizationTab.className = 'customTab';
            statisticsPressureTab.className = 'customTabSelected';
            statisticsHMWBTab.className = 'customTab';
            statisticsHMWB2008Tab.className = 'customTab';
            
            statisticsCharacterizationTabContent.style.display = 'none';
            statisticsPressureTabContent.style.display = 'block';
            statisticsHMWBTabContent.style.display = 'none';
            statisticsHMWB2008TabContent.style.display = 'none';
            
            break;
        case 'HMWB':
            statisticsCharacterizationTab.className = 'customTab';
            statisticsPressureTab.className = 'customTab';
            statisticsHMWBTab.className = 'customTabSelected';
            statisticsHMWB2008Tab.className = 'customTab';
            
            statisticsCharacterizationTabContent.style.display = 'none';
            statisticsPressureTabContent.style.display = 'none';
            statisticsHMWBTabContent.style.display = 'block';
            statisticsHMWB2008TabContent.style.display = 'none';

            break;
        case 'HMWB2008':
            statisticsCharacterizationTab.className = 'customTab';
            statisticsPressureTab.className = 'customTab';
            statisticsHMWBTab.className = 'customTab';
            statisticsHMWB2008Tab.className = 'customTabSelected';

            statisticsCharacterizationTabContent.style.display = 'none';
            statisticsPressureTabContent.style.display = 'none';
            statisticsHMWBTabContent.style.display = 'none';
            statisticsHMWB2008TabContent.style.display = 'block';

            break;
        default: //'Characterization'
            statisticsCharacterizationTab.className = 'customTabSelected';
            statisticsPressureTab.className = 'customTab';
            statisticsHMWBTab.className = 'customTab';
            statisticsHMWB2008Tab.className = 'customTab';
            
            statisticsCharacterizationTabContent.style.display = 'block';
            statisticsPressureTabContent.style.display = 'none';
            statisticsHMWBTabContent.style.display = 'none';
            statisticsHMWB2008TabContent.style.display = 'none';
    }
}


function hideStatistics() {
    map.graphics.clear();
    //setTimeout("myStatistics.reset()", 500);
}



var wbInfo = null;
function showWaterBodyInfo(waterBodyID, performZoom) {
    wbInfo = new WaterBodyInfo();
    wbInfo.showInfo(waterBodyID, performZoom)

    var wbinfoDialog = dijit.byId("wbinfoDialog");
    dojo.connect(wbinfoDialog, "hide", "hideWaterBodyInfo")
}

function hideWaterBodyInfo() {
    //map.graphics.clear();
    //setTimeout("myStatistics.reset()", 500);
}

var _lastWaterBodyIDForInfo;
var WaterBodyInfo = function() {

    this.showInfo = function(waterBodyID, performZoom) {
        var wbInfoTabContainer = dijit.byId('wbInfoTabContainer');
        wbInfoTabContainer.selectChild(dijit.byId('wbinfoMainTab'));
        var url = vnServiceURL;
        var returnMethod = setMainInfo;
        switch (waterBodyID.substring(waterBodyID.length - 1)) {
            case 'R':
                url = url + 'getRiverWaterBody?waterBodyID=' + waterBodyID;
                //                returnMethod = setMainInfoRiver;
                break;
            case 'L':
                url = url + 'getLakeWaterBody?waterBodyID=' + waterBodyID;
                //                returnMethod = setMainInfoLake;
                break;
            case 'G':
                url = url + 'getGroundWaterBody?waterBodyID=' + waterBodyID;
                //                returnMethod = setMainInfoGroundWater;
                break;
            case 'C':
                url = url + 'getCoastalWaterBody?waterBodyID=' + waterBodyID;
                //                returnMethod = setMainInfoCoastal;
                break;
            case 'T':
                url = url + 'getTransitionalWaterBody?waterBodyID=' + waterBodyID;
                //                returnMethod = setMainInfoTransitional;
                break;
        }

        dojo.xhrGet({ url: url, load: returnMethod, error: errorFunction, handleAs: "json" });

        dojo.byId('wbinfoWaterBodyID').innerHTML = waterBodyID;

        var anim = dojo.fadeOut({ node: 'wbinfoMainTab', duration: 1 });
        anim.play();


        if (performZoom)
            zoomToSearcResult(waterBodyID);

        if (_lastWaterBodyIDForInfo != waterBodyID) {
            var statusURL = vnServiceURL + 'getStatusForWaterBody?waterBodyID=' + waterBodyID + '&languageID=' + currentLanguage;
            dojo.xhrGet({ url: statusURL, load: setStatus, error: errorFunction, handleAs: "json" });
            var characterizationURL = vnServiceURL + 'getCharacterizationForWaterBody?waterBodyID=' + waterBodyID + '&languageID=' + currentLanguage;
            dojo.xhrGet({ url: characterizationURL, load: setCharacterization, error: errorFunction, handleAs: "json" });
            var pressureURL = vnServiceURL + 'getPressuresForWaterBody?waterBodyID=' + waterBodyID + '&languageID=' + currentLanguage;
            dojo.xhrGet({ url: pressureURL, load: setPressures, error: errorFunction, handleAs: "json" });
            var hmwbURL = vnServiceURL + 'getHMWBsForWaterBody?waterBodyID=' + waterBodyID + '&languageID=' + currentLanguage;
            dojo.xhrGet({ url: hmwbURL, load: setHMWBs, error: errorFunction, handleAs: "json" });


            var environmentalTargetURL = vnServiceURL + 'getEnvironmentalTargetsForWaterBody?waterBodyID=' + waterBodyID + '&languageID=' + currentLanguage;
            dojo.xhrGet({ url: environmentalTargetURL, load: setEnvironmemtalTargets, error: errorFunction, handleAs: "json" });

            var archiveURL = vnServiceURL + 'getPublicArchiveForWaterBody?waterBodyID=' + waterBodyID;
            dojo.xhrGet({ url: archiveURL, load: setArchive, error: errorFunction, handleAs: "json" });
        }
        _lastWaterBodyIDForInfo = waterBodyID;
    }


    //    var setMainInfoRiver = function(result) {
    //        dojo.byId('wbinfoWaterBodyName').innerHTML = result.Name;
    //        setMainInfo(result);
    //    }

    //    var setMainInfoLake = function(result) {
    //        dojo.byId('wbinfoWaterBodyName').innerHTML = result.Name;
    //        setMainInfo(result);
    //    }

    //    var setMainInfoGroundWater = function(result) {
    //        dojo.byId('wbinfoWaterBodyName').innerHTML = result.Name;
    //        setMainInfo(result);
    //    }

    //    var setMainInfoCoastal = function(result) {
    //        dojo.byId('wbinfoWaterBodyName').innerHTML = result.Name;
    //        setMainInfo(result);
    //    }

    //    var setMainInfoTransitional = function(result) {
    //        
    //        setMainInfo(result);
    //    }

    var setMainInfo = function(result) {
        if (result == null) {
            alert(getText("NoHitsWaterBodyNotRegistered"));
            return;
        }

        dijit.byId("wbinfoDialog").show();
        var anim = dojo.fadeIn({ node: 'wbinfoMainTab', duration: 2000 });
        anim.play();
        dojo.byId('wbinfoWaterBodyName').innerHTML = result.Name;

        var container = dojo.byId('wbinfoMainAttributes');

        var mainTable = dojo.byId('wbinfoMainAttributesTable');
        if (mainTable)
            container.removeChild(mainTable);

        var table = document.createElement("table");
        table.id = 'wbinfoMainAttributesTable';
        table.setAttribute("cellspacing", "0");
        table.setAttribute("cellpadding", "4");
        container.appendChild(table);


        var tableBody = document.createElement("tbody");
        table.appendChild(tableBody);


        try {
            if (result["Area"] == null)
                tableBody.appendChild(createWBMainInfoTableRow(getText("Length"), result["RiverLengthTotal"]));
            else
                tableBody.appendChild(createWBMainInfoTableRow(getText("Area"), result["Area"]));

            if (result["TypologyName"] != null)
                tableBody.appendChild(createWBMainInfoTableRow(getText("Typology"), result["TypologyName"]));
            if (result["CompetentAuthorityName"] != null)
                tableBody.appendChild(createWBMainInfoTableRow(getText("CompetentAuthority"), result["CompetentAuthorityName"]));
            if (result["RiverBasinDistrictName"] != null)
                tableBody.appendChild(createWBMainInfoTableRow(getText("RiverBasinDistrict"), result["RiverBasinDistrictName"]));
            if (result["SubUnitName"] != null)
                tableBody.appendChild(createWBMainInfoTableRow(getText("SubUnit"), result["SubUnitName"]));
            if (result["Counties"] != null && result["Counties"].length > 0)
                tableBody.appendChild(createWBMainInfoTableRow(getText("County"), result["Counties"][0].Value));
            if (result["Municipalities"] != null && result["Municipalities"].length > 0)
                tableBody.appendChild(createWBMainInfoTableRow(getText("Municipality"), result["Municipalities"][0].Value));
            if (result["EcoRegionName"] != null)
                tableBody.appendChild(createWBMainInfoTableRow(getText("EcoRegion"), result["EcoRegionName"]));
            if (result["CatchCD"] != null)
                tableBody.appendChild(createWBMainInfoTableRow(getText("CatchCD"), result["CatchCD"]));
            if (result["CatchName"] != null)
                tableBody.appendChild(createWBMainInfoTableRow(getText("CatchName"), result["CatchName"]));
        } catch (err) { }

        //        for (property in result) {
        //            tableBody.appendChild(createTableRow(property, result[property]));
        //        }

    }

    var setStatus = function(result) {
        var tbody = dojo.byId('wbinfoStatusTable');

        var wbinfoStatusTotal = dojo.byId('wbinfoStatusTotal');
        wbinfoStatusTotal.innerHTML = getText('SumStatusTitle') + result.CalculatedSumStatusName;
        wbinfoStatusTotal.style.backgroundColor = result.CalculatedSumStatusColor;
        var existing = tbody.getElementsByTagName('tr');
        while (existing.length > 0) {
            tbody.removeChild(existing[0]);
        }



        var splitArray = result.WaterBodyID.split('-');

        if (result.IsHMWB) {
            tbody.appendChild(createTableRow(getText('EcologicalPotential') + ':', result.EcologicalPotentialName));
        }
        else if (splitArray[splitArray.length - 1] == 'G') {
            tbody.appendChild(createTableRow(getText('QuantitativeStatus') + ':', result.QuantitativeStatusName));
        }
        else {
            tbody.appendChild(createTableRow(getText('EcologicalStatus') + ':', result.EcologicalStatusName));
        }

        tbody.appendChild(createTableRow(getText('ChemicalStatus') + ':', result.ChemicalStatusName));
        tbody.appendChild(createTableRow(getText('Confidence') + ':', result.ConfidenceName));
        tbody.appendChild(createTableRow(getText('StatusSource') + ':', result.StatusSourceName));
    }


    var setCharacterization = function(result) {
        if (result != null) {
            var tbody = dojo.byId('wbinfoCharacterizationTable');

            var existing = tbody.getElementsByTagName('tr');
            while (existing.length > 0) {
                tbody.removeChild(existing[0]);
            }

            tbody.appendChild(createTableRow(getText('Risk') + ':', result.RiskName));
            tbody.appendChild(createTableRow(getText('ReasonForRisk') + ':', result.ReasonForRiskName));
        }
    }


    var setPressures = function(result) {
        var wbinfoPressureTable = dojo.byId('wbinfoPressureTable');
        var tableBody = dojo.byId('wbinfoPressureTableBody');
        if (tableBody)
            wbinfoPressureTable.removeChild(tableBody);

        var tableBody = document.createElement("tbody");
        tableBody.id = 'wbinfoPressureTableBody';
        wbinfoPressureTable.appendChild(tableBody);

        if (result.length > 0) {
            for (var i = 0; i < result.length; i++) {
                tableBody.appendChild(createPressureTableRow(result[i].ExtentName, result[i].PressureTypeName, result[i].ParentPressureTypeName, result[i].DataQualityName, result[i].Description));
            }
        }

        if (result.length == 0) {
            wbinfoPressureTable.style.display = 'none';
            dojo.byId('wbinfoPressureStatus').style.display = 'block';
            dojo.byId('wbinfoPressureStatus').innerHTML = getText('NoData');
        } else {
            wbinfoPressureTable.style.display = 'inline';
            dojo.byId('wbinfoPressureStatus').style.display = 'none';
        }
    }

    var createPressureTableRow = function(extent, name, parentName, dataQuality, comment) {
        var tr = document.createElement("tr");

        var tdExtent = document.createElement("td");
        tdExtent.innerHTML = extent;
        tr.appendChild(tdExtent);

        var tdName = document.createElement("td");
        tdName.innerHTML = parentName + ' - ' + name;
        tr.appendChild(tdName);

        var tdDataQuality = document.createElement("td");
        tdDataQuality.innerHTML = dataQuality;
        tr.appendChild(tdDataQuality);

        var tdComment = document.createElement("td");
        tdComment.innerHTML = comment;
        tr.appendChild(tdComment);

        return tr;
    }

    var setHMWBs = function(result) {
        var wbinfoHMWBTable = dojo.byId('wbinfoHMWBTable');
        var tableBody = dojo.byId('wbinfoHMWBTableBody');
        if (tableBody)
            wbinfoHMWBTable.removeChild(tableBody);

        var tableBody = document.createElement("tbody");
        tableBody.id = 'wbinfoHMWBTableBody';
        wbinfoHMWBTable.appendChild(tableBody);

        var isHMWB = false;
        if (result.length > 0) {
            for (var i = 0; i < result.length; i++) {
                if (result[i].IsHMWB)
                    isHMWB = true;
                tableBody.appendChild(createHMWBTableRow(result[i].PressureTypeName, result[i].ParentPressureTypeName, result[i].IsHMWB));
            }
            dojo.byId('wbinfoHMWBTable').style.display = 'inline';
        }

        var wbinfoHMWBStatus = dojo.byId('wbinfoHMWBStatus');
        if (result.length == 0) {
            wbinfoHMWBStatus.innerHTML = getText('NotHMWB');
            dojo.byId('wbinfoHMWBTable').style.display = 'none';
        }
        else if (isHMWB)
            wbinfoHMWBStatus.innerHTML = getText('FinalHMWB');
        else
            wbinfoHMWBStatus.innerHTML = getText('HMWBCandidate');

    }

    var createHMWBTableRow = function(pressureTypeName, parentPressureTypeName, isHMWB) {
        var tr = document.createElement("tr");

        var tdPressureType = document.createElement("td");
        tdPressureType.innerHTML = parentPressureTypeName + ' - ' + pressureTypeName;
        tr.appendChild(tdPressureType);

        var tdStatus = document.createElement("td");
        if (isHMWB)
            tdStatus.innerHTML = getText('PressureIsHMWB');
        else
            tdStatus.innerHTML = getText('PressureIsHMWBCandidate');
        tr.appendChild(tdStatus);

        return tr;
    }



    var setEnvironmemtalTargets = function(result) {
        var environmentalTargetsContainer = dojo.byId('wbinfoEnvironmentalTargetContainer');
        var wbinfoEnvironmentalTargetTemplate = dojo.byId('wbinfoEnvironmentalTargetTemplate');

        var existing = environmentalTargetsContainer.getElementsByTagName('fieldset')
        while (existing.length > 0) {
            environmentalTargetsContainer.removeChild(existing[0]);
        }
        if (result.length > 0) {
            for (var i = 0; i < result.length; i++) {
                var newFieldset = wbinfoEnvironmentalTargetTemplate.cloneNode(true);
                var legend = newFieldset.getElementsByTagName('legend');
                legend[0].innerHTML = getText('EnvironmentalTargetsHeading') + result[i].Year;

                var tbody = newFieldset.getElementsByTagName('tbody');

                var splitArray = result[i].WaterBodyID.split('-');

                if (result[i].WaterBodyIsHMWB) {
                    tbody[0].appendChild(createTableRow(getText('EcologicalPotential') + ':', result[i].EcologicalPotentialName));
                }
                else if (splitArray[splitArray.length - 1] == 'G') {
                    tbody[0].appendChild(createTableRow(getText('QuantitativeStatus') + ':', result[i].QuantitativeStatusName));
                }
                else {
                    tbody[0].appendChild(createTableRow(getText('EcologicalStatus') + ':', result[i].EcologicalStatusName));
                }

                tbody[0].appendChild(createTableRow(getText('ChemicalStatus') + ':', result[i].ChemicalStatusName));
                tbody[0].appendChild(createTableRow(getText('OtherEnvironmentalTargets') + ':', result[i].OtherTargets));
                tbody[0].appendChild(createTableRow(getText('DescriptionOfExemptions') + ':', result[i].ReasonsForException));
                tbody[0].appendChild(createTableRow(getText('LongTermAmbitions') + ':', result[i].LongTermAmbition));

                environmentalTargetsContainer.appendChild(newFieldset);
                environmentalTargetsContainer.appendChild(document.createElement("br"));
            }
        }
        if (result.length == 0) {
            dojo.byId('wbinfoEnvironmentalTargetStatus').style.display = 'block';
            dojo.byId('wbinfoEnvironmentalTargetStatus').innerHTML = getText('NoData');
        } else {
            dojo.byId('wbinfoEnvironmentalTargetStatus').style.display = 'none';
        }
    }

    var setArchive = function(result) {
        var wbinfoArchiveTable = dojo.byId('wbinfoArchiveTable');
        var tableBody = dojo.byId('wbinfoArchiveTableBody');
        if (tableBody)
            wbinfoArchiveTable.removeChild(tableBody);

        var tableBody = document.createElement("tbody");
        tableBody.id = 'wbinfoArchiveTableBody';
        wbinfoArchiveTable.appendChild(tableBody);
        if (result.length > 0) {
            for (var i = 0; i < result.length; i++) {
                tableBody.appendChild(createArchiveTableRow(result[i].Name, result[i].Description, result[i].Url));
            }
        }
        if (result.length == 0) {
            wbinfoArchiveTable.style.display = 'none';
            dojo.byId('wbinfoArchiveStatus').style.display = 'block';
            dojo.byId('wbinfoArchiveStatus').innerHTML = getText('NoData');
        } else {
            wbinfoArchiveTable.style.display = 'inline';
            dojo.byId('wbinfoArchiveStatus').style.display = 'none';
        }
    }

    var createArchiveTableRow = function(title, description, url) {
        var tr = document.createElement("tr");

        var tdTitle = document.createElement("td");
        var aTitle = document.createElement("a");
        aTitle.innerHTML = title;
        aTitle.href = url;
        aTitle.target = '_blank';
        tdTitle.appendChild(aTitle);
        tr.appendChild(tdTitle);

        var tdDescription = document.createElement("td");
        tdDescription.innerHTML = description;
        tr.appendChild(tdDescription);

        return tr;
    }


    var createTableRow = function(title, text) {
        var tr = document.createElement("tr");

        var tdTitle = document.createElement("td");
        tdTitle.innerHTML = title;
        tr.appendChild(tdTitle);

        var tdText = document.createElement("td");
        tdText.innerHTML = text;
        tr.appendChild(tdText);

        return tr;
    }

    var createWBMainInfoTableRow = function(title, text) {
        var tr = document.createElement("tr");

        var tdTitle = document.createElement("td");
        tdTitle.innerHTML = title + ":";
        tdTitle.style.fontWeight = "bold";
        tr.appendChild(tdTitle);

        var tdText = document.createElement("td");
        tdText.innerHTML = text;
        tr.appendChild(tdText);

        return tr;
    }

}

var _lastStatisticsLayerName, _lastStatisticsId;
var StatisticsArea = function() {
    var Data_SumStatus = null;
    var Data_Risk = null;
    var Data_HMWBs = null;
    var Data_HMWBDataSource = [];
    var Data_HMWB2008s = null;
    var Data_HMWB2008DataSource = [];
    var Data_NoOfWaterBodies = null;
    var Data_SizeOfWaterBodies = null;
    var Data_Pressures = null;
    var Data_PressuresDataSource = [];

    var Layer = null;
    var AreaID = null;

    this.getNoOfWaterBodies = function(waterBodyCategory) {
        if (Data_NoOfWaterBodies == null || Data_NoOfWaterBodies.length == 0)
            return 0;

        var total = 0;
        for (var i = 0; i < Data_NoOfWaterBodies.length; i++) {
            if (Data_NoOfWaterBodies[i].Key == waterBodyCategory)
                return Data_NoOfWaterBodies[i].Value;
            total += Data_NoOfWaterBodies[i].Value
        }
        if (waterBodyCategory != "ALL")
            return 0
        else
            return total;
    }

    this.getSizeOfWaterBodiesText = function(waterBodyCategory) {
        if (Data_SizeOfWaterBodies == null || Data_SizeOfWaterBodies.length == 0)
            return "";

        for (var i = 0; i < Data_SizeOfWaterBodies.length; i++) {
            if (Data_SizeOfWaterBodies[i].Key == waterBodyCategory && waterBodyCategory == "R")
                return Math.round(Data_SizeOfWaterBodies[i].Value * 100) / 100 + " km";
            else if (Data_SizeOfWaterBodies[i].Key == waterBodyCategory)
                return Math.round(Data_SizeOfWaterBodies[i].Value * 100) / 100 + " km<sup>2</sup>";
        }
        return "";
    }

    this.getNoOfHMWBWaterBodies = function(waterBodyCategory) {
        if (Data_NoOfHMWBWaterBodies == null || Data_NoOfHMWBWaterBodies.length == 0)
            return 0;

        var total = 0;
        for (var i = 0; i < Data_NoOfHMWBWaterBodies.length; i++) {
            if (Data_NoOfHMWBWaterBodies[i].Key == waterBodyCategory)
                return Data_NoOfHMWBWaterBodies[i].Value;
            total += Data_NoOfHMWBWaterBodies[i].Value
        }
        if (waterBodyCategory != "ALL")
            return 0
        else
            return total;
    }


    this.getSumStatus = function(waterBodyCategory, statusID) {
        if (Data_SumStatus == null || Data_SumStatus.length == 0)
            return 0;

        var total = 0;
        for (var i = 0; i < Data_SumStatus.length; i++) {
            if (waterBodyCategory != "ALL") {
                if (Data_SumStatus[i].WaterBodyCategoryID == waterBodyCategory &&
                                Data_SumStatus[i].StatusID == statusID)
                    total += Data_SumStatus[i].NoOfWaterBodies;
            }
            else {
                if (Data_SumStatus[i].StatusID == statusID)
                    total += Data_SumStatus[i].NoOfWaterBodies;
            }
        }
        return total;
    }

    this.getSumStatusSize = function(waterBodyCategory, statusID) {
        if (Data_SumStatus == null || Data_SumStatus.length == 0 || waterBodyCategory == "ALL")
            return -1;

        var total = 0;
        for (var i = 0; i < Data_SumStatus.length; i++) {
            if (waterBodyCategory != "ALL") {
                if (Data_SumStatus[i].WaterBodyCategoryID == waterBodyCategory &&
                                Data_SumStatus[i].StatusID == statusID)
                    total += Data_SumStatus[i].SizeOfWaterBodies;
            }
        }
        return Math.round(total * 100) / 100;
    }

    this.getSizeText = function(waterBodyCategory, size) {
        var sizeText = "";
        if (waterBodyCategory != "ALL") {
            if (waterBodyCategory == "R")
                sizeText = "Lengde: " + size + " km";
            else
                sizeText = "Areal: " + size + " km<sup>2</sup>";
        }
        return sizeText;
    }



    this.getRisk = function(waterBodyCategory, statusID) {
        if (Data_Risk == null || Data_Risk.length == 0)
            return 0;

        var total = 0;
        for (var i = 0; i < Data_Risk.length; i++) {
            if (waterBodyCategory != "ALL") {
                if (Data_Risk[i].WaterBodyCategoryID == waterBodyCategory &&
                                Data_Risk[i].StatusID == statusID)
                    total += Data_Risk[i].NoOfWaterBodies;
            }
            else {
                if (Data_Risk[i].StatusID == statusID)
                    total += Data_Risk[i].NoOfWaterBodies;
            }
        }
        return total;
    }

    this.getRiskSize = function(waterBodyCategory, statusID) {
        if (Data_Risk == null || Data_Risk.length == 0 || waterBodyCategory == "ALL")
            return -1;

        var total = 0;
        for (var i = 0; i < Data_Risk.length; i++) {
            if (waterBodyCategory != "ALL") {
                if (Data_Risk[i].WaterBodyCategoryID == waterBodyCategory &&
                                Data_Risk[i].StatusID == statusID)
                    total += Data_Risk[i].SizeOfWaterBodies;
            }
        }
        return Math.round(total * 100) / 100;
    }





    this.close = function() {
        map.graphics.clear();
        //this.reset();
    }

    this.reset = function() {
        dojo.byId("statisticsCountTableLoader").style.display = "inline";
        dojo.byId("statisticsCountTable").style.display = "none";
        dojo.byId("statisticsSumStatusLoader").style.display = "inline";
        dojo.byId("statisticsSumStatus").style.display = "none";
        dojo.byId("statisticsRiskLoader").style.display = "inline";
        dojo.byId("statisticsRisk").style.display = "none";
        dojo.byId("statisticsPressureLoader").style.display = "inline";
        dojo.byId("statisticsPressure").style.display = "none";
        dojo.byId("statisticsHMWBLoader").style.display = "inline";
        dojo.byId("statisticsHMWB").style.display = "none";
        dojo.byId("statisticsHMWB2008Loader").style.display = "inline";
        dojo.byId("statisticsHMWB2008").style.display = "none";

        showStatisticsTab('Characterization');

        var statisticsCharacterizationTabContent = dojo.byId('statisticsCharacterizationTabContent');
        var statisticsPressureTabContent = dojo.byId('statisticsPressureTabContent');
        var statisticsHMWBTabContent = dojo.byId('statisticsHMWBTabContent');
        var statisticsHMWB2008TabContent = dojo.byId('statisticsHMWB2008TabContent');
        statisticsCharacterizationTabContent.style.display = 'block';
        statisticsPressureTabContent.style.display = 'block';
        statisticsHMWBTabContent.style.display = 'block';
        statisticsHMWB2008TabContent.style.display = 'block';
        
        var statisticsAreaDialog = dojo.byId('statisticsAreaDialog');
        var selects = statisticsAreaDialog.getElementsByTagName('select');
        for (var i = 0; i < selects.length; i++) {
            selects[i].selectedIndex = 0;
        }
    }

    this.getStatisticsHeading = function(layerName, id) {
        //var statisticsTabContainer = dijit.byId('statisticsTabContainer');
        //statisticsTabContainer.selectChild(dijit.byId('statisticsMainTab'));

        if (_lastStatisticsLayerName == layerName && _lastStatisticsId == id) {
            dijit.byId("statisticsAreaDialog").show();
            return;
        }
        else {
            myStatistics.reset();
            dijit.byId("statisticsAreaDialog").show();
        }

        Layer = _lastStatisticsLayerName = layerName;
        AreaID = _lastStatisticsId = id;



        dojo.byId('statisticsHeader').innerHTML = layerName;
        var query = new esri.tasks.Query();
        query.returnGeometry = false;
        switch (layerName) {
            case layerNameMunicipality:
                query.where = "komm = '" + id + "'";
                query.outFields = ['NAVN', 'AREALKM2'];
                break;
            case layerNameSubUnit:
                query.where = "ms_cd = '" + id + "'";
                query.outFields = ['NAME', 'AREALKM2'];
                break;
            case layerNameRiverBasinDistrict:
                query.where = "ms_cd = '" + id + "'";
                query.outFields = ['NAME', 'AREALKM2'];
                break;
            case layerNameCompetentAuthority:
                query.where = "ms_cd = '" + id + "'";
                query.outFields = ['NAME', 'AREALKM2'];
                break;
            case layerNameCounty:
                query.where = "ms_cd = '" + id + "'";
                query.outFields = ['NAME', 'AREALKM2'];
                break;
        }

        var layerIds = getLayerStateManagerSingleton().getAreaLayer().visibleLayers;
        if (layerIds && layerIds.length == 0) {//Hele Norge. Vis statistikk direkte
            dijit.byId("statisticsAreaDialog").show();
            dojo.byId('statisticsHeaderName').innerHTML = layerName;
            dojo.byId('statisticsArea').innerHTML = 323782;
            myStatistics.getStatisticsMain(Layer, AreaID);
        }
        else {
            var queryUrl = administrativeMapServiceURL + '/' + layerIds[0];
            var queryTask = new esri.tasks.QueryTask(queryUrl);
            queryTask.execute(query, this.setStatisticsHeading);
        }


    }


    this.setStatisticsHeading = function(result) {
        var error = false;
        if (result.features.length > 0) {
            if (typeof (result.features[0].attributes.NAME) !== 'undefined')
                dojo.byId('statisticsHeaderName').innerHTML = result.features[0].attributes.NAME;
            else if (typeof (result.features[0].attributes.NAVN) !== 'undefined')
                dojo.byId('statisticsHeaderName').innerHTML = result.features[0].attributes.NAVN;
            else if (typeof (result.features[0].attributes.NAVNVASSOMR) !== 'undefined')
                dojo.byId('statisticsHeaderName').innerHTML = result.features[0].attributes.NAVNVASSOMR;
            else {
                error = true;
            }
            if (typeof (result.features[0].attributes.AREALKM2) !== 'undefined')
                dojo.byId('statisticsArea').innerHTML = Math.round(result.features[0].attributes.AREALKM2);
            else if (typeof (result.features[0].attributes.AREAL_KM2) !== 'undefined')
                dojo.byId('statisticsArea').innerHTML = Math.round(result.features[0].attributes.AREAL_KM2);
            else {
                dojo.byId('statisticsArea').innerHTML = 0;
            }
        } else
            error = true;

        if (error) {
            alert('Kunne ikke finne data for område.');
        } else {


            myStatistics.getStatisticsMain(Layer, AreaID);
        }
    }


    this.getStatisticsMain = function(layerName, id) {

        var urlNoOfWaterBodies = vnServiceURL + "getStatisticsNoOfWaterBodies?";
        var urlHMWB = vnServiceURL + "getStatisticsHMWB?languageID=" + currentLanguage + "&"
        var urlSumStatus = vnServiceURL + "getStatisticsSumStatus?";
        var urlRisk = vnServiceURL + "getStatisticsRisk?";
        var urlPressure = vnServiceURL + "getStatisticsPressure?languageID=" + currentLanguage + "&";
        switch (layerName) {
            case layerNameMunicipality:
                urlNoOfWaterBodies = urlNoOfWaterBodies + "municipalityID=" + id;
                urlHMWB = urlHMWB + "municipalityID=" + id;
                urlSumStatus = urlSumStatus + "municipalityID=" + id;
                urlRisk = urlRisk + "municipalityID=" + id;
                urlPressure = urlPressure + "municipalityID=" + id;
                break;
            case layerNameSubUnit:
                urlNoOfWaterBodies = urlNoOfWaterBodies + "MS_SubUnitCode=" + id;
                urlHMWB = urlHMWB + "MS_SubUnitCode=" + id;
                urlSumStatus = urlSumStatus + "MS_SubUnitCode=" + id;
                urlRisk = urlRisk + "MS_SubUnitCode=" + id;
                urlPressure = urlPressure + "MS_SubUnitCode=" + id;
                break;
            case layerNameRiverBasinDistrict:
                urlNoOfWaterBodies = urlNoOfWaterBodies + "riverBasinDistrictID=" + id;
                urlHMWB = urlHMWB + "riverBasinDistrictID=" + id;
                urlSumStatus = urlSumStatus + "riverBasinDistrictID=" + id;
                urlRisk = urlRisk + "riverBasinDistrictID=" + id;
                urlPressure = urlPressure + "riverBasinDistrictID=" + id;
                break;
            case layerNameCompetentAuthority:
                urlNoOfWaterBodies = urlNoOfWaterBodies + "competentAuthorityID=" + id;
                urlHMWB = urlHMWB + "competentAuthorityID=" + id;
                urlSumStatus = urlSumStatus + "competentAuthorityID=" + id;
                urlRisk = urlRisk + "competentAuthorityID=" + id;
                urlPressure = urlPressure + "competentAuthorityID=" + id;
                break;
            case layerNameCounty:
                urlNoOfWaterBodies = urlNoOfWaterBodies + "countyID=" + id;
                urlHMWB = urlHMWB + "countyID=" + id;
                urlSumStatus = urlSumStatus + "countyID=" + id;
                urlRisk = urlRisk + "countyID=" + id;
                urlPressure = urlPressure + "countyID=" + id;
                break;
        }
        dojo.xhrGet({ url: urlNoOfWaterBodies, load: myStatistics.onNoOfWaterBodies, error: errorFunction, handleAs: "json" });
        dojo.xhrGet({ url: urlSumStatus, load: myStatistics.onSumStatus, error: errorFunction, handleAs: "json" });
        dojo.xhrGet({ url: urlRisk, load: myStatistics.onRisk, error: errorFunction, handleAs: "json" });
        this.delayedXhr(urlPressure, "myStatistics.onPressure", "errorFunction", 0);
        this.delayedXhr(urlHMWB, "myStatistics.onHMWB", "errorFunction", 0);
        this.delayedXhr(urlHMWB.replace("getStatisticsHMWB", "getStatisticsHMWB2008"), "myStatistics.onHMWB2008", "errorFunction", 0);
    }

    this.delayedXhr = function(url, onLoad, onError, delay) {
        //var xhr = 'dojo.xhrGet({ url: "' + url + '", load: ' + onLoad + ', error: ' + onError + ', handleAs: "json" });'
        setTimeout('dojo.xhrGet({ url: "' + url + '", load: ' + onLoad + ', error: ' + onError + ', handleAs: "json" });', delay);
    }

    this.onNoOfWaterBodies = function(result) {
        Data_NoOfWaterBodies = result.NoOfWaterBodies;
        Data_SizeOfWaterBodies = result.SizeOfWaterBodies;
        myStatistics.showNoOfWaterBodies();
    }


    this.onSumStatus = function(result) {
        Data_SumStatus = result.CalculatedSumStatus;
        myStatistics.showSumStatus("ALL");
    };


    this.onRisk = function(result) {
        Data_Risk = result.Risk;
        myStatistics.showRisk("ALL");
    };


    this.onHMWB = function(result) {
        Data_HMWBs = result.HMWBs;
        myStatistics.buildHMWBGroupSelect();
        myStatistics.showHMWB(-1, "ALL");
    };

    this.onHMWB2008 = function(result) {
        Data_HMWB2008s = result.HMWB2008s;
        myStatistics.buildHMWB2008GroupSelect();
        myStatistics.showHMWB2008(-1, "ALL");
    };

    this.onPressure = function(result) {
        Data_Pressures = result.Pressures;
        myStatistics.buildPressureGroupSelect();
        myStatistics.showPressure(-1, "ALL");
    };

    this.showNoOfWaterBodies = function() {
        dojo.byId("countLake").innerHTML = myStatistics.getNoOfWaterBodies("L");
        dojo.byId("countRiver").innerHTML = myStatistics.getNoOfWaterBodies("R");
        dojo.byId("countCoastal").innerHTML = myStatistics.getNoOfWaterBodies("C");
        dojo.byId("countGroundWater").innerHTML = myStatistics.getNoOfWaterBodies("G");
        dojo.byId("countTransitional").innerHTML = myStatistics.getNoOfWaterBodies("T");
        dojo.byId("countSum").innerHTML = myStatistics.getNoOfWaterBodies("ALL");

        dojo.byId("sizeLake").innerHTML = myStatistics.getSizeOfWaterBodiesText("L");
        dojo.byId("sizeRiver").innerHTML = myStatistics.getSizeOfWaterBodiesText("R");
        dojo.byId("sizeCoastal").innerHTML = myStatistics.getSizeOfWaterBodiesText("C");
        dojo.byId("sizeGroundWater").innerHTML = myStatistics.getSizeOfWaterBodiesText("G");
        dojo.byId("sizeTransitional").innerHTML = myStatistics.getSizeOfWaterBodiesText("T");

        dojo.byId("statisticsCountTableLoader").style.display = "none";
        dojo.byId("statisticsCountTable").style.display = "";
    }


    this.showSumStatus = function(waterBodyCategory) {
        dojo.byId("statisticsSumStatusLoader").style.display = "none";
        dojo.byId("statisticsSumStatus").style.display = "block";

        var wbCategorySelect = dojo.byId('statisticsSumStatusSelect');
        if (wbCategorySelect)
            waterBodyCategory = wbCategorySelect.options[wbCategorySelect.selectedIndex].value;

        var noOfHigh = myStatistics.getSumStatus(waterBodyCategory, "1_High");
        var noOfGood = myStatistics.getSumStatus(waterBodyCategory, "2_Good");
        var noOfModerate = myStatistics.getSumStatus(waterBodyCategory, "3_Moderate");
        var noOfPoor = myStatistics.getSumStatus(waterBodyCategory, "4_Poor");
        var noOfBad = myStatistics.getSumStatus(waterBodyCategory, "5_Bad");
        var noOfUnclassified = myStatistics.getSumStatus(waterBodyCategory, "U_Unclassified");

        var sizeOfHigh = myStatistics.getSizeText(waterBodyCategory, myStatistics.getSumStatusSize(waterBodyCategory, "1_High"));
        var sizeOfGood = myStatistics.getSizeText(waterBodyCategory, myStatistics.getSumStatusSize(waterBodyCategory, "2_Good"));
        var sizeOfModerate = myStatistics.getSizeText(waterBodyCategory, myStatistics.getSumStatusSize(waterBodyCategory, "3_Moderate"));
        var sizeOfPoor = myStatistics.getSizeText(waterBodyCategory, myStatistics.getSumStatusSize(waterBodyCategory, "4_Poor"));
        var sizeOfBad = myStatistics.getSizeText(waterBodyCategory, myStatistics.getSumStatusSize(waterBodyCategory, "5_Bad"));
        var sizeOfUnclassified = myStatistics.getSizeText(waterBodyCategory, myStatistics.getSumStatusSize(waterBodyCategory, "U_Unclassified"));

        var totalNoOfWaterBodies = noOfHigh + noOfGood + noOfModerate + noOfPoor + noOfBad + noOfUnclassified;

        var dc = dojox.charting;
        dojo.byId("chartSumStatus").innerHTML = "";

        if (Data_SumStatus.length > 0) {
            var chartSumStatus = new dc.Chart2D("chartSumStatus");
            chartSumStatus.setTheme(dc.themes.MiamiNice)
                         .addPlot("default", {
                             type: "Pie",
                             font: "normal normal 11pt Tahoma",
                             fontColor: "black",
                             labelOffset: -30,
                             radius: 70
                         }).addSeries("Tilstand", [
                          { y: noOfHigh, text: myStatistics.getPercentString(noOfHigh, totalNoOfWaterBodies), legend: "Svært god", color: "#5fffff", stroke: "black", tooltip: "Antall: " + noOfHigh + "<br/>" + sizeOfHigh },
                          { y: noOfGood, text: myStatistics.getPercentString(noOfGood, totalNoOfWaterBodies), legend: "God", color: "#5dff5d", stroke: "black", tooltip: "Antall: " + noOfGood + "<br/>" + sizeOfGood },
                          { y: noOfModerate, text: myStatistics.getPercentString(noOfModerate, totalNoOfWaterBodies), legend: "Moderat", color: "#fefe58", stroke: "black", tooltip: "Antall: " + noOfModerate + "<br/>" + sizeOfModerate },
                          { y: noOfPoor, text: myStatistics.getPercentString(noOfPoor, totalNoOfWaterBodies), legend: "Dårlig", color: "#ffbb55", stroke: "black", tooltip: "Antall: " + noOfPoor + "<br/>" + sizeOfPoor },
                          { y: noOfBad, text: myStatistics.getPercentString(noOfBad, totalNoOfWaterBodies), legend: "Svært dårlig", color: "#fe5d5d", stroke: "black", tooltip: "Antall: " + noOfBad + "<br/>" + sizeOfBad },
                          { y: noOfUnclassified, text: myStatistics.getPercentString(noOfUnclassified, totalNoOfWaterBodies), legend: "Udefinert", color: "gray", stroke: "black", tooltip: "Antall: " + noOfUnclassified + "<br/>" + sizeOfUnclassified }

                      ]);
            var anim_a = new dc.action2d.MoveSlice(chartSumStatus, "default");
            var anim_b = new dc.action2d.Highlight(chartSumStatus, "default", {
                highlight: "#FF1CD9"
            });
            var anim_c = new dc.action2d.Tooltip(chartSumStatus, "default");
            chartSumStatus.render();
        }
    };





    this.showRisk = function(waterBodyCategory) {
        dojo.byId("statisticsRiskLoader").style.display = "none";
        dojo.byId("statisticsRisk").style.display = "inline";
        var statisticsRiskLegendCell = dojo.byId('statisticsRiskLegendCell');

        var wbCategorySelect = dojo.byId('statisticsRiskSelect');
        if (wbCategorySelect)
            waterBodyCategory = wbCategorySelect.options[wbCategorySelect.selectedIndex].value;




        removeLegend('legendRisk');
        var div = document.createElement("div");
        div.id = 'legendRisk';
        statisticsRiskLegendCell.appendChild(div);
        dojo.byId("chartRisk").innerHTML = "";

        if (Data_Risk.length > 0) {


            var noOfYes = myStatistics.getRisk(waterBodyCategory, "RiskYes");
            var noOfPossible = myStatistics.getRisk(waterBodyCategory, "RiskPossible");
            var noOfNo = myStatistics.getRisk(waterBodyCategory, "RiskNo");
            var noOfUndefined = myStatistics.getRisk(waterBodyCategory, "RiskUndefined");

            var sizeOfYes = myStatistics.getSizeText(waterBodyCategory, myStatistics.getRiskSize(waterBodyCategory, "RiskYes"));
            var sizeOfPossible = myStatistics.getSizeText(waterBodyCategory, myStatistics.getRiskSize(waterBodyCategory, "RiskPossible"));
            var sizeOfNo = myStatistics.getSizeText(waterBodyCategory, myStatistics.getRiskSize(waterBodyCategory, "RiskNo"));
            var sizeOfUndefined = myStatistics.getSizeText(waterBodyCategory, myStatistics.getRiskSize(waterBodyCategory, "RiskUndefined"));

            var totalNoOfWaterBodies = noOfYes + noOfPossible + noOfNo + noOfUndefined;

            var dc = dojox.charting;

            var chartRisk = new dc.Chart2D("chartRisk");

            chartRisk.setTheme(dc.themes.MiamiNice)
                         .addPlot("default", {
                             type: "Pie",
                             font: "normal normal 11pt Tahoma",
                             fontColor: "black",
                             labelOffset: -30,
                             radius: 70
                         }).addSeries("Tilstand", [
                          { y: noOfYes, text: myStatistics.getPercentString(noOfYes, totalNoOfWaterBodies), legend: "Risiko", color: "#F91616", stroke: "black", tooltip: "Antall: " + noOfYes + "<br/>" + sizeOfYes },
                          { y: noOfPossible, text: myStatistics.getPercentString(noOfPossible, totalNoOfWaterBodies), legend: "Mulig risiko", color: "#FC9D15", stroke: "black", tooltip: "Antall: " + noOfPossible + "<br/>" + sizeOfPossible },
                          { y: noOfNo, text: myStatistics.getPercentString(noOfNo, totalNoOfWaterBodies), legend: "Ingen risiko", color: "#147915", stroke: "black", tooltip: "Antall: " + noOfNo + "<br/>" + sizeOfNo },
                          { y: noOfUndefined, text: myStatistics.getPercentString(noOfUndefined, totalNoOfWaterBodies), legend: "Uspesifisert", color: "#828383", stroke: "black", tooltip: "Antall: " + noOfUndefined + "<br/>" + sizeOfUndefined }
                      ]);
            var anim_a = new dc.action2d.MoveSlice(chartRisk, "default");
            var anim_b = new dc.action2d.Highlight(chartRisk, "default", {
                highlight: "#FF1CD9"
            });
            var anim_c = new dc.action2d.Tooltip(chartRisk, "default");

            chartRisk.render();
            try {
                var legendRisk = new dojox.charting.widget.Legend({ chart: chartRisk, horizontal: false }, "legendRisk");
            } catch (e) { }
        }
    };

    this.showPressure = function(group, waterBodyCategory) {
        var groupSelect = dojo.byId('statisticsPressureToolbarSelectGroup');
        var wbCategorySelect = dojo.byId('statisticsPressureToolbarSelectWaterBodyCategory');

        if (groupSelect)
            group = groupSelect.options[groupSelect.selectedIndex].value;
        if (wbCategorySelect)
            waterBodyCategory = wbCategorySelect.options[wbCategorySelect.selectedIndex].value;

        dojo.byId("statisticsPressureLoader").style.display = "none";
        var statisticsPressure = dojo.byId("statisticsPressure");
        statisticsPressure.style.display = "";

        removeLegend('statisticsPressureChartLegend');

        var div = document.createElement("div");
        div.id = 'statisticsPressureChartLegend';
        statisticsPressure.appendChild(div);

        var max = myStatistics.buildPressureDataSource(group, waterBodyCategory);

        dojo.byId("statisticsPressureChart").innerHTML = "";
        if (Data_PressuresDataSource.length > 0) {

            var chartLabels = [];
            for (var i = 0; i < Data_PressuresDataSource.length; i++) {
                chartLabels.push({ value: i + 1, text: Data_PressuresDataSource[i].groupName });
            }
            var notSet = getPressuresForExtent(0);
            var low = getPressuresForExtent(1);
            var medium = getPressuresForExtent(2);
            var high = getPressuresForExtent(3);

            var chart4 = new dojox.charting.Chart2D("statisticsPressureChart");
            chart4.setTheme(dojox.charting.themes.MiamiNice);
            chart4.addAxis("x", {
                includeZero: true,
                max: max,
                natural: true,
                majorLabels: true,
                minorLabels: false,
                minorTics: false,
                microLabels: false,
                microTics: false
            });
            chart4.addAxis("y", {
                vertical: true,
                natural: true,
                labels: chartLabels,
                majorLabels: true,
                minorLabels: true,
                minorTics: false,
                microLabels: false,
                microTics: false
            });
            //chart4.addAxis("y", { vertical: true, fixLower: "major", fixUpper: "major", natural: true });
            chart4.addPlot("default", {
                type: "ClusteredBars",
                font: "normal normal 11pt Tahoma",
                fontColor: "black",
                gap: 4,
                hMajorLines: false,
                hMinorLines: false,
                vMajorLines: false,
                vMinorLines: false
            });
            chart4.addSeries("Ikke satt", notSet, { fill: "#828383", stroke: { color: "black"} });
            chart4.addSeries("Lite", low, { fill: "#69F729", stroke: { color: "black"} });
            chart4.addSeries("Moderat", medium, { fill: "#F7F92B", stroke: { color: "black"} });
            chart4.addSeries("Mye", high, { fill: "#F6292A", stroke: { color: "black"} });
            var anim4a = new dojox.charting.action2d.Highlight(chart4, "default", {
                highlight: "#FF1CD9"
            });
            var anim4b = new dojox.charting.action2d.Tooltip(chart4, "default");
            chart4.render();
            var legend4 = new dojox.charting.widget.Legend({ chart: chart4 }, "statisticsPressureChartLegend");
        }
    };


    this.showHMWB = function(group, waterBodyCategory) {
        var groupSelect = dojo.byId('statisticsHMWBToolbarSelectGroup');
        var wbCategorySelect = dojo.byId('statisticsHMWBToolbarSelectWaterBodyCategory');

        if (groupSelect)
            group = groupSelect.options[groupSelect.selectedIndex].value;
        if (wbCategorySelect)
            waterBodyCategory = wbCategorySelect.options[wbCategorySelect.selectedIndex].value;

        dojo.byId("statisticsHMWBLoader").style.display = "none";
        var statisticsHMWB = dojo.byId("statisticsHMWB");
        statisticsHMWB.style.display = "";

        removeLegend('statisticsHMWBChartLegend');

        var div = document.createElement("div");
        div.id = 'statisticsHMWBChartLegend';
        statisticsHMWB.appendChild(div);

        var max = myStatistics.buildHMWBDataSource(group, waterBodyCategory);

        dojo.byId("statisticsHMWBChart").innerHTML = "";
        if (Data_HMWBDataSource.length > 0) {

            var chartLabels = [];
            for (var i = 0; i < Data_HMWBDataSource.length; i++) {
                chartLabels.push({ value: i + 1, text: Data_HMWBDataSource[i].groupName });
            }
            var isCandidate = getHMWBsStatus(0);
            var isHMWB = getHMWBsStatus(1);

            var chart4 = new dojox.charting.Chart2D("statisticsHMWBChart");
            chart4.setTheme(dojox.charting.themes.MiamiNice);
            chart4.addAxis("x", {
                includeZero: true,
                max: max,
                natural: true,
                majorLabels: true,
                minorLabels: false,
                minorTics: false,
                microLabels: false,
                microTics: false
            });
            chart4.addAxis("y", {
                vertical: true,
                natural: true,
                labels: chartLabels,
                majorLabels: true,
                minorLabels: false,
                minorTics: false,
                microLabels: false,
                microTics: false
            });
            //chart4.addAxis("y", { vertical: true, fixLower: "major", fixUpper: "major", natural: true });
            chart4.addPlot("default", {
                type: "ClusteredBars",
                font: "normal normal 11pt Tahoma",
                fontColor: "black",
                gap: 4,
                hMajorLines: false,
                hMinorLines: false,
                vMajorLines: false,
                vMinorLines: false
            });
            chart4.addSeries("Kandidat til SMVF", isCandidate, { fill: "#FC9D15", stroke: { color: "black"} });
            chart4.addSeries("Endelig SMVF", isHMWB, { fill: "#F91616", stroke: { color: "black"} });
            var anim4a = new dojox.charting.action2d.Highlight(chart4, "default", {
                highlight: "#FF1CD9"
            });
            var anim4b = new dojox.charting.action2d.Tooltip(chart4, "default");
            chart4.render();
            var legend4 = new dojox.charting.widget.Legend({ chart: chart4 }, "statisticsHMWBChartLegend");
        }
    };

    this.showHMWB2008 = function(group, waterBodyCategory) {
        var groupSelect = dojo.byId('statisticsHMWB2008ToolbarSelectGroup');
        var wbCategorySelect = dojo.byId('statisticsHMWB2008ToolbarSelectWaterBodyCategory');

        if (groupSelect)
            group = groupSelect.options[groupSelect.selectedIndex].value;
        if (wbCategorySelect)
            waterBodyCategory = wbCategorySelect.options[wbCategorySelect.selectedIndex].value;

        dojo.byId("statisticsHMWB2008Loader").style.display = "none";
        var statisticsHMWB2008 = dojo.byId("statisticsHMWB2008");
        statisticsHMWB2008.style.display = "";

        removeLegend('statisticsHMWB2008ChartLegend');

        var div = document.createElement("div");
        div.id = 'statisticsHMWB2008ChartLegend';
        statisticsHMWB2008.appendChild(div);

        var max = myStatistics.buildHMWB2008DataSource(group, waterBodyCategory);

        dojo.byId("statisticsHMWB2008Chart").innerHTML = "";
        if (Data_HMWB2008DataSource.length > 0) {

            var chartLabels = [];
            for (var i = 0; i < Data_HMWB2008DataSource.length; i++) {
                chartLabels.push({ value: i + 1, text: Data_HMWB2008DataSource[i].groupName });
            }
            var isCandidate = getHMWB2008sStatus(0);
            var isHMWB = getHMWB2008sStatus(1);

            var chart4 = new dojox.charting.Chart2D("statisticsHMWB2008Chart");
            chart4.setTheme(dojox.charting.themes.MiamiNice);
            chart4.addAxis("x", {
                includeZero: true,
                max: max,
                natural: true,
                majorLabels: true,
                minorLabels: false,
                minorTics: false,
                microLabels: false,
                microTics: false
            });
            chart4.addAxis("y", {
                vertical: true,
                natural: true,
                labels: chartLabels,
                majorLabels: true,
                minorLabels: false,
                minorTics: false,
                microLabels: false,
                microTics: false
            });
            //chart4.addAxis("y", { vertical: true, fixLower: "major", fixUpper: "major", natural: true });
            chart4.addPlot("default", {
                type: "ClusteredBars",
                font: "normal normal 11pt Tahoma",
                fontColor: "black",
                gap: 4,
                hMajorLines: false,
                hMinorLines: false,
                vMajorLines: false,
                vMinorLines: false
            });
            chart4.addSeries("Foreløpige kandidater (tom. 2008)", isCandidate, { fill: "#FC9D15", stroke: { color: "black"} });
            chart4.addSeries("", isHMWB, { fill: "#F91616", stroke: { color: "black"} });
            var anim4a = new dojox.charting.action2d.Highlight(chart4, "default", {
                highlight: "#FF1CD9"
            });
            var anim4b = new dojox.charting.action2d.Tooltip(chart4, "default");
            chart4.render();
            var legend4 = new dojox.charting.widget.Legend({ chart: chart4 }, "statisticsHMWB2008ChartLegend");
        }
    };


    var removeLegend = function(id) {

        var statisticsPressureChartLegend = dojo.byId(id);
        if (statisticsPressureChartLegend) {
            var parent = statisticsPressureChartLegend.parentNode;
            parent.removeChild(statisticsPressureChartLegend);
        }

        var statisticsPressureChartLegendDijit = dijit.byId(id);
        if (statisticsPressureChartLegendDijit)
            statisticsPressureChartLegendDijit.destroy();
    }


    this.buildPressureGroupSelect = function() {
        var groupSelect = dojo.byId('statisticsPressureToolbarSelectGroup');

        var selects = groupSelect.getElementsByTagName('option');
        var optionCount = selects.length;
        if (selects.length > 1) {
            for (var i = 1; i < optionCount; i++) {
                groupSelect.removeChild(selects[1]);
            }
        }
        var groupNumberString = '';
        if (Data_Pressures != null) {
            for (var i = 0; i < Data_Pressures.length; i++) {
                if (groupNumberString.indexOf(Data_Pressures[i].Group, 0) == -1) {
                    groupNumberString = groupNumberString + ';' + Data_Pressures[i].Group;
                    var option = document.createElement("option");
                    option.value = Data_Pressures[i].Group;
                    option.innerHTML = Data_Pressures[i].ParentPressureTypeName;
                    groupSelect.appendChild(option);
                }
            }
        }
    }

    this.buildPressureDataSource = function(group, waterBodyCategory) {
        Data_PressuresDataSource = [];
        if (Data_Pressures != null) {
            for (var i = 0; i < Data_Pressures.length; i++) {
                if (group == -1) {
                    if (waterBodyCategory == "ALL" || waterBodyCategory == Data_Pressures[i].WaterBodyCategoryID) {
                        addGroupValue(Data_Pressures[i].Group, Data_Pressures[i].ExtentID, Data_Pressures[i].NoOfWaterBodies, Data_Pressures[i].ParentPressureTypeName);
                    }
                }
                else if (Data_Pressures[i].Group == group) {
                    if (waterBodyCategory == "ALL" || waterBodyCategory == Data_Pressures[i].WaterBodyCategoryID) {
                        addPressureValue(Data_Pressures[i].PressureTypeID, Data_Pressures[i].PressureTypeName, Data_Pressures[i].ExtentID, Data_Pressures[i].NoOfWaterBodies);
                    }
                }
            }

            var higestNumber = 0
            for (var i = 0; i < Data_PressuresDataSource.length; i++) {
                if (Data_PressuresDataSource[i].values[0] > higestNumber)
                    higestNumber = Data_PressuresDataSource[i].values[0];
                if (Data_PressuresDataSource[i].values[1] > higestNumber)
                    higestNumber = Data_PressuresDataSource[i].values[1];
                if (Data_PressuresDataSource[i].values[2] > higestNumber)
                    higestNumber = Data_PressuresDataSource[i].values[2];
                if (Data_PressuresDataSource[i].values[3] > higestNumber)
                    higestNumber = Data_PressuresDataSource[i].values[3];
            }
            return higestNumber;
        }

    }

    var addGroupValue = function(group, extentID, count, groupName) {
        var found = false;
        for (var i = 0; i < Data_PressuresDataSource.length; i++) {
            if (Data_PressuresDataSource[i].group == group) {
                Data_PressuresDataSource[i].values[extentID] += count;
                found = true;
                break;
            }
        }

        if (!found) {
            var newGroup = { group: group, groupName: groupName, values: [0, 0, 0, 0] };
            newGroup.values[extentID] += count;
            Data_PressuresDataSource.push(newGroup);
        }
    }


    var addPressureValue = function(pressureTypeID, pressureTypeName, extentID, count) {
        var found = false;
        for (var i = 0; i < Data_PressuresDataSource.length; i++) {
            if (Data_PressuresDataSource[i].group == pressureTypeID) {
                Data_PressuresDataSource[i].values[extentID] += count;
                found = true;
                break;
            }
        }

        if (!found) {
            var newGroup = { group: pressureTypeID, groupName: pressureTypeName, values: [0, 0, 0, 0] };
            newGroup.values[extentID] += count;
            Data_PressuresDataSource.push(newGroup);
        }
    }

    var getPressuresForExtent = function(extendID) {
        if (Data_PressuresDataSource != null && Data_PressuresDataSource.length > 0) {
            var extentTable = [];
            for (var i = 0; i < Data_PressuresDataSource.length; i++) {
                extentTable.push(Data_PressuresDataSource[i].values[extendID]);
            }
            return extentTable;
        }
    }


    this.buildHMWBGroupSelect = function() {
        var groupSelect = dojo.byId('statisticsHMWBToolbarSelectGroup');

        var selects = groupSelect.getElementsByTagName('option');
        var optionCount = selects.length;
        if (selects.length > 1) {
            for (var i = 1; i < optionCount; i++) {
                groupSelect.removeChild(selects[1]);
            }
        }
        var groupNumberString = '';
        if (Data_HMWBs != null) {
            for (var i = 0; i < Data_HMWBs.length; i++) {
                if (groupNumberString.indexOf(Data_HMWBs[i].Group, 0) == -1) {
                    groupNumberString = groupNumberString + ';' + Data_HMWBs[i].Group;
                    var option = document.createElement("option");
                    option.value = Data_HMWBs[i].Group;
                    option.innerHTML = Data_HMWBs[i].ParentPressureTypeName;
                    groupSelect.appendChild(option);
                }
            }
        }
    }

    this.buildHMWB2008GroupSelect = function() {
        var groupSelect = dojo.byId('statisticsHMWB2008ToolbarSelectGroup');

        var selects = groupSelect.getElementsByTagName('option');
        var optionCount = selects.length;
        if (selects.length > 1) {
            for (var i = 1; i < optionCount; i++) {
                groupSelect.removeChild(selects[1]);
            }
        }
        var groupNumberString = '';
        if (Data_HMWB2008s != null) {
            for (var i = 0; i < Data_HMWB2008s.length; i++) {
                if (groupNumberString.indexOf(Data_HMWB2008s[i].Group, 0) == -1) {
                    groupNumberString = groupNumberString + ';' + Data_HMWB2008s[i].Group;
                    var option = document.createElement("option");
                    option.value = Data_HMWB2008s[i].Group;
                    option.innerHTML = Data_HMWB2008s[i].ParentPressureTypeName;
                    groupSelect.appendChild(option);
                }
            }
        }
    }

    this.buildHMWBDataSource = function(group, waterBodyCategory) {
        Data_HMWBDataSource = [];
        if (Data_HMWBs != null) {
            for (var i = 0; i < Data_HMWBs.length; i++) {
                if (group == -1) {
                    if (waterBodyCategory == "ALL" || waterBodyCategory == Data_HMWBs[i].WaterBodyCategoryID) {
                        addHMWBGroupValue(Data_HMWBs[i].Group, Data_HMWBs[i].IsHMWB, Data_HMWBs[i].NoOfWaterBodies, Data_HMWBs[i].ParentPressureTypeName);
                    }
                }
                else if (Data_HMWBs[i].Group == group) {
                    if (waterBodyCategory == "ALL" || waterBodyCategory == Data_HMWBs[i].WaterBodyCategoryID) {
                        addHMWBValue(Data_HMWBs[i].PressureTypeID, Data_HMWBs[i].PressureTypeName, Data_HMWBs[i].IsHMWB, Data_HMWBs[i].NoOfWaterBodies);
                    }
                }
            }

            var higestNumber = 0
            for (var i = 0; i < Data_HMWBDataSource.length; i++) {
                if (Data_HMWBDataSource[i].values[0] > higestNumber)
                    higestNumber = Data_HMWBDataSource[i].values[0];
                if (Data_HMWBDataSource[i].values[1] > higestNumber)
                    higestNumber = Data_HMWBDataSource[i].values[1];
                if (Data_HMWBDataSource[i].values[2] > higestNumber)
                    higestNumber = Data_HMWBDataSource[i].values[2];
                if (Data_HMWBDataSource[i].values[3] > higestNumber)
                    higestNumber = Data_HMWBDataSource[i].values[3];
            }
            return higestNumber;
        }

    }

    this.buildHMWB2008DataSource = function(group, waterBodyCategory) {
        Data_HMWB2008DataSource = [];
        if (Data_HMWB2008s != null) {
            for (var i = 0; i < Data_HMWB2008s.length; i++) {
                if (group == -1) {
                    if (waterBodyCategory == "ALL" || waterBodyCategory == Data_HMWB2008s[i].WaterBodyCategoryID) {
                        addHMWB2008GroupValue(Data_HMWB2008s[i].Group, Data_HMWB2008s[i].IsHMWB, Data_HMWB2008s[i].NoOfWaterBodies, Data_HMWB2008s[i].ParentPressureTypeName);
                    }
                }
                else if (Data_HMWB2008s[i].Group == group) {
                    if (waterBodyCategory == "ALL" || waterBodyCategory == Data_HMWB2008s[i].WaterBodyCategoryID) {
                        addHMWB2008Value(Data_HMWB2008s[i].PressureTypeID, Data_HMWB2008s[i].PressureTypeName, Data_HMWB2008s[i].IsHMWB, Data_HMWB2008s[i].NoOfWaterBodies);
                    }
                }
            }

            var higestNumber = 0
            for (var i = 0; i < Data_HMWB2008DataSource.length; i++) {
                if (Data_HMWB2008DataSource[i].values[0] > higestNumber)
                    higestNumber = Data_HMWB2008DataSource[i].values[0];
                if (Data_HMWB2008DataSource[i].values[1] > higestNumber)
                    higestNumber = Data_HMWB2008DataSource[i].values[1];
                if (Data_HMWB2008DataSource[i].values[2] > higestNumber)
                    higestNumber = Data_HMWB2008DataSource[i].values[2];
                if (Data_HMWB2008DataSource[i].values[3] > higestNumber)
                    higestNumber = Data_HMWB2008DataSource[i].values[3];
            }
            return higestNumber;
        }

    }


    var addHMWBGroupValue = function(group, isHMWB, count, groupName) {
        var found = false;
        for (var i = 0; i < Data_HMWBDataSource.length; i++) {
            if (Data_HMWBDataSource[i].group == group) {
                Data_HMWBDataSource[i].values[isHMWB] += count;
                found = true;
                break;
            }
        }

        if (!found) {
            var newGroup = { group: group, groupName: groupName, values: [0, 0] };
            newGroup.values[isHMWB] += count;
            Data_HMWBDataSource.push(newGroup);
        }
    }


    var addHMWB2008GroupValue = function(group, isHMWB, count, groupName) {
        var found = false;
        for (var i = 0; i < Data_HMWB2008DataSource.length; i++) {
            if (Data_HMWB2008DataSource[i].group == group) {
                Data_HMWB2008DataSource[i].values[isHMWB] += count;
                found = true;
                break;
            }
        }

        if (!found) {
            var newGroup = { group: group, groupName: groupName, values: [0, 0] };
            newGroup.values[isHMWB] += count;
            Data_HMWB2008DataSource.push(newGroup);
        }
    }

    var addHMWBValue = function(pressureTypeID, pressureTypeName, isHMWB, count) {
        var found = false;
        for (var i = 0; i < Data_HMWBDataSource.length; i++) {
            if (Data_HMWBDataSource[i].group == pressureTypeID) {
                Data_HMWBDataSource[i].values[isHMWB] += count;
                found = true;
                break;
            }
        }

        if (!found) {
            var newGroup = { group: pressureTypeID, groupName: pressureTypeName, values: [0, 0] };
            newGroup.values[isHMWB] += count;
            Data_HMWBDataSource.push(newGroup);
        }
    }

    var addHMWB2008Value = function(pressureTypeID, pressureTypeName, isHMWB, count) {
        var found = false;
        for (var i = 0; i < Data_HMWB2008DataSource.length; i++) {
            if (Data_HMWB2008DataSource[i].group == pressureTypeID) {
                Data_HMWB2008DataSource[i].values[isHMWB] += count;
                found = true;
                break;
            }
        }

        if (!found) {
            var newGroup = { group: pressureTypeID, groupName: pressureTypeName, values: [0, 0] };
            newGroup.values[isHMWB] += count;
            Data_HMWB2008DataSource.push(newGroup);
        }
    }

    var getHMWBsStatus = function(isHMWB) {
        if (Data_HMWBDataSource != null && Data_HMWBDataSource.length > 0) {
            var isHMWBTable = [];
            for (var i = 0; i < Data_HMWBDataSource.length; i++) {
                isHMWBTable.push(Data_HMWBDataSource[i].values[isHMWB]);
            }
            return isHMWBTable;
        }
    }

    var getHMWB2008sStatus = function(isHMWB) {
        if (Data_HMWB2008DataSource != null && Data_HMWB2008DataSource.length > 0) {
            var isHMWBTable = [];
            for (var i = 0; i < Data_HMWB2008DataSource.length; i++) {
                isHMWBTable.push(Data_HMWB2008DataSource[i].values[isHMWB]);
            }
            return isHMWBTable;
        }
    }

    this.getPercentString = function(no, total) {

        return Math.round(no * 1000 / total) / 10 + "%";
    }

}





function extentHistoryChangeHandler() {
    _enableZoomPrev = !mapNavigation.isFirstExtent();
    _enableZoomNext = !mapNavigation.isLastExtent();

    //    if (_enableZoomPrev) {
    //        dojo.byId('uxZoomPrev').src = 'images/backward.png';
    //    }
    //    else {
    //        dojo.byId('uxZoomPrev').src = 'images/backward_disabled.png';
    //    }

    //    if (_enableZoomNext) {
    //        dojo.byId('uxZoomNext').src = 'images/forward.png';
    //    }
    //    else {
    //        dojo.byId('uxZoomNext').src = 'images/forward_disabled.png';
    //    }
}

function onLengthsCompleteHandler(lengths) {
    dojo.byId('uxDebugInfo').innerHTML = lengths[0];
}




function showCoordinates(evt) {
    dojo.byId('uxXCoordinate').innerHTML = new String(evt.mapPoint.x).split('.')[0];
    dojo.byId('uxYCoordinate').innerHTML = new String(evt.mapPoint.y).split('.')[0];
}

function getTabDivs() {
    if (_tabDivs != null) return _tabDivs;
    _tabDivs = [dojo.byId('uxSelectArea'), dojo.byId('uxResponse'), dojo.byId('uxHelp'), dojo.byId('uxSearchResult')];
    return _tabDivs;
}


function resizeMap() {
    if (isMapLoaded()) {
        map.resize();
        map.reposition();
    }
}

var _expandCollapseHandler = null;

function showLeftPanel() {
    var leftPanel = dojo.byId('uxLeftContainer');
    leftPanel.style.display = "inline";

    var expandButton = dojo.byId('imgExpandCollapse');
    expandButton.src = 'images/collapse.png';
    if (_expandCollapseHandler != null) dojo.disconnect(_expandCollapseHandler);
    _expandCollapseHandler = dojo.connect(expandButton, "onclick", "hideLeftPanel");

    var leftContainerDiv = dojo.byId('uxLeftContainer');
    var mapDiv = dojo.byId('map1');
    var separatorDiv = dojo.byId('uxSeparator');
    var leftContainerDivCoords = dojo.coords(leftContainerDiv, false);
    var separatorDivCoords = dojo.coords(separatorDiv, false);
    var htmlWidth = parseInt(document.body.parentNode.clientWidth, 10);
    var mapWidthInPixels = htmlWidth - leftContainerDivCoords.w - separatorDivCoords.w - 10;
    mapDiv.style.width = mapWidthInPixels + 'px';

    if (isMapLoaded()) {
        window.setTimeout('resizeMap();', 100);
    }
}



function hideLeftPanel() {
    var leftPanel = dojo.byId('uxLeftContainer');
    leftPanel.style.display = "none";
    var expandButton = dojo.byId('imgExpandCollapse');
    expandButton.src = 'images/expand.png';
    if (_expandCollapseHandler != null) dojo.disconnect(_expandCollapseHandler);
    _expandCollapseHandler = dojo.connect(expandButton, "onclick", "showLeftPanel");

    var mapDiv = dojo.byId('map1');
    var htmlWidth = parseInt(document.body.parentNode.clientWidth, 10);
    var mapWidthInPixels = htmlWidth - 22;
    mapDiv.style.width = mapWidthInPixels + 'px';

    if (isMapLoaded())
        window.setTimeout('resizeMap();', 100);
}

function toggleLeftPanel(forceShow) {

    var htmlWidth = parseInt(document.body.parentNode.clientWidth, 10);
    var leftPanel = dojo.byId('uxLeftContainer');
    var map = dojo.byId('map1');
    var expandCollapseImg = dojo.byId('imgExpandCollapse');

    if (forceShow || leftPanel.style.display == 'none') {
        leftPanel.style.display = 'inline';
        map.style.width = (htmlWidth - 369 - 2) + 'px';
        expandCollapseImg.src = 'images/collapse.png';
    }
    else {
        leftPanel.style.display = 'none';
        map.style.width = htmlWidth + 'px';
        expandCollapseImg.src = 'images/expand.png';
    }
    resizeMap();
}


function adjustMapSizeHandler() {
    var htmlHeight = parseInt(document.body.parentNode.clientHeight, 10);
    var htmlWidth = parseInt(document.body.parentNode.clientWidth, 10);

    var leftPanel = dojo.byId('uxLeftContainer');
    var map = dojo.byId('map1');

    leftPanel.style.width = '365px';
    leftPanel.style.height = (htmlHeight - 55) + 'px';
    if (leftPanel.style.display == 'none')
        map.style.width = htmlWidth + 'px';
    else
        map.style.width = (htmlWidth - 369 - 2) + 'px';
    map.style.height = (htmlHeight - 55) + 'px';


    var tabDivs = getTabDivs();
    for (var i = 0; i < tabDivs.length; i++) {
        tabDivs[i].style.height = (htmlHeight - 95) + 'px';
    }

    resizeMap();

    var mapCoords = dojo.coords('map1');
    if (mapCoords.w < 985)
        slideMapMessageTo(45);
    else
        slideMapMessageTo(5);
}


var secondDlg;
dojo.addOnLoad(function() {
    // create the dialog:
    secondDlg = new dijit.Dialog({
        title: "Programatic Dialog Creation",
        style: "width: 300px"
    });
});

var handleDialogOnClose = function() {
    dojo.byId('uxDebugInfo').innerHTML = 'Hipp hurra!';
    return true;
}

function debugIndentify(idResults) {
    if (idResults.length > 0) {
        showStatistics(idResults[0]);
    }
    alert(idResults);
}


var executeAreasAndLengths = function(graphics) {
    _geometryService.areasAndLengths(graphics);
}


var outputAreaAndLength = function(result) {
    //console.log(dojo.toJson(result));
    //dojo.byId("area").innerHTML = result.areas[0] + " square meters";
    //dojo.byId("length").innerHTML = result.lengths[0] + " meters";

    var measureInfoDialog = new dijit.Dialog({ title: "Polygon", content:
    "<table><tr><td>Areal:</td><td align=right>" + Math.round(result.areas[0]) + "</td><td>m2</td></tr>" +
    "<tr><td></td><td align=right>" + Math.round(result.areas[0] * 10 / 1000000) / 10 + "</td><td>km2</td></tr>" +
    "<tr><td>Omkrets:</td><td align=right>" + Math.round(result.lengths[0]) + "</td><td>m</td></tr>" +
    "<tr><td></td><td align=right>" + Math.round(result.lengths[0] * 10 / 1000) / 10 + "</td><td>km</td></tr></table>"
    });

    dojo.body().appendChild(measureInfoDialog.domNode);
    measureInfoDialog.startup();
    measureInfoDialog.show();
}

var showMapMessage = function(message) {
    var mapHelpMessage = dojo.byId('mapHelpMessage');
    mapHelpMessage.style.display = 'inline';
    mapHelpMessage.innerHTML = message;
    var mapCoords = dojo.coords('map1');
    if (mapCoords.w < 985)
        slideMapMessageTo(45);
    else
        slideMapMessageTo(5);
}

var slideMapMessageTo = function(top) {
    var mapHelpMessage = dojo.byId('mapHelpMessage');
    var coords = dojo.coords('mapHelpMessage');

    dojo.fx.slideTo({
        node: mapHelpMessage,
        left: coords.l.toString(),
        top: top,
        unit: "px"
    }).play()


}

var hideMapMessage = function() {
    dojo.byId('mapHelpMessage').style.display = 'none';
}


var getScale = function() {
    if (isMapLoaded()) {
        var backgroundLayer = map.getLayer(_norwayCacheLayerId);
        var scale = backgroundLayer.scales[map.getLevel()];
        return scale;
    } else
        return -1;
}


var TaskToolbarMenuStateManager = function() {
    var NullTool = function() {
        this.toolname = null;
        this.activate = function() { }
        this.deactivate = function() { }
    }

    var theNullTool = new NullTool();

    this.currentEnabledTool = new NullTool();

    this.setDefaultState = function() {
        map.infoWindow.hide();
        this.currentEnabledTool.deactivate();
        dojo.byId('map1').style.cursor = 'default';
        this.currentEnabledTool = theNullTool;
        map.graphics.clear();
        setEnabledTool('none');
        hideMapMessage();
    }

    var setEnabledTool = function(toolName) {
        var selectedBorderColor = "red";
        var selectedBorderWidth = "1px";
        var notSelectedBorderColor = "#C0C0C0 #C0C0C0 #9B9B9B";
        var notSelectedBorderWidth = "1px";

        //First reset
        var button = dojo.byId('toolbar_select');
        button.parentNode.style.borderColor = notSelectedBorderColor;
        button.parentNode.style.borderWidth = notSelectedBorderWidth;
        var button = dojo.byId('toolbar_zoomIn');
        button.parentNode.style.borderColor = notSelectedBorderColor;
        button.parentNode.style.borderWidth = notSelectedBorderWidth;
        var button = dojo.byId('toolbar_uploadImage');
        button.parentNode.style.borderColor = notSelectedBorderColor;
        button.parentNode.style.borderWidth = notSelectedBorderWidth;
        var button = dojo.byId('toolbar_viewImage');
        button.parentNode.style.borderColor = notSelectedBorderColor;
        button.parentNode.style.borderWidth = notSelectedBorderWidth;
        var button = dojo.byId('toolbar_measureLength');
        button.parentNode.style.borderColor = notSelectedBorderColor;
        button.parentNode.style.borderWidth = notSelectedBorderWidth;
        var button = dojo.byId('toolbar_measureSquare');
        button.parentNode.style.borderColor = notSelectedBorderColor;
        button.parentNode.style.borderWidth = notSelectedBorderWidth;

        switch (toolName) {
            case 'identify':
                var button = dojo.byId('toolbar_select');
                button.parentNode.style.borderColor = selectedBorderColor;
                button.parentNode.style.borderWidth = selectedBorderWidth;
                break;
            case 'zoomIn':
                var button = dojo.byId('toolbar_zoomIn');
                button.parentNode.style.borderColor = selectedBorderColor;
                button.parentNode.style.borderWidth = selectedBorderWidth;
                break;
            case 'measureLine':
                var button = dojo.byId('toolbar_measureLength');
                button.parentNode.style.borderColor = selectedBorderColor;
                button.parentNode.style.borderWidth = selectedBorderWidth;
                break;
            case 'measurePolygon':
                var button = dojo.byId('toolbar_measureSquare');
                button.parentNode.style.borderColor = selectedBorderColor;
                button.parentNode.style.borderWidth = selectedBorderWidth;
                break;
            case 'uploadPicture':
                var button = dojo.byId('toolbar_uploadImage');
                button.parentNode.style.borderColor = selectedBorderColor;
                button.parentNode.style.borderWidth = selectedBorderWidth;
                break;
            case 'showPictures':
                var button = dojo.byId('toolbar_viewImage');
                button.parentNode.style.borderColor = selectedBorderColor;
                button.parentNode.style.borderWidth = selectedBorderWidth;
                break;
        }
    }

    var StatisticsTask = function() {
        this.toolname = 'identify';
        var mapClickConnect = null;

        var handleAreaIdentifyResult = function(bestResult) {
            var bestResultIdFieldName = null;
            var bestResultId = null;

            switch (bestResult.layerName) {
                case layerNameSubUnit:
                    bestResultIdFieldName = 'MS_CD';
                    break;
                case layerNameMunicipality:
                    bestResultIdFieldName = 'KOMM';
                    break;
                case layerNameCounty:
                    bestResultIdFieldName = 'MS_CD';
                    break;
                case layerNameRiverBasinDistrict:
                    bestResultIdFieldName = 'MS_CD';
                    break;
                case layerNameCompetentAuthority:
                    bestResultIdFieldName = 'MS_CD';
                    break;
                default: return;
            }

            bestResultId = bestResult.feature.attributes[bestResultIdFieldName];
            showStatistics(bestResult.layerName, bestResultId);
        }

        var handleWaterItemResult = function(bestResult) {
            var waterBodyId;
            if (typeof (bestResult.feature.attributes['WATERBODYID']) !== 'undefined')
                waterBodyId = bestResult.feature.attributes['WATERBODYID'];
            else if (typeof (bestResult.feature.attributes['WaterBodyID']) !== 'undefined')
                waterBodyId = bestResult.feature.attributes['WaterBodyID'];
            else if (typeof (bestResult.feature.attributes['WaterBodyId']) !== 'undefined')
                waterBodyId = bestResult.feature.attributes['WaterBodyId'];
            else if (typeof (bestResult.feature.attributes['waterbodyid']) !== 'undefined')
                waterBodyId = bestResult.feature.attributes['waterbodyid'];
            else {
                alert('Kunne ikke finne ID til vannforekomst');
                return;
            }

            drawWaterbody(waterBodyId);
            showWaterBodyInfo(waterBodyId, false);
        }

        var drawWaterbody = function(waterBodyId) {
            var findParameters = new esri.tasks.FindParameters();
            findParameters.searchText = waterBodyId;
            findParameters.searchFields = ['WaterBodyID'];
            findParameters.contains = false;
            findParameters.returnGeometry = true;
            findParameters.layerIds = [getLayerIDbyWaterBodyIDend(waterBodyId)];
            var findUrl = waterBodyMapServiceURL;
            var findTask = new esri.tasks.FindTask(findUrl);
            findTask.execute(findParameters, onFindWaterbodyComplete, errorFunction);
        }

        var onFindWaterbodyComplete = function(result) {
            var symbol;
            for (var i = 0; i < result.length; i++) {
                if (result[i].geometryType == "esriGeometryPolyline")
                    symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([51, 204, 255]), 3);
                else
                    symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0, 0, 0]), 2), new dojo.Color([51, 204, 255, 0.5]));
                result[i].feature.setSymbol(symbol);
                map.graphics.add(result[i].feature);
            }
        }

        var handleIdentifyResult = function(identifyResults) {
            if (identifyResults.length > 0) {
                var bestResult = null;
                if (__layerStateManagerSingleton.getAreaLayer().visibleLayers.length > 0) {
                    bestResult = identifyResults[0];
                } else {
                    bestResult = getBestWaterBodyResult(identifyResults);
                }

                if (getLayerStateManagerSingleton().getAreaLayer().visibleLayers.length > 0) {
                    var symbol;
                    if (bestResult.geometryType == "esriGeometryPolyline")
                        symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2);
                    else
                        symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.5]));
                    bestResult.feature.setSymbol(symbol);
                    map.graphics.add(bestResult.feature);
                    handleAreaIdentifyResult(bestResult);
                }
                else {
                    handleWaterItemResult(bestResult);
                }

            } else {
                alert(getText("NoHits"));
            }
        }

        var getBestWaterBodyResult = function(identifyResults) {
            var bestResult = null;
            var bestResultFound = false;
            var i = 0;
            if (!bestResultFound) {
                for (i = 0; i < identifyResults.length; i++) {
                    if (identifyResults[i].layerId == 3) {
                        bestResult = identifyResults[i];
                        bestResultFound = true;
                        break;
                    }
                }
            }
            if (!bestResultFound) {
                for (i = 0; i < identifyResults.length; i++) {
                    if (identifyResults[i].layerId == 4) {
                        bestResult = identifyResults[i];
                        bestResultFound = true;
                        break;
                    }
                }
            }
            if (!bestResultFound) {
                for (i = 0; i < identifyResults.length; i++) {
                    if (identifyResults[i].layerId == 2) {
                        bestResult = identifyResults[i];
                        bestResultFound = true;
                        break;
                    }
                }
            }
            if (!bestResultFound) {
                for (i = 0; i < identifyResults.length; i++) {
                    if (identifyResults[i].layerId == 0) {
                        bestResult = identifyResults[i];
                        bestResultFound = true;
                        break;
                    }
                }
            }
            if (!bestResultFound) {
                for (i = 0; i < identifyResults.length; i++) {
                    if (identifyResults[i].layerId == 1) {
                        bestResult = identifyResults[i];
                        bestResultFound = true;
                        break;
                    }
                }
            }
            return bestResult;
        }

        var performIdentify = function(evt) {

            if (getLayerStateManagerSingleton().getAreaLayer().visibleLayers.length == 0) {//Waterbody identify
                var scale = getScale();
                if (scale > 400000) {
                    showMapMessage('<b>' + getText('RememberZoomBeforeWaterBodySelect') + '</b>');
                    return;
                }
            }
            var identifyTask = null;
            var identifyParams = new esri.tasks.IdentifyParameters();

            if (getLayerStateManagerSingleton().getAreaLayer().visibleLayers.length > 0) {
                identifyTask = new esri.tasks.IdentifyTask(getLayerStateManagerSingleton().getAreaLayer().url);
            }
            else {
                identifyTask = new esri.tasks.IdentifyTask(waterBodyMapServiceURL);
            }

            identifyParams.tolerance = 2;
            identifyParams.returnGeometry = true;

            if (__layerStateManagerSingleton.getAreaLayer().visibleLayers.length > 0) {
                identifyParams.layerIds = getLayerStateManagerSingleton().getAreaLayer().visibleLayers;
            }
            else {
                identifyParams.layerIds = [0, 1, 2, 3, 4];
            }

            identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;

            map.graphics.clear();

            identifyParams.geometry = evt.mapPoint;
            identifyParams.mapExtent = map.extent;
            identifyTask.execute(identifyParams, handleIdentifyResult, showTaskError);
        }

        this.activate = function() {
            if (getLayerStateManagerSingleton().getAreaLayer().visibleLayers.length == 0) {//Waterbody identify
                var scale = getScale();
                if (scale > 400000) {
                    showMapMessage(getText('ZoomBeforeWaterBodySelect'));
                }
            }
            dojo.byId('map1').style.cursor = 'pointer';
            mapClickConnect = dojo.connect(map, "onClick", performIdentify);
        }

        this.deactivate = function() {
            hideMapMessage();
            map.graphics.clear();
            dojo.byId('map1').style.cursor = 'pointer';
            if (mapClickConnect != null) dojo.disconnect(mapClickConnect);
        }
    }

    var MeasureLineTask = function() {
        this.toolname = 'measureLine';
        var tb = null;

        var calculatePathLength = function(path) {
            var length = 0;
            var lastPoint = null;

            for (var i = 0; i < path.length; i++) {
                if (lastPoint != null) {
                    length += Math.sqrt(Math.pow(path[i][0] - lastPoint[0], 2) + Math.pow(path[i][1] - lastPoint[1], 2));
                }

                lastPoint = path[i];
            }

            //dojo.byId('mapStatus').innerHTML = length;
            var measureInfoDialog = new dijit.Dialog({ title: "Linje", content: "<table><tr><td>Lengde:</td><td align=right>" + Math.round(length) +
                "</td><td>m</td></tr><tr><td></td><td align=right>" + Math.round(length * 10 / 1000) / 10 + "</td><td>km</td></tr></table>"
            });
            dojo.body().appendChild(measureInfoDialog.domNode);
            measureInfoDialog.startup();
            measureInfoDialog.show();
            //dojo.connect(measureInfoDialog, "onClose", handleDialogOnClose);
        }

        var onActionPerformed = function(geometry) {
            map.graphics.clear();
            var graphic = map.graphics.add(new esri.Graphic(geometry, new esri.symbol.SimpleLineSymbol()));
            calculatePathLength(geometry.paths[0]);
        }

        this.activate = function() {
            tb = new esri.toolbars.Draw(map);
            dojo.connect(tb, "onDrawEnd", onActionPerformed);
            tb.activate(esri.toolbars.Draw.FREEHAND_POLYLINE);
            dojo.byId('map1').style.cursor = 'crosshair';
        }

        this.deactivate = function() {
            tb.deactivate();
            map.graphics.clear();
        }
    }


    var MeasurePolygonTask = function() {
        this.toolname = 'measurePolygon';
        var tb = null;

        var calculateArea = function(geometry) {

            var graphic = map.graphics.add(new esri.Graphic(geometry, new esri.symbol.SimpleFillSymbol()));
            _geometryService.simplify([graphic], executeAreasAndLengths);

        }



        var onActionPerformed = function(geometry) {
            map.graphics.clear();

            //var graphic = map.graphics.add(new esri.Graphic(geometry, new esri.symbol.SimpleLineSymbol()));
            calculateArea(geometry);

        }

        this.activate = function() {
            tb = new esri.toolbars.Draw(map);
            dojo.connect(tb, "onDrawEnd", onActionPerformed);
            tb.activate(esri.toolbars.Draw.FREEHAND_POLYGON);
            dojo.byId('map1').style.cursor = 'crosshair';
        }

        this.deactivate = function() {
            tb.deactivate();
            map.graphics.clear();
        }
    }


    var ZoomInTask = function() {
        this.toolname = 'zoomIn';
        var tb = null;

        this.activate = function() {
            tb = new esri.toolbars.Navigation(map);
            tb.activate(esri.toolbars.Navigation.ZOOM_IN);
        }

        this.deactivate = function() {
            tb.deactivate();
            map.graphics.clear();
        }
    }


    var UploadPictureTask = function() {
        this.toolname = 'uploadPicture';

        var setFlagHandle = null;

        var mapPointForPhoto = null;


        var setPictureFlag = function(event) {
            map.graphics.clear();
            mapPointForPhoto = event.mapPoint;

            var symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_CIRCLE, 15,
                new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color("#66CC00"), 4), new dojo.Color("#FFFF00"));
            var graphic = new esri.Graphic(mapPointForPhoto, symbol, null, null);
            map.graphics.add(graphic);

            var scale = getScale();
            if (scale > 100000)
                return;

            var identifyTask = null;
            var identifyParams = new esri.tasks.IdentifyParameters();

            identifyTask = new esri.tasks.IdentifyTask(waterBodyMapServiceURL);

            identifyParams.tolerance = 2;
            identifyParams.returnGeometry = false;
            identifyParams.layerIds = [0, 1, 2, 3, 4];
            identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
            identifyParams.geometry = event.mapPoint;
            identifyParams.mapExtent = map.extent;
            identifyTask.execute(identifyParams, hadleWaterBodyIdentifyPicture, showTaskError);
        }

        var hadleWaterBodyIdentifyPicture = function(result) {
            if (result.length == 0) {
                alert('Ingen treff. Prøv på nytt');
                return;
            }
            var waterBodyId;
            if (typeof (result[0].feature.attributes['WATERBODYID']) !== 'undefined')
                waterBodyId = result[0].feature.attributes['WATERBODYID'];
            else if (typeof (result[0].feature.attributes['WaterBodyID']) !== 'undefined')
                waterBodyId = result[0].feature.attributes['WaterBodyID'];
            else if (typeof (result[0].feature.attributes['WaterBodyId']) !== 'undefined')
                waterBodyId = result[0].feature.attributes['WaterBodyId'];
            else if (typeof (result[0].feature.attributes['waterbodyid']) !== 'undefined')
                waterBodyId = result[0].feature.attributes['waterbodyid'];
            else {
                alert('Kunne ikke finne ID til vannforekomst. Prøv på nytt.');
                return;
            }

            var measureInfoDialog = new dijit.Dialog({ title: "Punkt for foto", content:
        "<table><tr><td>X:</td><td>" + mapPointForPhoto.x + "</td></tr>" +
        "<tr><td>Y:</td><td>" + mapPointForPhoto.y + "</td></tr>" +
        "<tr><td>Vannforekomst-ID</td><td>" + waterBodyId + "</td></tr></table>" +
        "<br /><a href='" + photoUploadURL + "?x=" + mapPointForPhoto.x + "&y=" + mapPointForPhoto.y + "&wbid=" + waterBodyId + "' target='_blank'>Start bildeopplasting</a>"
            });
            dojo.body().appendChild(measureInfoDialog.domNode);
            measureInfoDialog.startup();
            measureInfoDialog.show();


        }

        this.activate = function() {
            var scale = getScale();
            if (scale > 100000) {
                showMapMessage(getText('ZoomBeforePhotoUpload'));
            } else {
                showMapMessage(getText('ClickForPhotoUpload'));
            }
            setFlagHandle = dojo.connect(map, "onClick", setPictureFlag);
        }

        this.deactivate = function() {
            if (setFlagHandle != null)
                dojo.disconnect(setFlagHandle);
            hideMapMessage();
            map.graphics.clear();
        }
    }

    var ShowPicturesTask = function() {
        this.toolname = 'showPictures';
        this.picturesLayer = new esri.layers.ArcGISDynamicMapServiceLayer(photoMapServiceURL, { opacity: 1.0, id: 'pictures' });

        this.activate = function() {
            var scale = getScale();
            if (scale <= 400000) {
                handlePictures(map.extent, map.getLevel());
            }

            showMapMessage(getText('PhotoScaleRestriction'));
            //map.graphics.enableMouseEvents();
            map.addLayer(this.picturesLayer);
        }

        this.deactivate = function() {
            _lastPictureExtent = null;
            hideMapMessage();
            //map.graphics.disableMouseEvents();
            map.removeLayer(this.picturesLayer);
            map.graphics.clear();
        }
    }

    this.measureLineClicked = function() {
        var measureLineTask = new MeasureLineTask();

        if (measureLineTask.toolname == this.currentEnabledTool.toolname) {
            this.setDefaultState();
        }
        else {
            this.currentEnabledTool.deactivate();
            this.currentEnabledTool = measureLineTask;
            this.currentEnabledTool.activate();
            setEnabledTool(this.currentEnabledTool.toolname);
        }
    }

    this.measurePolygonClicked = function() {
        var measurePolygonTask = new MeasurePolygonTask();

        if (measurePolygonTask.toolname == this.currentEnabledTool.toolname) {
            this.setDefaultState();
        }
        else {
            this.currentEnabledTool.deactivate();
            this.currentEnabledTool = measurePolygonTask;
            this.currentEnabledTool.activate();
            setEnabledTool(this.currentEnabledTool.toolname);
        }
    }

    this.zoomIn = function() {
        var zoomInTask = new ZoomInTask();

        if (zoomInTask.toolname == this.currentEnabledTool.toolname) {
            this.setDefaultState();
        }
        else {
            this.currentEnabledTool.deactivate();
            this.currentEnabledTool = zoomInTask;
            this.currentEnabledTool.activate();
            setEnabledTool(this.currentEnabledTool.toolname);
        }
    }

    this.showStatisticsClicked = function(forceEnable) {
        var showStatisticsTask = new StatisticsTask();

        if (!forceEnable && showStatisticsTask.toolname == this.currentEnabledTool.toolname) {
            this.setDefaultState();
        }
        else {
            this.currentEnabledTool.deactivate();
            this.currentEnabledTool = showStatisticsTask;
            this.currentEnabledTool.activate();
            setEnabledTool(this.currentEnabledTool.toolname);
        }
    }

    this.uploadPicture = function() {
        var uploadPictureTask = new UploadPictureTask();

        if (uploadPictureTask.toolname == this.currentEnabledTool.toolname) {
            this.setDefaultState();
        }
        else {
            this.currentEnabledTool.deactivate();
            this.currentEnabledTool = uploadPictureTask;
            this.currentEnabledTool.activate();
            setEnabledTool(this.currentEnabledTool.toolname);
        }
    }

    this.showPictures = function() {
        var showPicturesTask = new ShowPicturesTask();

        if (showPicturesTask.toolname == this.currentEnabledTool.toolname) {
            this.setDefaultState();
        }
        else {
            this.currentEnabledTool.deactivate();
            this.currentEnabledTool = showPicturesTask;
            this.currentEnabledTool.activate();
            setEnabledTool(this.currentEnabledTool.toolname);
        }
    }

}

var taskToolbarMenuStateManager = new TaskToolbarMenuStateManager();

//'NoArea':                                        
//'SubUnit':                  
//Kommune':
//'Fylke':        
//'RiverBasinDistrict':
//'CompetentAuthority':          
//'Norway':

var LayerStateManager = function() {
    this.kommuneId = 0;
    this.subUnitId = 2;
    this.riverBasinDistrictId = 3;
    this.competetentAuthorityId = 4;
    this.fylkeId = 1;
    var setPointerTooltipText = function(selectionText) {
        pointerTooltip.label = getText('ClickAreaForStatistics');
    }

    this.getAreaLayer = function() {
        return map.getLayer(_areaLayerId);
    }

    this.setNoAreaVisible = function() {
        this.getAreaLayer().setDefaultVisibleLayers();
        setPointerTooltipText('vannforekomst');
    }

    this.setSubUnitVisible = function() {
        this.setNoAreaVisible();
        this.getAreaLayer().setVisibleLayers([this.subUnitId]);
        setPointerTooltipText('vannområde');
    }

    this.setKommuneVisible = function() {
        this.setNoAreaVisible();
        this.getAreaLayer().setVisibleLayers([this.kommuneId]);
        setPointerTooltipText('kommune');
    }

    this.setFylkeVisible = function() {
        this.setNoAreaVisible();
        this.getAreaLayer().setVisibleLayers([this.fylkeId]);
        setPointerTooltipText('fylke');
    }

    this.setRiverBasinDistrictVisible = function() {
        this.setNoAreaVisible();
        this.getAreaLayer().setVisibleLayers([this.riverBasinDistrictId]);
        setPointerTooltipText('vannregion');
    }

    this.setCompetentAuthorityVisible = function() {
        this.setNoAreaVisible();
        this.getAreaLayer().setVisibleLayers([this.competetentAuthorityId]);
        setPointerTooltipText('vannregionmyndighet');
    }

    this.setNorwayVisible = function() {
        this.setNoAreaVisible();
    }
}

function HandleSelectArea(radioButton) {
    var extentNorway = new esri.geometry.Extent(-123349, 6434414, 1133953, 7958417);
    var enableSelectTool = true;
    switch (radioButton.value) {
        case 'NoArea':
            SelectNoArea();
            enableSelectTool = false;
            break;
        case 'SubUnit':
            //map.setExtent(extentNorway, true);
            SelectSubUnit();
            break;
        case 'Kommune':
            //map.setExtent(extentNorway, true);
            SelectKommune();
            break;
        case 'Fylke':
            //map.setExtent(extentNorway, true);
            SelectFylke();
            break;
        case 'RiverBasinDistrict':
            //map.setExtent(extentNorway, true);
            SelectRiverBasinDistrict();
            break;
        case 'CompetentAuthority':
            //map.setExtent(extentNorway, true);
            SelectCompetentAuthority();
            break;
        case 'Norway':
            //map.setExtent(extentNorway, true);
            SelectNorway();
            enableSelectTool = false;
            break;
        default: alert('Do not know what do do with selected radiobutton!');
    }
    if (enableSelectTool) {
        taskToolbarMenuStateManager.showStatisticsClicked(true);
        showMapMessage(getText('SelectAreaByClick'));
    }
    else
        taskToolbarMenuStateManager.setDefaultState();
}

var __layerStateManagerSingleton;

function getLayerStateManagerSingleton() {
    if (__layerStateManagerSingleton == null) {
        __layerStateManagerSingleton = new LayerStateManager();
    }

    return __layerStateManagerSingleton;
}

function SelectNoArea() {
    getLayerStateManagerSingleton().setNoAreaVisible();
}

function SelectSubUnit() {
    getLayerStateManagerSingleton().setSubUnitVisible();
}

function SelectKommune() {
    getLayerStateManagerSingleton().setKommuneVisible();
}

function SelectFylke() {
    getLayerStateManagerSingleton().setFylkeVisible();
}

function SelectRiverBasinDistrict() {
    getLayerStateManagerSingleton().setRiverBasinDistrictVisible();
}

function SelectCompetentAuthority() {
    getLayerStateManagerSingleton().setCompetentAuthorityVisible();
}

function SelectNorway() {
    getLayerStateManagerSingleton().setNorwayVisible();
    showStatistics(getText('AllOfNorway'), null);
}

var _tabDivs = null;


function debugAlertObjDisplay(obj) {
    var result = '';

    for (att in obj) {
        result += att + obj[att] + ' ';
    }

    return result;
}

function isMapLoaded() {
    return _mapLoaded;
}
function mapLoaded() {
    _mapLoaded = true;
}


function CalculateInfoWindowHeight() {
    var minResult = 120;
    var mediumResult = 170;
    var maxResult = 220;

    if (CountPointQueryResult() < 3)
        return minResult;
    if (CountPointQueryResult() < 6)
        return mediumResult;

    return maxResult;
}

var searchOnEnter = function(e) {
    var keycode;
    if (window.event) keycode = window.event.keyCode;
    else if (e) keycode = e.which;
    else return true;

    if (keycode == 13) {
        searchWater(getSearchInput());
        return true;
    }
    else
        return true;
}

var getSearchInput = function() {
    return dojo.byId('txtSearchInput').value;
}

var searchWaterCallback = function(response, request) {
    alert(response);
}

function webServiceFailed(response, request) {
    alert("Error calling web service. Message: " + response.message + ' Stack: ' + response.stack);
}

var _columnMapperNO = [['WaterBodyID', '<span id="uxTableHeadingId">ID</span>'], ['Name', '<span id="uxTableHeadingName">Navn</span>'], ['MunicipalityNameString', '<span id="uxTableHeadingKommune">Kommune</span>']];
var _columnMapperUK = [['WaterBodyID', '<span id="uxTableHeadingId">ID</span>'], ['Name', '<span id="uxTableHeadingName">Name</span>'], ['MunicipalityNameString', '<span id="uxTableHeadingKommune">Municipality</span>']];
//var _columnMapperNO = [['WaterBodyID', '<span id="uxTableHeadingId">ID</span>'], ['Name', '<span id="uxTableHeadingName">Navn</span>'], ['MunicipalityIDString', '<span id="uxTableHeadingKommune">Kommune</span>'], ['RiskName', '<span id="uxTableHeadingRisk">Risiko</span>'], ['EcologicalStatusName', '<span id="uxTableHeadingEcoStatus">Tilstand</span>']];
//var _columnMapperUK = [['WaterBodyID', '<span id="uxTableHeadingId">ID</span>'], ['Name', '<span id="uxTableHeadingName">Name</span>'], ['MunicipalityIDString', '<span id="uxTableHeadingKommune">Municipality</span>'], ['RiskName', '<span id="uxTableHeadingRisk">Risk</span>'], ['EcologicalStatusName', '<span id="uxTableHeadingEcoStatus">Status</span>']];

var _searchResultTable = null;

function getLayerIDbyWaterBodyIDend(waterBodyID) {
    var splitArray = waterBodyID.split('-');
    switch (splitArray[splitArray.length - 1]) {
        case "T":
            return 0;
            break;
        case "C":
            return 1;
            break;
        case "G":
            return 2;
            break;
        case "L":
            return 3;
            break;
        case "R":
            return 4;
            break;
    }
}

var performZoom = function(result) {
    if (result == null || result.features == null || result.features.length == 0)
        return;
    else if (result.features.length == 1) {
        map.setExtent(result.features[0].geometry.getExtent(), true);
    }
    else {
        var extent = getFeaturesExtent(result.features);
        map.setExtent(extent, true);
    }

    drawWaterBodyFeatures(result.features);
}

var drawWaterBodyFeatures = function(features) {
    map.graphics.clear();
    if (features == null || features.length == 0)
        return;

    var lineSymbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color("#005CE6"), 3);

    var polygonSymbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID,
            new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color("#005CE6"), 2),
            new dojo.Color([0, 92, 230, 0.3]));

    for (var i = 0; i < features.length; i++) {
        var feature = features[i];
        if (feature.geometry.type == "polyline")
            feature.setSymbol(lineSymbol);
        else if (feature.geometry.type == "polygon")
            feature.setSymbol(polygonSymbol);

        map.graphics.add(feature);
    }
}


var getFeaturesExtent = function(features) {
    if (features == null || features.length == 0)
        return null;

    var xmin = 214748364; var ymin = 214748364; var xmax = -214748364; var ymax = -214748364;

    var tempExtent;
    for (var i = 0; i < features.length; i++) {
        tempExtent = features[i].geometry.getExtent();
        if (xmin > tempExtent.xmin)
            xmin = tempExtent.xmin;
        if (ymin > tempExtent.ymin)
            ymin = tempExtent.ymin;
        if (xmax < tempExtent.xmax)
            xmax = tempExtent.xmax;
        if (ymax < tempExtent.ymax)
            ymax = tempExtent.ymax;
    }

    var extent = new esri.geometry.Extent(xmin, ymin, xmax, ymax);
    return extent;
}

var zoomToSearcResult = function(waterBodyID) {
    var query = new esri.tasks.Query();
    query.returnGeometry = true;
    query.where = "WaterBodyID = '" + waterBodyID + "'";
    var queryUrl = waterBodyMapServiceURL + '/' + getLayerIDbyWaterBodyIDend(waterBodyID);
    var queryTask = new esri.tasks.QueryTask(queryUrl);

    queryTask.execute(query, performZoom);
}

var getSearchResultTable = function() {
    if (_searchResultTable == null)
        _searchResultTable = dojo.byId('uxSearchResultGrid');
    return _searchResultTable;
}

var createRowHTML = function(row, dataObject) {
    var result = '';

    for (var i = 0; i < _columnMapperNO.length; i++) {
        row.insertCell(i);
        row.cells[i].innerHTML = dataObject[_columnMapperNO[i][0]];
    }

    row.insertCell(i);
    row.cells[i].style.cursor = 'pointer';

    //Set to norwegian and changed below if other language
    row.cells[i].innerHTML = '<table cellspacing=0 cellpaddinf=0><tr><td valign="middle"><img src="images/full-extent.png" title="Vis i kart" onclick="zoomToSearcResult(' + "'" + dataObject['WaterBodyID'] + "'" + ');" /></td><td valign="middle"><img title="Vis statistikk" onclick="showWaterBodyInfo(' + "'" + dataObject['WaterBodyID'] + "'" + ',false);" src="images/statisticsIcon.png" /></td></tr></table>';

    if (currentLanguage.toLowerCase() == 'en')
        row.cells[i].innerHTML = '<table cellspacing=0 cellpaddinf=0><tr><td valign="middle"><img src="images/full-extent.png" title="Show in map" onclick="zoomToSearcResult(' + "'" + dataObject['WaterBodyID'] + "'" + ');" /></td><td valign="middle"><img title="Show statistics" onclick="showWaterBodyInfo(' + "'" + dataObject['WaterBodyID'] + "'" + ',false);" src="images/statisticsIcon.png" /></td></tr></table>';

    return row;
}

var createHeaderRowHTML = function(headerRow) {
    var result = '';
    var currentColumnMapper = null;

    if (currentLanguage.toLowerCase() == 'no') {
        currentColumnMapper = _columnMapperNO;
    }
    else if (currentLanguage.toLocaleLowerCase() == 'en') {
        currentColumnMapper = _columnMapperUK;
    }

    for (var i = 0; i < currentColumnMapper.length; i++) {
        headerRow.insertCell(i);

        //result += '<td style="border-bottom:2px solid #6678B1;">';
        //headerRow.cells[i].style.fontWeight = 'bold';
        headerRow.cells[i].innerHTML = currentColumnMapper[i][1];
        //result += '</td>';
    }

    headerRow.insertCell(i);
    headerRow.insertCell(i).style.width = '50px';
    //result += '<td style="width:50px">&nbsp;</td>';

    return headerRow;
}

function addSearchResultRow(row, data) {
    createRowHTML(row, data);
    row.className = 'table-row';
}


function errorFunction(error) {
    alert('Oops... det oppstod en feil. Baklager dette.');
}

function searchWater(searchInput) {
    toggleLeftPanel(true);
    dijit.byId('uxTabContainer').selectChild(dijit.byId('uxSearchResult'));



    if (searchInput == null || dojo.trim(searchInput).length == 0) {
        dijit.byId('uxTabContainer').selectChild(dijit.byId('uxSearchResult'));
        dojo.byId('uxSearchInfo').innerHTML = getText('SearchTextNotProvided');
        dojo.byId('uxSearchResultGridContainer').style.display = 'none';
        return;
    }

    dojo.byId('uxSearchProgress').style.display = 'block';
    dojo.byId('uxSearchInfo').style.display = 'none';
    dojo.byId('uxSearchResultGridContainer').style.display = 'none';

    var request = { name: dojo.trim(searchInput) };
    var content = { "request": dojo.toJson(request) };
    var url = vnServiceURL + "searchWaterBody?name=" + encodeURIComponent(searchInput);
    dojo.xhrGet({ url: url, load: handleSearchResult, error: errorFunction, handleAs: "json" });
}

function handleSearchResult(data) {
    dojo.byId('uxSearchProgress').style.display = 'none';
    dojo.byId('uxSearchInfo').style.display = 'inline';
    dojo.byId('uxSearchInfo').innerHTML = getText('SearchHits') + ': ' + data.length;

    var searchResultTable = getSearchResultTable();

    var noOfExistingRows = searchResultTable.rows.length;
    for (var i = 1; i < noOfExistingRows; i++) {
        searchResultTable.deleteRow(1);
    }

    if (data.length == 0) return;


    if (noOfExistingRows == 0) {
        var headerRow = searchResultTable.insertRow(0);
        createHeaderRowHTML(headerRow)
        headerRow.className = 'table-header';
    }

    for (var i = 0; i < data.length; i++) {
        var row = searchResultTable.insertRow(i + 1);
        addSearchResultRow(row, data[i]);
    }
    dojo.byId('uxSearchResultGridContainer').style.display = 'inline';
}



function handleSendResponseResult(resultText) {
    resultText = resultText.replace('"', '').replace('"', '');

    if (resultText.length == 0) {
        dojo.byId('uxMailInfo').innerHTML = getText('ResponseMessageError');
        dojo.byId('tdMailInfo').style.backgroundColor = "#FFC2B7";
    } else {
        dojo.byId('uxMailInfo').innerHTML = getText('ResponseMessageOK');
        dojo.byId('tdMailInfo').style.backgroundColor = "#D2FFCC";
    }

    setTimeout('hideConfirmMessage();', 5000);

    if (missingResponseTextTooltip != null) missingResponseTextTooltip.destroy();
}

function hideConfirmMessage() {
    dojo.byId('uxMailInfo').innerHTML = '';
    dojo.byId('tdMailInfo').style.backgroundColor = "#FFFFFF";
}

function validateInput(validateTextBox) {
    if (!validateTextBox.isValid()) {
        validateTextBox.focus();
        return false;
    }

    return true;
}

function sendResponse() {
    if (missingResponseTextTooltip != null) missingResponseTextTooltip.destroy();

    var hdnWBID = dojo.byId('uxResponseWaterBodyIDValue');
    if (dojo.trim(hdnWBID.value) == '') return;
    if (!validateInput(dijit.byId('uxResponseHeading'))) return;


    var responseSimpleTextArea = dijit.byId('uxResponseText');
    if (dojo.trim(responseSimpleTextArea.value) == '') {
        responseSimpleTextArea.value = 'Dette feltet må inneholde tekst';

        missingResponseTextTooltip = new dijit.Tooltip
                (
                    { connectId: ["uxResponseText"], label: "Tilbakemelding må fylles ut" }
                );

        responseSimpleTextArea.focus();

        return;
    }
    if (!validateInput(dijit.byId('uxResponderEmail'))) return;

    var waterBodyID = hdnWBID.value;
    hdnWBID.value = '';
    var spanWBID = dojo.byId('uxResponseWaterBodyID');
    spanWBID.innerHTML = getText('ChooseWaterBodyInMap');
    var responseHeading = dojo.byId('uxResponseHeading').value;
    var responseText = dojo.byId('uxResponseText').value;
    var responderEmail = dojo.byId('uxResponderEmail').value;
    var url = vnServiceURL + "makeReview?waterBodyID=" + waterBodyID + "&reviewerEmail=" + responderEmail + '&heading=' + responseHeading + '&review=' + responseText;
    dojo.xhrGet({ url: url, load: handleSendResponseResult, error: errorFunction, handleAs: "text" });
}

function showTaskError(msg) {
    alert(msg);
}

function handlePointerClicked() {
    if (dojo.byId('map1').style.cursor != 'pointer') {
        dojo.byId('map1').style.cursor = 'default';
    }
    else {
        dojo.byId('map1').style.cursor = 'pointer';
    }
}

function handleFullExtentClick() {
    map.setExtent(map.getLayer(_norwayCacheLayerId).initialExtent, true);
}

function switchLanguage(language) {
    if (!language && currentLanguage == 'no') {
        currentLanguage = 'en';
    }
    else if (!language && currentLanguage == 'en') {
        currentLanguage = 'no';
    }
    else if (language == 'en') {
        currentLanguage = 'en';
    }
    else if (language == 'no') {
        currentLanguage = 'no';
    } else {
        currentLanguage = 'no';
    }

    if (currentLanguage == 'no') {
        dojo.byId('uxLanguageButton').src = 'images/flagg_UK.jpg';
    }
    else if (currentLanguage == 'en') {
        dojo.byId('uxLanguageButton').src = 'images/flagg_NO.jpg';
    }

    var selArea = null;

    for (var i = 0; i < textProperties.length; i++) {
        var languageObj = textProperties[i];
        var element = null;

        if (languageObj.idSearch == 'dojo') {
            element = dojo.byId(languageObj.id);
        }
        else if (languageObj.idSearch == 'dijit') {
            element = dijit.byId(languageObj.id);
        }

        if (element != null) {
            element[languageObj.textProperty] = languageObj[currentLanguage];
            if (typeof (languageObj.refreshExpression) == 'string') eval(languageObj.refreshExpression);
        }
    }
    setHelpTexts();
}

var selectResponseWaterBodyHandle;
var selectResponseWaterBody = function(event) {
    showMapMessage(getText('ChooseWaterBodyInMap'));
    selectResponseWaterBodyHandle = dojo.connect(map, "onClick", handleSelectResponseWaterBodyMapClick);
    setTimeout('dojo.disconnect(selectResponseWaterBodyHandle);', 30000); //If nothing is selected within 30 seconds, disable
}

var handleSelectResponseWaterBodyMapClick = function(event) {
    dojo.disconnect(selectResponseWaterBodyHandle);
    var wbIdentify = new WaterBodyIdentify('SetResponseWaterBodyID');
    wbIdentify.identify(event.mapPoint);
}

var setResponseWaterBody = function(waterBodyID) {
    var hdnWBID = dojo.byId('uxResponseWaterBodyIDValue');
    var spanWBID = dojo.byId('uxResponseWaterBodyID');
    var btnSubmitResponse = dijit.byId('uxSendResponse');
    hdnWBID.value = waterBodyID;
    spanWBID.innerHTML = waterBodyID;
    btnSubmitResponse.disabled = false;
}

var WaterBodyIdentify = function(_actiononHit) {
    var drawGraphicsOnHit = true;
    var actionOnHit = _actiononHit;


    this.identify = function(mapPoint) {
        map.graphics.clear();
        var scale = getScale();
        if (scale > 400000) {
            showMapMessage('<b>' + getText('RememberToZoomBeforeWaterBodyIdentify') + '</b>');
            return;
        }

        var identifyTask = null;
        var identifyParams = new esri.tasks.IdentifyParameters();
        identifyTask = new esri.tasks.IdentifyTask(waterBodyMapServiceURL);

        identifyParams.tolerance = 2;
        identifyParams.returnGeometry = true;
        identifyParams.layerIds = [0, 1, 2, 3, 4];

        identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;

        identifyParams.geometry = mapPoint;
        identifyParams.mapExtent = map.extent;
        identifyTask.execute(identifyParams, handleResult, showTaskError);
    }


    var handleResult = function(identifyResults) {
        if (identifyResults.length > 0) {
            bestResult = getBestWaterBodyResult(identifyResults);

            var symbol;
            if (bestResult.geometryType == "esriGeometryPolyline")
                symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2);
            else
                symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.5]));
            bestResult.feature.setSymbol(symbol);

            if (drawGraphicsOnHit)
                map.graphics.add(bestResult.feature);

            handleWaterItemResult(bestResult);

        } else {
            alert(getText("NoHits"));
        }
    }

    var handleWaterItemResult = function(bestResult) {
        var waterBodyId;
        if (typeof (bestResult.feature.attributes['WATERBODYID']) !== 'undefined')
            waterBodyId = bestResult.feature.attributes['WATERBODYID'];
        else if (typeof (bestResult.feature.attributes['WaterBodyID']) !== 'undefined')
            waterBodyId = bestResult.feature.attributes['WaterBodyID'];
        else if (typeof (bestResult.feature.attributes['WaterBodyId']) !== 'undefined')
            waterBodyId = bestResult.feature.attributes['WaterBodyId'];
        else if (typeof (bestResult.feature.attributes['waterbodyid']) !== 'undefined')
            waterBodyId = bestResult.feature.attributes['waterbodyid'];
        else {
            alert('Kunne ikke finne ID til vannforekomst');
            return;
        }


        switch (actionOnHit) {
            case 'WaterBodyInfo':
                showWaterBodyInfo(waterBodyId, false);
                break;
            case 'SetResponseWaterBodyID':
                setResponseWaterBody(waterBodyId);
                break;

        }
    }



    var getBestWaterBodyResult = function(identifyResults) {
        var bestResult = null;
        var bestResultFound = false;
        var i = 0;
        if (!bestResultFound) {
            for (i = 0; i < identifyResults.length; i++) {
                if (identifyResults[i].layerId == 3) {
                    bestResult = identifyResults[i];
                    bestResultFound = true;
                    break;
                }
            }
        }
        if (!bestResultFound) {
            for (i = 0; i < identifyResults.length; i++) {
                if (identifyResults[i].layerId == 4) {
                    bestResult = identifyResults[i];
                    bestResultFound = true;
                    break;
                }
            }
        }
        if (!bestResultFound) {
            for (i = 0; i < identifyResults.length; i++) {
                if (identifyResults[i].layerId == 2) {
                    bestResult = identifyResults[i];
                    bestResultFound = true;
                    break;
                }
            }
        }
        if (!bestResultFound) {
            for (i = 0; i < identifyResults.length; i++) {
                if (identifyResults[i].layerId == 0) {
                    bestResult = identifyResults[i];
                    bestResultFound = true;
                    break;
                }
            }
        }
        if (!bestResultFound) {
            for (i = 0; i < identifyResults.length; i++) {
                if (identifyResults[i].layerId == 1) {
                    bestResult = identifyResults[i];
                    bestResultFound = true;
                    break;
                }
            }
        }
        return bestResult;
    }


}




var BrowserDetect = {
    init: function() {
        this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
        this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
        this.OS = this.searchString(this.dataOS) || "an unknown OS";
    },
    searchString: function(data) {
        for (var i = 0; i < data.length; i++) {
            var dataString = data[i].string;
            var dataProp = data[i].prop;
            this.versionSearchString = data[i].versionSearch || data[i].identity;
            if (dataString) {
                if (dataString.indexOf(data[i].subString) != -1)
                    return data[i].identity;
            }
            else if (dataProp)
                return data[i].identity;
        }
    },
    searchVersion: function(dataString) {
        var index = dataString.indexOf(this.versionSearchString);
        if (index == -1) return;
        return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
    },
    dataBrowser: [
		{
		    string: navigator.userAgent,
		    subString: "Chrome",
		    identity: "Chrome"
		},
		{ string: navigator.userAgent,
		    subString: "OmniWeb",
		    versionSearch: "OmniWeb/",
		    identity: "OmniWeb"
		},
		{
		    string: navigator.vendor,
		    subString: "Apple",
		    identity: "Safari",
		    versionSearch: "Version"
		},
		{
		    prop: window.opera,
		    identity: "Opera"
		},
		{
		    string: navigator.vendor,
		    subString: "iCab",
		    identity: "iCab"
		},
		{
		    string: navigator.vendor,
		    subString: "KDE",
		    identity: "Konqueror"
		},
		{
		    string: navigator.userAgent,
		    subString: "Firefox",
		    identity: "Firefox"
		},
		{
		    string: navigator.vendor,
		    subString: "Camino",
		    identity: "Camino"
		},
		{		// for newer Netscapes (6+)
		    string: navigator.userAgent,
		    subString: "Netscape",
		    identity: "Netscape"
		},
		{
		    string: navigator.userAgent,
		    subString: "MSIE",
		    identity: "Explorer",
		    versionSearch: "MSIE"
		},
		{
		    string: navigator.userAgent,
		    subString: "Gecko",
		    identity: "Mozilla",
		    versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
		    string: navigator.userAgent,
		    subString: "Mozilla",
		    identity: "Netscape",
		    versionSearch: "Mozilla"
		}
	],
    dataOS: [
		{
		    string: navigator.platform,
		    subString: "Win",
		    identity: "Windows"
		},
		{
		    string: navigator.platform,
		    subString: "Mac",
		    identity: "Mac"
		},
		{
		    string: navigator.userAgent,
		    subString: "iPhone",
		    identity: "iPhone/iPod"
		},
		{
		    string: navigator.platform,
		    subString: "Linux",
		    identity: "Linux"
		}
	]

};



dojo.addOnLoad(initialize);