// http://gisweb.azdeq.gov/arcgis/veiareas/
// ADEQ: Arizona Department of Environmental Quality

function ShowMap()
{
    // show map
    dojo.byId("map").style.visibility = "visible";
}

function HideMap()
{
    // hide map
    dojo.byId("map").style.visibility = "hidden";
}

function ZoomExtent(extent)
{
    _map.setExtent(extent);
}

function FullExtent()  // toolbar command
{
    // adjust extent to make state fit within map dimension
    var extent = new esri.geometry.Extent(_arizona.xmin, _arizona.ymin, _arizona.xmax, _arizona.ymax, _NAD_1983_UTM_Zone_12N);
    var width = extent.getWidth();
    var height = extent.getHeight();
    var center = extent.getCenter();

    // map dimension
    var mapWidth = dojo.byId("map").style.width;
    mapWidth = mapWidth.substring(0, mapWidth.length-2);  // drop px
    var mapHeight = dojo.byId("map").style.height;
    mapHeight = mapHeight.substring(0, mapHeight.length-2);  // drop px

    // width to height ratio
    // larger values are wider, smaller taller
    var mapRatio = mapWidth / mapHeight;
    var ratio = width / height;

    if (ratio < mapRatio)  // extent taller than map
    {
        // increase az width to match map
        var width = (height * mapRatio) / 2;
        extent.xmin = center.x - width;
        extent.xmax = center.x + width;
    }
    else // extent wider than map
    {
        // increase az height to match map
        var height = (width / mapRatio) / 2;
        height -= 1000;  // needed to avoid null pt exception
        extent.ymin = center.y - height;
        extent.ymax = center.y + height;
    }

    ZoomExtent(extent); 
}

function PreZoom2x(evt)  // mouse down event
{
    _screenPoint = evt.screenPoint;
    _mapPoint = evt.mapPoint;
}

function ZoomIn2x(evt)  // mouse up event
{
    // did user click map rather than drag a box (or inadvertently drag a tiny box)?
    if (Math.abs(evt.screenPoint.x - _screenPoint.x) < 10//pixels
     || Math.abs(evt.screenPoint.y - _screenPoint.y) < 10)
    {
        // zoom in by a factor of 2
        var width = _map.extent.getWidth() / 4;
        var height = _map.extent.getHeight() / 4;
        var xmin = _mapPoint.x - width;
        var ymin = _mapPoint.y - height;
        var xmax = _mapPoint.x + width;
        var ymax = _mapPoint.y + height;
        _zoomExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, _NAD_1983_UTM_Zone_12N);
        
        // have to wait to override default zoom behavior if user dragged a tiny box
        if (evt.screenPoint.x != _screenPoint.x || evt.screenPoint.y != _screenPoint.y)
        {
            HideMap();
            setTimeout("ZoomExtent(_zoomExtent);", 2000);
            setTimeout("ShowMap();", 3000);
        }
        else
        {
            ZoomExtent(_zoomExtent);
        }
    }
}

function ZoomOut2x(evt)  // mouse up event
{
    // did user click map rather than drag a box (or inadvertently drag a tiny box)?
    if (Math.abs(evt.screenPoint.x - _screenPoint.x) < 10//pixels
     || Math.abs(evt.screenPoint.y - _screenPoint.y) < 10)
    {
        // zoom out by a factor of 2
        var width = _map.extent.getWidth();
        var height = _map.extent.getHeight();
        var xmin = _mapPoint.x - width;
        var ymin = _mapPoint.y - height;
        var xmax = _mapPoint.x + width;
        var ymax = _mapPoint.y + height;
        _zoomExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, _NAD_1983_UTM_Zone_12N);
        
        // have to wait to override default zoom behavior if user dragged a tiny box
        if (evt.screenPoint.x != _screenPoint.x || evt.screenPoint.y != _screenPoint.y)
        {
            HideMap();
            setTimeout("ZoomExtent(_zoomExtent);", 2000);
            setTimeout("ShowMap();", 3000);
        }
        else
        {
            ZoomExtent(_zoomExtent);
        }
    }
}

function ShowLoading()
{
    var loading = dojo.byId("loading");
    esri.show(loading);
}

function HideLoading()
{
    _layersLoaded++;
    if (_layersLoaded == _map.layerIds.length)
    {
        var loading = dojo.byId("loading");
        esri.hide(loading);
        _layersLoaded = 0;
        
        DrawScalebar();
        LimitExtent();
    }
}

function DrawScalebar()
{
    var MilesPerMeter = .00062137;//11922348

    // scalebar xy
    var scalebarX1 = Number(_map.extent.xmin) + Number(_map.extent.getWidth() * 0.10);
    var scalebarX2 = Number(_map.extent.xmin) + Number(_map.extent.getWidth() * 0.30);
    var scalebarY = Number(_map.extent.ymin) + Number(_map.extent.getHeight() * 0.02);
    
    // scalebar line
    var point1 = new esri.geometry.Point(scalebarX1, scalebarY , _NAD_1983_UTM_Zone_12N);
    var point2 = new esri.geometry.Point(scalebarX2, scalebarY, _NAD_1983_UTM_Zone_12N);
    var points = [ point1, point2];
    var polyline = new esri.geometry.Polyline(_NAD_1983_UTM_Zone_12N);
    polyline.addPath(points);

    // draw scalebar
    if (_scalebarGraphic) _map.graphics.remove(_scalebarGraphic);
    var symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([128,0,0]), 5);
    _scalebarGraphic = new esri.Graphic(polyline, symbol);
    _map.graphics.add(_scalebarGraphic);
    
    // scalebar value in miles
    var scalebarMeters = scalebarX2 - scalebarX1;
    var scalebarMiles = String(scalebarMeters * MilesPerMeter);

    // text value
    var textSymbol = new esri.symbol.TextSymbol(scalebarMiles.substr(0,5) + " miles");
    textSymbol.setAlign(esri.symbol.TextSymbol.ALIGN_START);
    textSymbol.setColor(new dojo.Color([128,0,0]));

    // draw value
    if (_textGraphic) _map.graphics.remove(_textGraphic);
    var textX = Number(scalebarX2) + Number(_map.extent.getWidth() * 0.01);
    var textY = Number(_map.extent.ymin) + Number(_map.extent.getHeight() * 0.012);
    var textPoint = new esri.geometry.Point(textX, textY , _NAD_1983_UTM_Zone_12N);
    _textGraphic = new esri.Graphic(textPoint, textSymbol);
    _map.graphics.add(_textGraphic);
}

function LimitExtent()
{
    // keep at least half of arizona in view
    var center = _map.extent.getCenter();
    if (center.x < _arizona.xmin
     || center.x > _arizona.xmax
     || center.y < _arizona.ymin
     || center.y > _arizona.ymax)
    {
        FullExtent();
    }
    // keep user from zooming out beyond arizona
    else if (_map.extent.getWidth() > 800000 && _map.extent.getHeight() > 800000)  // ~ 1:3500000
    {
        FullExtent();
    }
    // keep user from zooming in too closely
    else if (_map.extent.getWidth() < 200 && _map.extent.getHeight() < 200)  // ~ 1:1000
    {
        _navToolbar.zoomToPrevExtent();
    }
}

function EnvelopeFromPoint(point, perimeter)
{
    // need to vary perimeter to avoid toolbar zoom button click exception
    _perimeter == 0 ? _perimeter = 10 : _perimeter = 0;
    perimeter += _perimeter;
    
    var xmin = parseInt(point.x) - perimeter;
    var ymin = parseInt(point.y) - perimeter;
    var xmax = parseInt(point.x) + perimeter;
    var ymax = parseInt(point.y) + perimeter;
    
    return new esri.geometry.Extent(xmin, ymin, xmax, ymax, _NAD_1983_UTM_Zone_12N);
}

function MarkLocation(location)
{
    // display red X at location
    var outline = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255,0,0]), 2);
    var symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_X, 10, outline, new dojo.Color([255,0,0]));
    var graphic = new esri.Graphic(location, symbol);
    _map.graphics.clear();
    _map.graphics.add(graphic);
    DrawScalebar();
}

