MapPoint Forums

MapForums

Community of MapPoint and Bing Maps Users and Developers




Virtual Earth Map Control Script

This is a discussion on Virtual Earth Map Control Script within the Bing Maps and MapPoint Web Service forums, part of the Map Forums category; From -- http://virtualearth.msn.com/js/MapControl.js Code: function VE_MapControl(latitude, longitude, zoomLevel, mapStyle, position, x, y, width, height) { this.index = VE_MapControl.controlList.length; this.latitude = ...


Go Back   MapPoint Forums > Map Forums > Bing Maps and MapPoint Web Service

Today's Posts Twitter Feed Register Blogs FAQ Members List Calendar Search Today's Posts Mark Forums Read
  1 links from elsewhere to this Post. Click to view. #1 (permalink)  
Old 08-01-2005
Eric Frost's Avatar
Senior Member
Black Belt
 
Join Date: Jul 1992
Posts: 3,420
Blog Entries: 3
Virtual Earth Map Control Script

From -- http://virtualearth.msn.com/js/MapControl.js

Code:
function VE_MapControl(latitude, longitude, zoomLevel, mapStyle, position, x, y, width, height)
    {
    this.index = VE_MapControl.controlList.length;
    this.latitude = latitude;
    this.longitude = longitude;
    this.preferredLatitude = latitude;
    this.preferredLongitude = longitude;
    this.offsetLeft = 0;
    this.offsetTop = 0;
    this.zoomLevel = this._ValidateZoomLevel(latitude, longitude, zoomLevel);
    this.prevZoomLevel = this.zoomLevel;
    this.mapStyle = this._ValidateMapStyle(mapStyle);
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    this.tileWidth = 0;
    this.tileHeight = 0;
    this.dragging = false;
    this.dragPan = false;
    this.panLatitude = null;
    this.panLongitude = null;
    this.keyboardPan = false;
    this.tiles = new Array();
    this.oldTiles = null;
    this.unusedTiles = new Array();
    this.lastMouseX = 0;
    this.lastMouseY = 0;
    this.originX = 0;
    this.originY = 0;
    this.zoomCounter = 0;
    this.zooming = false;
    this.panning = false;
    this.panCounter = 0;
    this.panningX = 0;
    this.panningY = 0;
    this.debug = false;
    this.onMouseClick = null;
    this.onMouseDown = null;
    this.onMouseUp = null;
    this.onStartContinuousPan = null;
    this.onEndContinuousPan = null;
    this.onStartZoom = null;
    this.onEndZoom = null;
    this.pushpins = new Array();
    this.unusedPushpins = new Array();
    this.element = document.createElement("div");
    this.element.style.overflow = "hidden";
    this.element.style.padding = "0";
    this.element.style.margin = "0";
    this.element.style.position = position;
    this.element.style.left = x;
    this.element.style.top = y;
    this.element.style.width = width;
    this.element.style.height = height;
    this.element.style.zIndex = VE_MapControl.containerZIndex;
    this.map = document.createElement("div");
    this.map.style.position = "absolute";
    this.map.style.top = "0px";
    this.map.style.left = "0px";
    this.map.style.padding = "0";
    this.map.style.margin = "0";
    this.map.style.zIndex = VE_MapControl.mapZIndex;
    this.element.appendChild(this.map);
    this.keyboard = document.createElement("input");
    this.keyboard.style.position = "absolute";
    this.keyboard.style.top = "0px";
    this.keyboard.style.left = "0px";
    this.keyboard.style.width = "1px";
    this.keyboard.style.height = "1px";
    this.keyboard.style.padding = "0";
    this.keyboard.style.margin = "0";
    this.keyboard.style.zIndex = VE_MapControl.kbInputZIndex;
    this.keyboard.onkeydown = VE_MapControl._KeyDown;
    this.keyboard.onkeyup = VE_MapControl._KeyUp;
    this.element.appendChild(this.keyboard);
    this._CreateCopyright();
    this._SetBackgroundColor();
    this.SetCenterAndZoom(latitude, longitude, zoomLevel);
    VE_MapControl.controlList.push(this);
    }

VE_MapControl.prototype.SetCenter = function(latitude, longitude)
    {
    this.SetCenterAndZoom(latitude, longitude, this.zoomLevel);
    }

VE_MapControl.prototype.SetMapStyle = function(mapStyle)
    {
    if (this.panning || this.zooming)
        {
        return;
        }

    mapStyle = this._ValidateMapStyle(mapStyle);

    if (this.mapStyle != mapStyle)
        {
        this.mapStyle = mapStyle;
        this._SetBackgroundColor();
        this.latitude = this.GetCenterLatitude();
        this.longitude = this.GetCenterLongitude();
        this._StartMap();
        this._RepositionPushpins();
        this._UpdateCopyright();
        }
    }

VE_MapControl.prototype._ValidateMapStyle = function(s)
    {
    if (s == 'a' || s == 'h')
        return s;

    else
        return 'r';
    }

VE_MapControl.prototype._SetBackgroundColor = function()
    {
    var bg = "#f2ede4";

    if (this.mapStyle == 'a' || this.mapStyle == 'h')
        bg = "#404040";

    this.element.style.background = bg;
    }

VE_MapControl.prototype.GetCenterLatitude = function()
    {
    return this.latitude;
    }

VE_MapControl.prototype.GetCenterLongitude = function()
    {
    return this.longitude;
    }

VE_MapControl.prototype._ComputeCenterPoint = function(capture)
    {
    this.latitude = this.GetLatitude(this.height / 2);
    this.longitude = this.GetLongitude(this.width / 2);

    if (capture)
        {
        this.preferredLatitude = this.latitude;
        this.preferredLongitude = this.longitude;
        }
    }

VE_MapControl.prototype.GetLatitude = function(y)
    {
    return this._YToLat(this.originY + this.offsetY + y);
    }

VE_MapControl.prototype.GetLongitude = function(x)
    {
    return this._XToLon(this.originX + this.offsetX + x);
    }

VE_MapControl.prototype.GetY = function(latitude)
    {
    return this._LatToY(latitude) - this.originY - this.offsetY;
    }

VE_MapControl.prototype.GetX = function(longitude)
    {
    return this._LonToX(longitude) - this.originX - this.offsetX;
    }

VE_MapControl.prototype.GetZoomLevel = function()
    {
    return this.zoomLevel;
    }

VE_MapControl.prototype.GetMapStyle = function()
    {
    return this.mapStyle;
    }

VE_MapControl.prototype.GetMetersPerPixel = function(latitude, zoomLevel)
    {
    if (!latitude)
        {
        latitude = this.latitude;
        }

    if (!zoomLevel)
        {
        zoomLevel = this.zoomLevel;
        }

    return Math.cos(DegToRad(latitude)) * this._MetersPerPixel(zoomLevel);
    }

VE_MapControl.prototype.Resize = function(width, height)
    {
    if (!width || !height || width <= 0 || height <= 0)
        {
        return;
        }

    this.width = width;
    this.height = height;
    this.element.style.width = width;
    this.element.style.height = height;
    this.PanToLatLong(this.latitude, this.longitude);
    this._RepositionCopyright();
    }

VE_MapControl.prototype._ClearTiles = function()
    {
    var t = this.tiles;
    var u = this.unusedTiles;
    var m = this.map;

    if (!t || t.length == 0)
        return;

    while (t.length > 0)
        {
        var tile = t.pop();
        tile.RemoveFromMap();
        tile.img.src = VE_MapControl.emptyTile;
        u.push(tile);
        }
    }

VE_MapControl.prototype._TileSize = function()
    {
    return 256;
    }

VE_MapControl.prototype._StartMap = function()
    {
    this._ClearTiles();
    var m = this.map;
    m.style.top = "0px";
    m.style.left = "0px";
    this.originX = Math.round(this._LonToXAtZ(this.longitude, this.zoomLevel) - this.width / 2);
    this.originY = Math.round(this._LatToYAtZ(this.latitude, this.zoomLevel) - this.height / 2);
    this.offsetX = 0;
    this.offsetY = 0;
    var s = this._TileSize();
    var ox = this.originX;
    var oy = this.originY;
    var b = VE_MapControl.buffer;
    var w = this.width;
    var h = this.height;
    var x1 = Math.floor((ox - b) / s);
    var y1 = Math.floor((oy - b) / s);
    var x2 = Math.floor((ox + w + b) / s);
    var y2 = Math.floor((oy + h + b) / s);
    x1 = Math.max(0, x1);
    y1 = Math.max(0, y1);

    for (var x = x1; x <= x2; x++)
        for (var y = y1; y <= y2; y++)
            {
            this._RequestTile(x, y, this.zoomLevel, s, this.mapStyle);
            }
    }

VE_MapControl.prototype._UpdateMap = function()
    {
    var m = this.map;
    var s = this._TileSize();
    var ox = this.originX + this.offsetX;
    var oy = this.originY + this.offsetY;
    var w = this.width;
    var h = this.height;
    var b = VE_MapControl.buffer;
    var t = this.tiles;
    var x1 = Math.floor((ox - b) / s);
    var y1 = Math.floor((oy - b) / s);
    var x2 = Math.floor((ox + w + b) / s);
    var y2 = Math.floor((oy + h + b) / s);
    var oldx1 = 0;
    var oldy1 = 0;
    var oldx2 = 0;
    var oldy2 = 0;
    var first = true;
    var newTiles = new Array();

    for (var i = 0; i < t.length; i++)
        {
        var tile = t[i];
        var x = tile.tx;
        var y = tile.ty;

        if (x < x1 || x > x2 || y < y1 || y > y2)
            {
            tile.RemoveFromMap();
            }

        else
            {
            if (first)
                {
                oldx1 = x;
                oldy1 = y;
                oldx2 = x;
                oldy2 = y;
                first = false;
                }

            else
                {
                oldx1 = Math.min(oldx1, x);
                oldy1 = Math.min(oldy1, y);
                oldx2 = Math.max(oldx2, x);
                oldy2 = Math.max(oldy2, y);
                }

            newTiles.push(tile);
            }
        }

    this.tiles = newTiles;
    x1 = Math.max(0, x1);
    y1 = Math.max(0, y1);

    for (var x = x1; x <= x2; x++)
        for (var y = y1; y <= y2; y++)
            {
            if (x < oldx1 || x > oldx2 || y < oldy1 || y > oldy2)
                this._RequestTile(x, y, this.zoomLevel, s, this.mapStyle);
            }
    }

VE_MapControl.worldBounds = { z: 1, x1: 0, y1: 0, x2: 2, y2: 2
};

VE_MapControl.usaBounds = { z: 10, x1: 172, y1: 356, x2: 332, y2: 444
};

VE_MapControl.prototype._GetBounds = function(zoom)
    {
    if (zoom >= VE_MapControl.usaBounds.z)
        return VE_MapControl.usaBounds;

    return VE_MapControl.worldBounds;
    }

VE_MapControl.prototype._ClipDeltaX = function(deltaX)
    {
    var b = this._GetBounds(this.zoomLevel);
    return this._ClipDelta(deltaX, this.width, this.originX + this.offsetX, b.z, b.x1, b.x2);
    }

VE_MapControl.prototype._ClipDeltaY = function(deltaY)
    {
    var b = this._GetBounds(this.zoomLevel);
    return this._ClipDelta(deltaY, this.height, this.originY + this.offsetY, b.z, b.y1, b.y2);
    }

VE_MapControl.prototype._ClipDelta = function(delta, size, offset, bz, b1, b2)
    {
    var z = this.zoomLevel;
    var s = this._TileSize();
    var min = s * (b1 << (z - bz));
    var max = s * (b2 << (z - bz));

    if (size > (max - min))
        {
        return ((max - min - size) / 2) - offset + min;
        }

    else if (offset + delta < min)
        {
        return min - offset;
        }

    else if (offset + size + delta > max)
        {
        return max - offset - size;
        }

    return delta;
    }

VE_MapControl.prototype._ClipLatitude = function(latitude, zoom)
    {
    var y = this._LatToYAtZ(latitude, zoom);
    var b = this._GetBounds(zoom);
    y = this._ClipAbsolute(y, zoom, this.height, b.z, b.y1, b.y2);
    return this._YToLatAtZ(y, zoom);
    }

VE_MapControl.prototype._ClipLongitude = function(longitude, zoom)
    {
    var x = this._LonToXAtZ(longitude, zoom);
    var b = this._GetBounds(zoom);
    x = this._ClipAbsolute(x, zoom, this.width, b.z, b.x1, b.x2);
    return this._XToLonAtZ(x, zoom);
    }

VE_MapControl.prototype._ClipAbsolute = function(abs, z, size, bz, b1, b2)
    {
    var s = this._TileSize();
    var min = s * (b1 << (z - bz));
    var max = s * (b2 << (z - bz));
    var half = size / 2;

    if (size > max - min)
        {
        return (max - min) / 2;
        }

    else if (abs < min + half)
        {
        return min + half;
        }

    else if (abs + half > max)
        {
        return max - half;
        }

    return abs;
    }

VE_MapControl.prototype._ValidateZoomLevel = function(latitude, longitude, z)
    {
    if (z < VE_MapControl.minZoom)
        {
        return VE_MapControl.minZoom;
        }

    if (z < VE_MapControl.usaBounds.z)
        {
        return z;
        }

    var y = this._LatToYAtZ(latitude, z);
    var x = this._LonToXAtZ(longitude, z);
    var b = VE_MapControl.usaBounds;
    var s = this._TileSize();
    var minX = s * (b.x1 << (z - b.z));
    var maxX = s * (b.x2 << (z - b.z));
    var minY = s * (b.y1 << (z - b.z));
    var maxY = s * (b.y2 << (z - b.z));

    if (minX < x && x < maxX && minY < y && y < maxY)
        {
        return Math.min(VE_MapControl.maxZoom, z);
        }

    else
        {
        return Math.min(VE_MapControl.usaBounds.z - 1, z);
        }
    }

VE_MapControl.GetMouseX = function(e)
    {
    var posX = 0;

    if (e.pageX)
        {
        posX = e.pageX;
        }

    else if (e.clientX)
        {
        posX = e.clientX + document.body.scrollLeft;
        }

    return posX;
    }

VE_MapControl.GetMouseY = function(e)
    {
    var posY = 0;

    if (e.pageY)
        {
        posY = e.pageY;
        }

    else if (e.clientY)
        {
        posY = e.clientY + document.body.scrollTop;
        }

    return posY;
    }

VE_MapControl.GetMouseScrollDelta = function(e)
    {
    if (e.wheelDelta)
        {
        return e.wheelDelta;
        }

    else if (e.detail)
        {
        return -e.detail;
        }

    return 0;
    }

VE_MapControl.GetTarget = function(e)
    {
    if (!e)
        e = window.event;

    var t = null;

    if (e.srcElement)
        t = e.srcElement;

    else if (e.target)
        t = e.target;

    if (t.nodeType == 3)
        t = targ.parentNode;

    return t;
    }

VE_MapControl.prototype._CreateCopyright = function()
    {
    var bg = document.createElement("div");
    bg.unselectable = "on";

    with (bg.style)
        {
        position = "absolute";
        width = "230px";
        height = "28px";
        top = "1px";
        left = "1px";
        zIndex = 30;
        color = "Black";
        display = "none";
        font = "7pt Verdana";
        textAlign = "right";
        cursor = "pointer";
        }

    var fg = document.createElement("div");
    fg.unselectable = "on";

    with (fg.style)
        {
        position = "absolute";
        width = "230px";
        height = "28px";
        top = "0px";
        left = "0px";
        zIndex = 31;
        color = "White";
        display = "none";
        font = "7pt Verdana";
        textAlign = "right";
        cursor = "pointer";
        }

    this.copyrightBg = bg;
    this.copyrightFg = fg;
    this._RepositionCopyright();
    this.element.appendChild(bg);
    this.element.appendChild(fg);
    }

VE_MapControl.prototype._RepositionCopyright = function()
    {
    with (this.copyrightBg.style)
        {
        top = (this.height - 28) + "px";
        left = (this.width - 240) + "px";
        display = "block";
        }

    with (this.copyrightFg.style)
        {
        top = (this.height - 29) + "px";
        left = (this.width - 241) + "px";
        display = "block";
        }
    }

VE_MapControl.prototype._UpdateCopyright = function()
    {
    var z = this.zoomLevel;
    var s = this.mapStyle;
    var c = "© 2005 Microsoft Corp";

    if (z >= 5 && (s == "r" || s == "h"))
        {
        c += "  © 2004 NAVTEQ";
        }

    if (s == "h" || s == "a")
        {
        c += "
Image courtesy of ";

        if (z <= 9)
            {
            c += "NASA";
            }

        else
            {
            c += "USGS";
            }
        }

    this.copyrightBg.innerHTML = c;
    this.copyrightFg.innerHTML = c;
    this._RepositionCopyright();
    }

VE_MapControl.prototype._MetersPerPixel = function(zl)
    {
    return VE_MapControl.baseMetersPerPixel / (1 << zl);
    }

VE_MapControl.prototype._XToLonAtZ = function(x, zl)
    {
    var metersPerPixel = this._MetersPerPixel(zl);
    var metersX = x * metersPerPixel - VE_MapControl.offsetMeters;
    return RadToDeg(metersX / VE_MapControl.earthRadius);
    }

VE_MapControl.prototype._LonToXAtZ = function(longitude, zl)
    {
    var metersX = VE_MapControl.earthRadius * DegToRad(longitude);
    var metersPerPixel = this._MetersPerPixel(zl);
    return Math.round((metersX + VE_MapControl.offsetMeters) / metersPerPixel);
    }

VE_MapControl.prototype._YToLatAtZ = function(y, zl)
    {
    var metersPerPixel = this._MetersPerPixel(zl);
    var metersY = VE_MapControl.offsetMeters - y * metersPerPixel;
    return RadToDeg(Math.PI / 2 - 2 * Math.atan(Math.exp(-metersY / VE_MapControl.earthRadius)));
    }

VE_MapControl.prototype._LatToYAtZ = function(latitude, zl)
    {
    var sinLat = Math.sin(DegToRad(latitude));
    var metersY = VE_MapControl.earthRadius / 2 * Math.log((1 + sinLat) / (1 - sinLat));
    var metersPerPixel = this._MetersPerPixel(zl);
    return Math.round((VE_MapControl.offsetMeters - metersY) / metersPerPixel);
    }

VE_MapControl.prototype._XToLon = function(x)
    {
    return this._XToLonAtZ(x, this.zoomLevel);
    }

VE_MapControl.prototype._LonToX = function(longitude)
    {
    return this._LonToXAtZ(longitude, this.zoomLevel);
    }

VE_MapControl.prototype._YToLat = function(y)
    {
    return this._YToLatAtZ(y, this.zoomLevel);
    }

VE_MapControl.prototype._LatToY = function(latitude)
    {
    return this._LatToYAtZ(latitude, this.zoomLevel);
    }

VE_MapControl.prototype._XToXAtZ = function(x, z1, z2)
    {
    var lon = this._XToLonAtZ(x, z1);
    return this._LonToXAtZ(lon, z2);
    }

VE_MapControl.prototype._YToYAtZ = function(y, z1, z2)
    {
    var lat = this._YToLatAtZ(y, z1);
    return this._LatToYAtZ(lat, z2);
    }

function DegToRad(d)
    {
    return d * Math.PI / 180.0;
    }

function RadToDeg(r)
    {
    return r * 180.0 / Math.PI;
    }

VE_MapControl.prototype.Debug = function(enabled)
    {
    var t = this.tiles;

    for (var i = 0; i < t.length; i++)
        {
        t[i].img.style.border = enabled ? "1px dashed red" : "0";

        if (enabled)
            {
            this.map.appendChild(t[i].overlay);
            }

        else
            {
            if (t[i].overlay.parentNode == this.map)
                {
                this.map.removeChild(t[i].overlay);
                }
            }
        }

    var u = this.unusedTiles;

    for (var i = 0; i < u.length; i++)
        {
        u[i].img.style.border = enabled ? "1px dashed red" : "0";
        }

    this.debug = enabled;
    }

function VE_MapEvent(srcMapControl, latitude, longitude, zoomLevel)
    {
    this.srcMapControl = srcMapControl;
    this.latitude = latitude;
    this.longitude = longitude;
    this.zoomLevel = zoomLevel;
    }

VE_MapControl.prototype._CreateEvent = function(latitude, longitude, zoomLevel)
    {
    if (!latitude)
        latitude = this.GetCenterLatitude();

    if (!longitude)
        longitude = this.GetCenterLongitude();

    if (!zoomLevel)
        zoomLevel = this.zoomLevel;

    return new VE_MapEvent(this, latitude, longitude, this.zoomLevel);
    }

VE_MapControl.prototype._CallMouseDown = function(e)
    {
    if (!e)
        e = this._CreateEvent();

    if (this.onMouseDown)
        this.onMouseDown(e);
    }

VE_MapControl.prototype._CallMouseUp = function(e)
    {
    if (!e)
        e = this._CreateEvent();

    if (this.onMouseUp)
        this.onMouseUp(e);
    }

VE_MapControl.prototype._CallMouseClick = function(e)
    {
    if (!e)
        e = this._CreateEvent();

    if (this.onMouseClick)
        this.onMouseClick(e);
    }

VE_MapControl.prototype._CallStartContinuousPan = function(e)
    {
    if (!e)
        e = this._CreateEvent();

    if (this.onStartContinuousPan)
        this.onStartContinuousPan(e);
    }

VE_MapControl.prototype._CallEndContinuousPan = function(e)
    {
    if (!e)
        e = this._CreateEvent();

    if (this.onEndContinuousPan)
        this.onEndContinuousPan(e);
    }

VE_MapControl.prototype._CallStartZoom = function(e)
    {
    if (!e)
        e = this._CreateEvent();

    if (this.onStartZoom)
        this.onStartZoom(e);
    }

VE_MapControl.prototype._CallEndZoom = function(e)
    {
    if (!e)
        e = this._CreateEvent();

    if (this.onEndZoom)
        this.onEndZoom(e);
    }

VE_MapControl.controlList = new Array();
VE_MapControl.altitudes = [2000, 500, 150, 50, 25, 12, 6, 3, 1];
VE_MapControl.scaledRadius = 5429123.84;
VE_MapControl.buffer = 100;
VE_MapControl.dragElement = null;
VE_MapControl.dragControl = null;
VE_MapControl.animatedMovementEnabled = 1;
VE_MapControl.zoomTotalSteps = 5;
VE_MapControl.tileUrlPrefixes
    = ["http://tiles0.virtualearth.msn.com/tiles/", "http://tiles1.virtualearth.msn.com/tiles/",
      "http://tiles2.virtualearth.msn.com/tiles/", "http://tiles3.virtualearth.msn.com/tiles/"];
VE_MapControl.tileVersion = 1;
VE_MapControl.keyboardPanSpeed = 15;
VE_MapControl.panToLatLongSpeed = 15;
VE_MapControl.earthRadius = 6378137;
VE_MapControl.minZoom = 1;
VE_MapControl.maxZoom = 19;
VE_MapControl.requests = new Array();
VE_MapControl.offsetMeters = 20971520;
VE_MapControl.baseMetersPerPixel = 163840;
VE_MapControl.emptyTile = "i/spacer.gif";
VE_MapControl.minLatitude = -85;
VE_MapControl.maxLatitude = 85;
VE_MapControl.minLongitude = -180;
VE_MapControl.maxLongitude = 180;
VE_MapControl.kbInputZIndex = 0;
VE_MapControl.containerZIndex = 0;
VE_MapControl.mapZIndex = 1;
VE_MapTile.baseZIndex = 2;
VE_MapTile.swapZIndex = 1;
VE_MapTile.debugZIndex = 3;
VE_MapPushpin.baseZIndex = 11;
VE_MapPushpin.topZIndex = 20;
VE_MapControl.FindControlByInput = function(input)
    {
    var c = VE_MapControl.controlList;

    for (var i = 0; i < c.length; i++)
        {
        if (c[i].keyboard == input)
            return c[i];
        }

    return null;
    }

VE_MapControl._KeyDown = function(e)
    {
    if (!e)
        var e = window.event;

    var t = VE_MapControl.GetTarget(e);
    var c = VE_MapControl.FindControlByInput(t);
    var s = VE_MapControl.keyboardPanSpeed;
    var x = c.panningX;
    var y = c.panningY;

    switch (e.keyCode)
        {
        case 9:
            if (c.panning && c.keyboardPan)
                {
                c.StopContinuousPan();
                }

            return true;

        case 37:
            x = -s;

            break;

        case 38:
            y = -s;

            break;

        case 39:
            x = s;

            break;

        case 40:
            y = s;

            break;

        case 107:
        case 187:
        case 61:
        case 43:
            x = 0;

            y = 0;
            c.ZoomIn();
            break;

        case 109:
        case 189:
            x = 0;

            y = 0;
            c.ZoomOut();
            break;

        default: return false;
        }

    if (x || y)
        c.ContinuousPan(x, y, null, true);

    return false;
    }

VE_MapControl._KeyUp = function(e)
    {
    if (!e)
        var e = window.event;

    var t = VE_MapControl.GetTarget(e);
    var c = VE_MapControl.FindControlByInput(t);
    var s = VE_MapControl.keyboardPanSpeed;
    var x = c.panningX;
    var y = c.panningY;

    switch (e.keyCode)
        {
        case 37:
            x = 0;

            break;

        case 38:
            y = 0;

            break;

        case 39:
            x = 0;

            break;

        case 40:
            y = 0;

            break;

        default: return false;
        }

    c.ContinuousPan(x, y, null, true);
    return false;
    }

VE_MapControl._MouseDown = function(e)
    {
    if (!e)
        e = window.event;

    e.cancelBubble = true;
    var t = VE_MapControl.GetTarget(e);
    var c = VE_MapControl.FindControlByTileImage(t);

    if (!c || c.zooming)
        {
        return false;
        }

    if (c.panning)
        {
        c.StopContinuousPan();
        }

    c.keyboard.focus();
    c.dragging = true;
    c.dragPan = false;
    c.lastMouseX = VE_MapControl.GetMouseX(e);
    c.lastMouseY = VE_MapControl.GetMouseY(e);
    t.style.cursor = "move";

    if (t.setCapture)
        t.setCapture();

    VE_MapControl.dragElement = t;
    VE_MapControl.dragControl = c;
    c._CallStartContinuousPan();
    return false;
    }

VE_MapControl._MouseUp = function(e)
    {
    if (!e)
        e = window.event;

    if (VE_MapControl.dragElement)
        {
        var c = VE_MapControl.dragControl;

        if (!c)
            {
            return false;
            }

        c.dragging = false;
        c._ComputeCenterPoint(true);
        VE_MapControl.dragElement.style.cursor = "pointer";

        if (VE_MapControl.dragElement.releaseCapture)
            VE_MapControl.dragElement.releaseCapture();

        if (c.dragPan)
            c._CallEndContinuousPan();

        c.dragPan = false;
        var x = VE_MapControl.GetMouseX(e) - c.x;
        var y = VE_MapControl.GetMouseY(e) - c.y;
        c._CallMouseClick(c._CreateEvent(c.GetLatitude(y), c.GetLongitude(x)));
        }

    return false;
    }

VE_MapControl._MouseDoubleClick = function(e)
    {
    if (!e)
        e = window.event;

    var c = VE_MapControl.dragControl;

    if (!c || c.panning || c.zooming)
        {
        return false;
        }

    var lat = c._YToLat(c.originY + c.offsetY + VE_MapControl.GetMouseY(e) - c.offsetTop - c.y);
    var lon = c._XToLon(c.originX + c.offsetX + VE_MapControl.GetMouseX(e) - c.offsetLeft - c.x);

    if (e.altKey)
        {
        if (c.zoomLevel == VE_MapControl.minZoom)
            c.PanToLatLong(lat, lon);

        else
            c.SetCenterAndZoom(lat, lon, c.zoomLevel - 1);
        }

    else
        {
        if (c.zoomLevel + 1 != c._ValidateZoomLevel(lat, lon, c.zoomLevel + 1))
            c.PanToLatLong(lat, lon);

        else
            c.SetCenterAndZoom(lat, lon, c.zoomLevel + 1);
        }

    return false;
    }

VE_MapControl._MouseMove = function(e)
    {
    if (!e)
        e = window.event;

    if (VE_MapControl.dragElement)
        {
        var c = VE_MapControl.dragControl;

        if (!c)
            {
            return false;
            }

        if (c.dragging)
            {
            var x = VE_MapControl.GetMouseX(e);
            var y = VE_MapControl.GetMouseY(e);
            c.PanMap(c.lastMouseX - x, c.lastMouseY - y);
            c.lastMouseX = x;
            c.lastMouseY = y;
            c.dragPan = true;

            if (e.cancelBubble)
                e.cancelBubble = true;
            }
        }

    return false;
    }

VE_MapControl._MouseWheel = function(e)
    {
    if (!e)
        e = window.event;

    var t = VE_MapControl.GetTarget(e);
    var c = VE_MapControl.FindControlByTileImage(t);

    if (!c || c.panning || c.zooming)
        {
        return false;
        }

    var delta = VE_MapControl.GetMouseScrollDelta(e);

    if (delta > 0)
        {
        c.ZoomIn();
        }

    else if (delta < 0)
        {
        c.ZoomOut();
        }

    e.cancelBubble = true;
    return false;
    }

VE_MapControl._ContextMenu = function(e)
    {
    if (!e)
        e = window.event;

    e.cancelBubble = true;
    var t = VE_MapControl.GetTarget(e);
    var c = VE_MapControl.FindControlByTileImage(t);

    if (!c || c.debug)
        {
        return true;
        }

    return false;
    }

VE_MapControl.prototype.PanMap = function(deltaX, deltaY)
    {
    if (deltaX == 0 && deltaY == 0)
        {
        return;
        }

    deltaX = this._ClipDeltaX(deltaX);
    deltaY = this._ClipDeltaY(deltaY);
    this.offsetX += deltaX;
    this.offsetY += deltaY;
    this.map.style.top = -this.offsetY + "px";
    this.map.style.left = -this.offsetX + "px";
    this._UpdateMap(deltaX, deltaY);
    this._UpdateCopyright();
    }

VE_MapControl.prototype.ContinuousPan = function(deltaX, deltaY, count, keyboardPan)
    {
    if (this.zooming)
        {
        return;
        }

    if (!count)
        {
        count = -1;
        }

    this.panningX = deltaX;
    this.panningY = deltaY;
    this.panCounter = count;

    if (!deltaX && !deltaY)
        {
        this.StopContinuousPan();
        return;
        }

    this.keyboardPan = keyboardPan;

    if (!this.panning)
        {
        this.panning = true;
        VE_MapControl._StepPan(this.index);
        this._CallStartContinuousPan();
        }
    }

VE_MapControl._StepPan = function(controlIndex)
    {
    var c = VE_MapControl.controlList[controlIndex];

    if (c.panning)
        {
        c.PanMap(c.panningX, c.panningY);

        if (c.panCounter > 0)
            c.panCounter--;

        if (c.panCounter != 0)
            window.setTimeout("VE_MapControl._StepPan(" + controlIndex + ")", 10);

        else
            c.StopContinuousPan();
        }
    }

VE_MapControl.prototype.StopContinuousPan = function()
    {
    this.panningX = 0;
    this.panningY = 0;
    this.panning = false;
    this.keyboardPanning = false;

    if (this.panLatitude != null && this.panLongitude != null)
        {
        var dx = this._LonToX(this.panLongitude) - (this.originX + this.offsetX + this.width / 2);
        var dy = this._LatToY(this.panLatitude) - (this.originY + this.offsetY + this.height / 2);
        this.PanMap(dx, dy);
        this.latitude = this.panLatitude;
        this.longitude = this.panLongitude;
        this.preferredLatitude = this.latitude;
        this.preferredLongitude = this.longitude;
        this.panLatitude = null;
        this.panLongitude = null;
        }

    else
        {
        this._ComputeCenterPoint(true);
        }

    this._CallEndContinuousPan();
    }

VE_MapControl.prototype.PanToLatLong = function(latitude, longitude)
    {
    this.panLatitude = latitude;
    this.panLongitude = longitude;
    var x = this._LonToX(longitude);
    var y = this._LatToY(latitude);
    var dx = x - (this.originX + this.offsetX + this.width / 2);
    var dy = y - (this.originY + this.offsetY + this.height / 2);
    var d = Math.sqrt(dx * dx + dy * dy);

    if (!VE_MapControl.animatedMovementEnabled || Math.abs(dx) > 2 * this.width || Math.abs(dy) > 2 * this.height
            || d > 1.5 * Math.sqrt(this.width * this.width + this.height * this.height))
        {
        this.SetCenter(latitude, longitude);
        return;
        }

    var a = Math.atan2(dy, dx);
    var s = VE_MapControl.panToLatLongSpeed;
    var c = Math.ceil(d / s);
    s = Math.round(d / c);
    dx = Math.cos(a) * s;
    dy = Math.sin(a) * s;
    this.ContinuousPan(dx, dy, c);
    }

VE_MapControl.prototype.AddPushpin = function(id, lat, lon, width, height, className, innerHtml, zIndex)
    {
    var x = Math.round(this._LonToX(lon) - this.originX);
    var y = Math.round(this._LatToY(lat) - this.originY);
    var pin = null;

    if (this.unusedPushpins.length > 0)
        {
        pin = this.unusedPushpins.pop();
        pin.Recycle(id, lat, lon, x, y, width, height, className, innerHtml, zIndex);
        }

    else
        {
        pin = new VE_MapPushpin(this, id, lat, lon, x, y, width, height, className, innerHtml, zIndex);
        }

    this.pushpins.push(pin);
    this.map.appendChild(pin.el);
    return pin.el;
    }

VE_MapControl.prototype.RemovePushpin = function(id)
    {
    for (var i = 0; i < this.pushpins.length; i++)
        {
        var p = this.pushpins[i];

        if (p.id == id)
            {
            this.pushpins.splice(i, 1);
            this.map.removeChild(p.el);
            this.unusedPushpins.push(p);
            p.el.vePushpin = null;
            return;
            }
        }
    }

VE_MapControl.prototype.ClearPushpins = function()
    {
    var p = this.pushpins;

    while (p.length > 0)
        this.map.removeChild(p.pop().el);
    }

VE_MapControl.prototype._RepositionPushpins = function()
    {
    for (var i = 0; i < this.pushpins.length; i++)
        {
        var p = this.pushpins[i];
        var x = Math.round(this._LonToX(p.lon) - this.originX);
        var y = Math.round(this._LatToY(p.lat) - this.originY);
        p.SetCurrentState(x, y);
        p.PrecomputeSteps();
        p.SetFactor(0);
        }
    }

function VE_MapPushpin(c, id, lat, lon, x, y, w, h, className, innerHtml, zIndex)
    {
    this.c = c;
    this.id = id;
    this.lat = lat;
    this.lon = lon;
    this.w = w;
    this.h = h;
    var n = VE_MapControl.zoomTotalSteps + 1;
    this.xs = new Array(n);
    this.ys = new Array(n);
    var el = document.createElement("div");
    el.id = id;
    el.vePushpin = this;
    el.className = className;
    el.style.position = "absolute";
    el.style.zIndex = zIndex;
    el.innerHTML = innerHtml;
    el.ondblclick = VE_MapPushpin._MouseDoubleClick;
    el.onmousewheel = VE_MapPushpin._MouseWheel;
    el.unselectable = "on";
    this.el = el;
    this.SetCurrentState(x, y);
    this.SetNextState(x, y);
    this.PrecomputeSteps();
    this.SetFactor(0);
    }

VE_MapPushpin.prototype.Recycle = function(id, lat, lon, x, y, w, h, className, innerHtml, zIndex)
    {
    this.id = id;
    this.lat = lat;
    this.lon = lon;
    this.w = w;
    this.h = h;
    this.el.id = id;
    this.el.className = className;
    this.el.style.zIndex = zIndex;
    this.el.innerHTML = innerHtml;
    this.el.vePushpin = this;
    this.SetCurrentState(x, y);
    this.SetNextState(x, y);
    this.PrecomputeSteps();
    this.SetFactor(0);
    }

VE_MapPushpin.prototype.SetCurrentState = function(x, y)
    {
    this.x = x;
    this.y = y;
    }

VE_MapPushpin.prototype.SetNextState = function(x, y)
    {
    this._x = x;
    this._y = y;
    }

VE_MapPushpin.prototype.ClearSteps = function()
    {
    var n = VE_MapControl.zoomTotalSteps;

    for (var i = 0; i <= n; i++)
        {
        this.xs[i] = this.x;
        this.ys[i] = this.y;
        }
    }

VE_MapPushpin.prototype.PrecomputeSteps = function()
    {
    var n = VE_MapControl.zoomTotalSteps;

    for (var i = 0; i <= n; i++)
        {
        var a = i / n;
        var b = 1.0 - a;
        this.xs[i] = Math.floor(b * this.x + a * this._x - this.w / 2);
        this.ys[i] = Math.floor(b * this.y + a * this._y - this.h / 2);
        }
    }

VE_MapPushpin.prototype.SetFactor = function(i)
    {
    with (this.el.style)
        {
        left = this.xs[i];
        top = this.ys[i];
        }
    }

VE_MapPushpin.prototype.SwapStates = function()
    {
    var t = 0;
    t = this.x;
    this.x = this._x;
    this._x = t;
    t = this.y;
    this.y = this._y;
    this._y = t;
    }

VE_MapPushpin._MouseDoubleClick = function(e)
    {
    if (!e)
        {
        e = window.event;
        }

    var t = VE_MapControl.GetTarget(e);

    if (!t)
        {
        return false;
        }

    var p = t.vePushpin;

    if (!p)
        {
        return false;
        }

    var c = p.c;

    if (!c || c.panning || c.zooming)
        {
        return false;
        }

    if (e.altKey)
        {
        if (c.zoomLevel == VE_MapControl.minZoom)
            c.PanToLatLong(p.lat, p.lon);

        else
            c.SetCenterAndZoom(p.lat, p.lon, c.zoomLevel - 1);
        }

    else
        {
        if (c.zoomLevel == VE_MapControl.maxZoom)
            c.PanToLatLong(p.lat, p.lon);

        else
            c.SetCenterAndZoom(p.lat, p.lon, c.zoomLevel + 1);
        }

    return false;
    }

VE_MapPushpin._MouseWheel = function(e)
    {
    if (!e)
        {
        e = window.event;
        }

    var t = VE_MapControl.GetTarget(e);

    if (!t)
        {
        return false;
        }

    var p = t.vePushpin;

    if (!p)
        {
        return false;
        }

    var c = p.c;

    if (!c || c.panning || c.zooming)
        {
        return false;
        }

    var delta = VE_MapControl.GetMouseScrollDelta(e);

    if (delta > 0)
        {
        c.ZoomIn();
        }

    else if (delta < 0)
        {
        c.ZoomOut();
        }

    e.cancelBubble = true;
    return false;
    }

VE_MapControl.prototype._RequestTile = function(x, y, zl, size, style)
    {
    var t = null;
    var max = 1 << zl;

    if (x < 0 || y < 0 || x >= max || y >= max)
        {
        return;
        }

    if (this.unusedTiles.length > 0)
        {
        t = this.unusedTiles.pop();
        t.Recycle(x, y, zl, style, (x * size - this.originX), (y * size - this.originY), size, size);
        }

    else
        {
        t = new VE_MapTile(this, x, y, zl, style, (x * size - this.originX), (y * size - this.originY), size, size);
        }

    if (t)
        {
        if (this.debug)
            {
            t.img.style.border = "1px dashed red";
            }

        this.tiles.push(t);
        }
    }

function PrefixNumber(n)
    {
    if (n >= 0)
        return "+" + n;

    return n;
    }

VE_MapControl.FindControlByTileImage = function(tileImg)
    {
    if (!tileImg.parentNode)
        {
        return;
        }

    var m = tileImg.parentNode;
    var c = VE_MapControl.controlList;

    for (var i = 0; i < c.length; i++)
        {
        if (c[i].map == m)
            return c[i];
        }

    return null;
    }

function VE_MapTile(c, tx, ty, zl, ms, x, y, w, h)
    {
    this.c = c;
    this.tx = tx;
    this.ty = ty;
    this.zl = zl;
    this.ms = ms;
    this.key = this._TileToQuadKey(zl, tx, ty);
    this.f = this._BuildFilename();
    this.id = "tile_" + this.key;
    this.loading = true;
    this.unused = false;
    var n = VE_MapControl.zoomTotalSteps + 1;
    this.xs = new Array(n);
    this.ys = new Array(n);
    this.ws = new Array(n);
    this.hs = new Array(n);
    var img = document.createElement("img");
    this.img = img;
    img.id = this.id;
    img.style.position = "absolute";
    img.style.zIndex = VE_MapTile.baseZIndex;
    img.style.cursor = "pointer";
    img.onmousedown = VE_MapControl._MouseDown;
    img.onmouseup = VE_MapControl._MouseUp;
    img.onmousemove = VE_MapControl._MouseMove;
    img.onmousewheel = VE_MapControl._MouseWheel;
    img.ondblclick = VE_MapControl._MouseDoubleClick;
    img.oncontextmenu = VE_MapControl._ContextMenu;

    if (window.addEventListener && navigator.product && navigator.product == "Gecko")
        {
        img.addEventListener("DOMMouseScroll", VE_MapControl._MouseWheel, false);
        }

    img.onload = VE_MapTile._Load;
    img.veTile = this;
    var overlay = document.createElement("div");
    this.overlay = overlay;
    overlay.style.position = "absolute";
    overlay.style.background = "white";
    overlay.style.color = "red";
    overlay.style.width = "1px";
    overlay.style.height = "20px";
    overlay.style.zIndex = VE_MapTile.debugZIndex;
    overlay.innerHTML = this.key + "
" + tx + ", " + ty;
    this.SetCurrentState(x, y, w, h);
    this.SetNextState(x, y, w, h);
    this.PrecomputeSteps();
    img.src = this.f;
    }

VE_MapTile.prototype._TileToQuadKey = function(zl, tx, ty)
    {
    var quad = "";

    for (var i = zl; i > 0; i--)
        {
        var mask = 1 << (i - 1);
        var cell = 0;

        if ((tx & mask) != 0)
            {
            cell++;
            }

        if ((ty & mask) != 0)
            {
            cell += 2;
            }

        quad += cell + "";
        }

    return quad;
    }

VE_MapTile.prototype._BuildFilename = function()
    {
    var server = ((this.tx & 1) + ((this.ty & 1) << 1)) % VE_MapControl.tileUrlPrefixes.length;
    return VE_MapControl.tileUrlPrefixes[server] + this.ms + this.key + (this.ms == 'r' ? ".png" : ".jpeg") + "?g="
        + VE_MapControl.tileVersion;
    }

VE_MapTile.prototype.Recycle = function(tx, ty, zl, ms, x, y, w, h)
    {
    this.tx = tx;
    this.ty = ty;
    this.zl = zl;
    this.ms = ms;
    this.key = this._TileToQuadKey(zl, tx, ty);
    this.f = this._BuildFilename();
    this.id = "tile_" + this.key;
    this.overlay.innerHTML = this.key + "
" + tx + ", " + ty;
    var w = this.w;
    var h = this.h;
    this.SetCurrentState(x, y, w, h);
    this.SetNextState(x, y, w, h);
    this.PrecomputeSteps();
    this.RemoveFromMap();
    this.loading = true;
    this.unused = false;
    this.img.veTile = this;
    this.img.src = this.f;
    }

VE_MapTile.prototype.SetCurrentState = function(x, y, w, h)
    {
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    }

VE_MapTile.prototype.SetNextState = function(x, y, w, h)
    {
    this._x = x;
    this._y = y;
    this._w = w;
    this._h = h;
    }

VE_MapTile.prototype.ClearSteps = function()
    {
    var n = VE_MapControl.zoomTotalSteps;

    for (var i = 0; i <= n; i++)
        {
        this.xs[i] = this.x;
        this.ys[i] = this.y;
        this.ws[i] = this.w;
        this.hs[i] = this.h;
        }
    }

VE_MapTile.prototype.PrecomputeSteps = function()
    {
    var n = VE_MapControl.zoomTotalSteps;

    for (var i = 0; i <= n; i++)
        {
        var a = i / n;
        var b = 1.0 - a;
        this.xs[i] = Math.floor(b * this.x + a * this._x);
        this.ys[i] = Math.floor(b * this.y + a * this._y);
        this.ws[i] = Math.ceil(b * this.w + a * this._w);
        this.hs[i] = Math.ceil(b * this.h + a * this._h);
        }
    }

VE_MapTile.prototype.SetFactor = function(i)
    {
    if (!this.loading)
        {
        if (i >= this.xs.length)
            i = this.xs.length - 1;

        with (this.img.style)
            {
            left = this.xs[i];
            top = this.ys[i];
            width = this.ws[i];
            height = this.hs[i];
            }

        with (this.overlay.style)
            {
            left = this.xs[i];
            top = this.ys[i];
            }
        }
    }

VE_MapTile.prototype.SwapStates = function()
    {
    var t = 0;

    with (this)
        {
        t = x;
        x = _x;
        _x = t;
        t = y;
        y = _y;
        _y = t;
        t = w;
        w = _w;
        _w = t;
        t = h;
        h = _h;
        _h = t;
        }
    }

VE_MapTile.prototype.RemoveFromMap = function()
    {
    var m = this.c.map;
    var i = this.img;
    var o = this.overlay;

    if (i.parentNode == m)
        {
        m.removeChild(i);
        }

    if (o.parentNode == m)
        {
        m.removeChild(o);
        }

    this.unused = true;
    this.img.src = VE_MapControl.emptyTile;
    }

VE_MapTile._Load = function()
    {
    if (!this.veTile)
        {
        return;
        }

    with (this.veTile)
        {
        if (!loading)
            {
            return;
            }

        loading = false;

        if (!unused)
            {
            SetFactor(c.zoomCounter);
            c.map.appendChild(img);

            if (c.debug)
                {
                c.map.appendChild(overlay);
                }
            }
        }

    this.veTile = null;
    }

VE_MapControl.prototype.SetViewport = function(lat1, lon1, lat2, lon2)
    {
    var z = 0;
    var w = Math.abs(this._LonToXAtZ(lon1, z) - this._LonToXAtZ(lon2, z));
    var h = Math.abs(this._LatToYAtZ(lat1, z) - this._LatToYAtZ(lat2, z));

    while (z < VE_MapControl.maxZoom && w < this.width && h < this.height)
        {
        z++;
        w = Math.abs(this._LonToXAtZ(lon1, z) - this._LonToXAtZ(lon2, z));
        h = Math.abs(this._LatToYAtZ(lat1, z) - this._LatToYAtZ(lat2, z));
        }

    z = Math.max(0, Math.min(VE_MapControl.maxZoom, z - 1));
    var lat = 0.5 * (lat1 + lat2);
    var lon = 0.5 * (lon1 + lon2);
    this.SetCenterAndZoom(lat, lon, z);
    }

VE_MapControl.prototype.SetBestMapView = function(l)
    {
    if (!l || l.constructor != Array)
        {
        return;
        }

    var a = l[0].latitude;
    var b = l[0].longitude;
    var c = a;
    var d = b;

    for (var i = 1; i < l.length; i++)
        {
        a = Math.min(a, l[i].latitude);
        b = Math.min(b, l[i].longitude);
        c = Math.max(c, l[i].latitude);
        d = Math.max(d, l[i].longitude);
        }

    var dLat = (c - a) * 0.1;
    var dLon = (d - b) * 0.1;
    a -= dLat;
    b -= dLon;
    c += dLat;
    d += dLon;
    this.SetViewport(VE_MapControl.ClipLatitude(a), VE_MapControl.ClipLongitude(b), VE_MapControl.ClipLatitude(c),
                     VE_MapControl.ClipLongitude(d));
    }

VE_MapControl.prototype.IncludePointInViewport = function(lat, lon)
    {
    this.SetBestMapView(new Array(this, { latitude: lat, longitude: lon
    }));
    }

VE_MapControl.ClipLatitude = function(latitude)
    {
    return VE_MapControl.Clip(latitude, VE_MapControl.minLatitude, VE_MapControl.maxLatitude);
    }

VE_MapControl.ClipLongitude = function(longitude)
    {
    return VE_MapControl.Clip(longitude, VE_MapControl.minLongitude, VE_MapControl.maxLongitude);
    }

VE_MapControl.Clip = function(n, minValue, maxValue)
    {
    if (n < minValue)
        {
        return minValue;
        }

    if (n > maxValue)
        {
        return maxValue;
        }

    return n;
    }

VE_MapControl.prototype.SetZoom = function(zoomLevel)
    {
    zoomLevel = this._ValidateZoomLevel(this.preferredLatitude, this.preferredLongitude, zoomLevel);

    if (zoomLevel == this.zoomLevel)
        {
        return;
        }

    this.SetCenterAndZoom(this.preferredLatitude, this.preferredLongitude, zoomLevel);
    }

VE_MapControl.prototype.ZoomIn = function()
    {
    if (this.zoomLevel >= VE_MapControl.maxZoom)
        return;

    this.SetZoom(this.zoomLevel + 1);
    }

VE_MapControl.prototype.ZoomOut = function()
    {
    if (this.zoomLevel <= VE_MapControl.minZoom)
        return;

    this.SetZoom(this.zoomLevel - 1);
    }

VE_MapControl.prototype.SetCenterAndZoom = function(latitude, longitude, newZoom)
    {
    newZoom = this._ValidateZoomLevel(latitude, longitude, newZoom);
    this.preferredLatitude = latitude;
    this.preferredLongitude = longitude;

    if (this.zooming || this.panning || this.dragging)
        {
        return;
        }

    this.zooming = true;
    this.prevZoomLevel = oldZoom;

    if (this.zoomLevel != newZoom)
        this._CallStartZoom();

    latitude = this._ClipLatitude(latitude, newZoom);
    longitude = this._ClipLongitude(longitude, newZoom);
    this.latitude = latitude;
    this.longitude = longitude;
    var dx = (this.width / 2) - this.GetX(longitude);
    var dy = (this.height / 2) - this.GetY(latitude);
    var distance = Math.sqrt(dx * dx + dy * dy);
    var dynamic = (distance < this.width && distance < this.height)
            && (newZoom == this.zoomLevel - 1 || newZoom == this.zoomLevel + 1)
            && VE_MapControl.animatedMovementEnabled;

    if (dynamic)
        {
        var oldOriginX = this.originX + this.offsetX;
        var oldOriginY = this.originY + this.offsetY;
        var oldZoom = this.zoomLevel;
        var newOriginX = Math.round(this._LonToXAtZ(longitude, newZoom) - this.width / 2);
        var newOriginY = Math.round(this._LatToYAtZ(latitude, newZoom) - this.height / 2);
        this.oldTiles = this.tiles;
        this.tiles = new Array();
        var ot = this.oldTiles;
        var nt = this.tiles;
        var pp = this.pushpins;

        for (var i = 0; i < ot.length; i++)
            {
            ot[i].SetCurrentState(ot[i].x - this.offsetX, ot[i].y - this.offsetY, ot[i].w, ot[i].h, ot[i].o);
            var x1 = Math.floor(this._XToXAtZ(oldOriginX + ot[i].x, oldZoom, newZoom) - newOriginX);
            var y1 = Math.floor(this._YToYAtZ(oldOriginY + ot[i].y, oldZoom, newZoom) - newOriginY);
            var x2 = Math.ceil(this._XToXAtZ(oldOriginX + ot[i].x + ot[i].w, oldZoom, newZoom) - newOriginX);
            var y2 = Math.ceil(this._YToYAtZ(oldOriginY + ot[i].y + ot[i].h, oldZoom, newZoom) - newOriginY);
            ot[i].SetNextState(x1, y1, x2 - x1, y2 - y1, 100);
            ot[i].PrecomputeSteps();
            ot[i].img.style.zIndex = VE_MapTile.baseZIndex;
            }

        for (var i = 0; i < pp.length; i++)
            {
            pp[i].SetCurrentState(pp[i].x - this.offsetX, pp[i].y - this.offsetY);
            var x = Math.floor(this._LonToXAtZ(pp[i].lon, newZoom) - newOriginX);
            var y = Math.floor(this._LatToYAtZ(pp[i].lat, newZoom) - newOriginY);
            pp[i].SetNextState(x, y);
            pp[i].PrecomputeSteps();
            }

        this.zoomLevel = newZoom;
        this.latitude = latitude;
        this.longitude = longitude;
        this._StartMap();

        for (var i = 0; i < nt.length; i++)
            {
            var x1 = Math.floor(this._XToXAtZ(newOriginX + nt[i].x, newZoom, oldZoom) - oldOriginX);
            var y1 = Math.floor(this._YToYAtZ(newOriginY + nt[i].y, newZoom, oldZoom) - oldOriginY);
            var x2 = Math.ceil(this._XToXAtZ(newOriginX + nt[i].x + nt[i].w, newZoom, oldZoom) - oldOriginX);
            var y2 = Math.ceil(this._YToYAtZ(newOriginY + nt[i].y + nt[i].h, newZoom, oldZoom) - oldOriginY);
            nt[i].SetNextState(x1, y1, x2 - x1, y2 - y1, 0);
            nt[i].SwapStates();
            nt[i].PrecomputeSteps();
            nt[i].img.style.zIndex = VE_MapTile.swapZIndex;
            }

        this.zoomCounter = 0;
        VE_MapControl._StepAnimatedZoom(this.index);
        }

    else
        {
        this.oldTiles = this.tiles;
        this.tiles = new Array();
        this.zoomLevel = newZoom;
        this.latitude = latitude;
        this.longitude = longitude;
        this._StartMap();
        this._FinalizeZoom();
        this._RepositionPushpins();
        }
    }

VE_MapControl._StepAnimatedZoom = function(controlIndex)
    {
    var c = VE_MapControl.controlList[controlIndex];

    if (!c.zooming)
        return;

    if (c.zoomCounter <= VE_MapControl.zoomTotalSteps)
        {
        var f = c.zoomCounter++;

        for (var i = 0; i < c.oldTiles.length; i++)
            {
            c.oldTiles[i].SetFactor(f);
            }

        for (var i = 0; i < c.tiles.length; i++)
            {
            c.tiles[i].SetFactor(f);
            }

        for (var i = 0; i < c.pushpins.length; i++)
            {
            c.pushpins[i].SetFactor(f);
            }

        window.setTimeout("VE_MapControl._StepAnimatedZoom(" + controlIndex + ")", 1);
        }

    else
        {
        c._FinalizeZoom();
        }
    }

VE_MapControl.prototype._FinalizeZoom = function()
    {
    var t = this.oldTiles;
    var u = this.unusedTiles;
    var m = this.map;

    if (t && t.length > 0)
        {
        while (t.length > 0)
            {
            var tile = t.pop();
            tile.RemoveFromMap();
            u.push(tile);
            }

        this.oldTiles = null;
        }

    for (var i = 0; i < this.tiles.length; i++)
        {
        this.tiles[i].SwapStates();
        this.tiles[i].ClearSteps();
        }

    for (var i = 0; i < this.pushpins.length; i++)
        {
        this.pushpins[i].SwapStates();
        this.pushpins[i].ClearSteps();
        }

    this.zooming = false;
    this.zoomCounter = 0;
    this._UpdateCopyright();

    if (this.prevZoomLevel != this.zoomLevel)
        this._CallEndZoom();
    }
__________________
~ Now taking orders for MapPoint 2010 ~
~~
~ Upgrade to MapForums Plus membership ~
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl this Post!Reddit! Wong this Post!
Reply With Quote
  #2 (permalink)  
Old 04-24-2006
Junior Member
White Belt
 
Join Date: Jul 2005
Posts: 1
SetCenterAndZoom doesn't work

My aspx page shows the map and correctly centers on the params.latitude, etc. on opening but does not do anything when it later runs a function with SetCenterAndZoom. Below is the function code.

function PageUpDate()
{
var lat = document.getElementById("LatLabel");
var lon = document.getElementById("LonLabel");
var zoom = document.getElementById("ZoomLabel");
map.SetCenterAndZoom(lat.innerText,lon.innerText,z oom.innerText);
map.Init();
}

There are 3 Labels on the page: LatLabel, LonLabel and ZoomLabel.
Any help is appreciated.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl this Post!Reddit! Wong this Post!
Reply With Quote
Reply

Tags
control, map, script, virtual earth


LinkBacks (?)
LinkBack to this Thread: http://www.mapforums.com/virtual-earth-map-control-script-4341.html

Posted By For Type Date
suegooge's bookmarks tagged with This thread Refback 11-03-2006 09:03 PM

Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)

 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is On
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads

Thread Thread Starter Forum Replies Last Post
Virtual Earth Application Eric Frost Bing Maps and MapPoint Web Service 3 11-17-2006 05:11 PM
Virtual Earth Video Eric Frost Bing Maps and MapPoint Web Service 0 08-22-2005 04:59 PM
Virtual Earth Map Control Test Eric Frost Bing Maps and MapPoint Web Service 0 08-12-2005 11:06 AM
Virtual Earth News Eric Frost Bing Maps and MapPoint Web Service 0 08-02-2005 04:52 PM
Getting Started with the Virtual Earth Map Control Eric Frost MP2K Magazine Articles 0 08-02-2005 04:39 PM


All times are GMT -5. The time now is 10:45 AM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
MP2K Magazine
Visitor Map



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67