// http://gisweb.azdeq.gov/arcgis/emaps/
// ADEQ: Arizona Department of Environmental Quality

function ShowLatLong(evt)
{
    // convert utm to lat/long
    _location = new esri.geometry.Point(evt.mapPoint.x, evt.mapPoint.y, _NAD_1983_UTM_Zone_12N);
    var graphic = new esri.Graphic(_location);
    var geometryService = new esri.tasks.GeometryService(_geometryURL);
    geometryService.project([graphic], _WGS_1984, ShowLatLong2, TaskFailed);
}

function ShowLatLong2(graphics)
{
    // mark lat/long
    MarkLocation(_location, _NAD_1983_UTM_Zone_12N);

    // display lat/long info popup
    var content = "Latitude:<br>" + PrintDMS(DDtoDMS(graphics[0].geometry.y)) + "<br>" + Round8(graphics[0].geometry.y);
    content += "<br><hr>Longitude:<br>" + PrintDMS(DDtoDMS(graphics[0].geometry.x)) + "<br>" + Round8(graphics[0].geometry.x);
    _map.infoWindow.setTitle("Coordinates");
    _map.infoWindow.setContent(content);
    _map.infoWindow.show(_map.toScreen(_location), _map.getInfoWindowAnchor(_map.toScreen(_location)));
}

function ZoomLatLong()
{
    var latitude = document.getElementById("latitude").value;
    var longitude = document.getElementById("longitude").value;

    // may be dms
    var lat = latitude.split(" ");
    if (lat.length >= 3) latitude = DMStoDD(lat[0], lat[1], lat[2]);

    var lon = longitude.split(" ");
    if (lon.length >= 3) longitude = DMStoDD(lon[0], lon[1], lon[2]);

    // validate entries
    if (isNaN(latitude) || latitude == 0)
    {
        ShowError("Invalid latitude");
        document.getElementById("latitude").focus();
        return;
    }
    if (isNaN(longitude) || longitude == 0)
    {
        ShowError("Invalid longitude");
        document.getElementById("longitude").focus();
        return;
    }

    // allow positive longitude
    if (longitude > 0) longitude = 0 - longitude;

    // validate lat/long
    if (latitude < 31 || latitude > 37)
    {
        ShowError("Latitude limited to 31-37");
        document.getElementById("latitude").focus();
        return;
    }
    if (longitude < -115  || longitude > -109)
    {
        ShowError("Longitude limited to 109-115");
        document.getElementById("longitude").focus();
        return;
    }
    
    // convert lat/long to utm
    var point = new esri.geometry.Point(longitude, latitude, _WGS_1984);
    var graphic = new esri.Graphic(point);
    var geometryService = new esri.tasks.GeometryService(_geometryURL);
    // send request to server
    geometryService.project([graphic], _NAD_1983_UTM_Zone_12N, ZoomLatLong2, TaskFailed);
}

function ZoomLatLong2(graphics)  // server response
{
    if (graphics.length == 0)
    {
        ShowError("Invalid lat/long");
        document.getElementById("latitude").focus();
        return;
    }
    
    MarkLocation(graphics[0].geometry);
    var extent = EnvelopeFromPoint(graphics[0].geometry, 1000);
    ZoomExtent(extent);
}

function UrlLatLong(latitude, longitude)
{
    // convert dms to dd
    var lat = latitude.split(" ");
    if (lat.length >= 3) latitude = DMStoDD(lat[0], lat[1], lat[2]);
    var lon = longitude.split(" ");
    if (lon.length >= 3) longitude = DMStoDD(lon[0], lon[1], lon[2]);
    
    // allow positive longitude
    if (longitude > 0) longitude = 0 - longitude;

    // validate lat/long
    if (latitude < 31 || latitude > 37)
    {
        FullExtent();
        return;
    }
    if (longitude < -115  || longitude > -109)
    {
        FullExtent();
        return;
    }
    
    // convert lat/long to utm
    var point = new esri.geometry.Point(longitude, latitude, _WGS_1984);
    var graphic = new esri.Graphic(point);
    var geometryService = new esri.tasks.GeometryService(_geometryURL);
    // send request to server
    geometryService.project([graphic], _NAD_1983_UTM_Zone_12N, UrlLatLong2, TaskFailed);
}

function UrlLatLong2(graphics)  // server response
{
    if (graphics.length == 0)
    {
        ShowError("Invalid lat/long");
        return;
    }
    
    MarkLocation(graphics[0].geometry);
    var extent = EnvelopeFromPoint(graphics[0].geometry, 1000);
    ZoomExtent(extent);
}

// convert degrees minutes seconds to decimal degrees
function DMStoDD(D, M, S)  // input: String; output: Number
{
    // verify not empty
    if (D.length == 0) return 0;
    if (M.length == 0) return 0;
    if (S.length == 0) return 0;

    // javascript not type-safe
    D = Number(D);
    M = Number(M);
    S = Number(S);

    // validate d m s
    if (isNaN(D)) return 0;
    if (isNaN(M)) return 0;
    if (isNaN(S)) return 0;

    // add d m s (positive longitude)
    var DD = Math.abs(D) + (M / 60) + (S / 3600);
    DD = Round8(DD);

    // make longitude negative
    if ((DD / 100) >= 1) DD = -DD;

    return DD;
}

// convert decimal degrees to degrees minutes seconds
function DDtoDMS(DD)  // input: Number; output: String
{
    // validate decimal
    if (isNaN(DD)) return "0 0 0";
    DD = parseFloat(Math.abs(DD));

    // extract degrees
    var D = Math.floor(DD);
    DD -= D;
    D = String(D);

    // extract minutes
    DD = Round8(DD) * 60;
    var M = Math.floor(DD);
    DD -= M;
    M = String(M);
    if (M.length == 1) M = "0" + M;

    // extract seconds
    DD = Round8(DD) * 60;
    var S = String(Round4(DD));
    if (S < 10) S = "0" + S;

    return D + " " + M + " " + S;
}
    
function PrintDMS(dms)
{
    var split = dms.split(" ");
    var nw = (split[0].length<3) ? "N" : "W";
    return split[0] + nw + " " + split[1] + "' " + split[2] + '"';
}

function Round8(num)
{
    var ten8 = Math.pow(10, 8);
    return Math.round(num * ten8) / ten8; 
}

function Round4(num)
{
    var ten4 = Math.pow(10, 4);
    return Math.round(num * ten4) / ten4; 
}

