
// Extent Methods

function zoomToLevel( level ) {
    agiMapViewer.setLevel( level );
    requestMap();
}

function zoomToInitialExtent() {
    agiMapViewer.setExtent( agiInitialRect );
    requestMap();
}

function zoomBoxIn( evt ) {
    agiZoomBox.stop();
    agiZoomBox.hide();

    if (agiZoomBox.tooSmall()) {
        var coords = agiEventCoordinator.getEventCoords( evt );
        recenter( coords );
        zoomInPlaceIn();
    }
    else
        agiMapViewer.setExtent( zoomBoxRect() );
    requestMap();
}

function zoomInPlaceIn() {
    zoomInPlace( ZOOM_STEP_SCALE );
}

function zoomInPlaceOut() {
    zoomInPlace( -ZOOM_STEP_SCALE );
}

function zoomInPlace( agiZoomFactor ) {
    var minX = parseFloat( agiMapViewer.getExtent().getLeft()   );
    var maxX = parseFloat( agiMapViewer.getExtent().getRight()  );
    var maxY = parseFloat( agiMapViewer.getExtent().getTop()    );
    var minY = parseFloat( agiMapViewer.getExtent().getBottom() );

    var xDelta = (maxX - minX) * agiZoomFactor / 2;
    var yDelta = (maxY - minY) * agiZoomFactor / 2;

    minX += xDelta;
    minY += yDelta;
    maxX -= xDelta;
    maxY -= yDelta;

    agiMapViewer.setExtent( new rect(minX, minY, maxX, maxY) );
    requestMap();
}

function zoomToActiveLayer() {
    count   = 0;
    layerId = "";
    for (id in queryLayerRows) {
        count   += 1;
        layerId  = id
    }

    if (count == 1)
        eval( mapMaker.value + ".getActiveExtent( layerId, zoomToActiveCallback );" );
    else
        alert( "Zooming to the active query layer only works when a single one is selected." );
}

function zoomToActiveCallback( returnObj ) {
    var extents = returnObj.value.split( "," );
    agiMapViewer.setExtent( new rect( extents[0], extents[1], extents[2], extents[3] ) );
    requestMap();
}

function zoomToHighlitFeature( layerID, featureID, highlightedFeatureEnvelope ) {
    var scaleFactor = 3;
    var featureRect = rectFromString( highlightedFeatureEnvelope, "," );
    featureRect.scale( scaleFactor );
    agiMapViewer.setExtent( featureRect );

    highlightFeature( layerID, featureID );
    window.focus();
}

function recenter( mouseCoords ) {
    var mapCoords = agiMapViewer.toMapPoint( mouseCoords.x, mouseCoords.y );
    agiMapViewer.recenter( mapCoords );
}

function zoomBoxRect() {
    return cornersToRect( getDragBoxCorners() );
}

function cornersToRect( corners ) {
    var ptStart = corners[0];
    var ptEnd   = corners[1];
    return new rect(ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);
}

function zoomOutRect() {
    // Calc zoom out box by finding the edge deltas vs. current view, and reversing the deltas' sign
    var corners = getDragBoxCorners();
    var ptStart = corners[0];
    var ptEnd   = corners[1];

    var left   = Math.min(ptStart.x, ptEnd.x);
    var bottom = Math.min(ptStart.y, ptEnd.y);
    var right  = Math.max(ptStart.x, ptEnd.x);
    var top    = Math.max(ptStart.y, ptEnd.y);

    var left   = 2*agiMapViewer.getExtent().getLeft()   - left;
    var bottom = 2*agiMapViewer.getExtent().getBottom() - bottom;
    var right  = 2*agiMapViewer.getExtent().getRight()  - right;
    var top    = 2*agiMapViewer.getExtent().getTop()    - top;
    return new rect(left, bottom, right, top);
}

function getDragBoxCorners() {
    if (m_sClientBrowserType == 'Netscape')  borderWidth = 4;
    else                                     borderWidth = 0;
    return [agiMapViewer.toMapPoint(agiZoomBox.getStartX() + borderWidth, agiZoomBox.getStartY() + borderWidth),
            agiMapViewer.toMapPoint(agiZoomBox.getEndX()   + borderWidth, agiZoomBox.getEndY()   + borderWidth)];
}

function rectFromString( rectString, seperator ) {
    if (rectString == null || rectString.length == 0)
        return;

    var strArray  = rectString.split( seperator );
    var selectRec = new rect(strArray[0], strArray[1], strArray[2], strArray[3]);
    return selectRec;
}

