Welcome to MapForums!

Register, sign in, or use Facebook Connect above to join in and participate in the forum.

When you are signed in, this message, the ads in this row, and the red-underlined link ads all go away.

Subscribe to receive our newsletter.
Subscribe Unsubscribe
Results 1 to 2 of 2

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 = ...

  1. #1
    Eric Frost's Avatar
    Eric Frost is offline Administrator Black Belt
    Join Date
    Jul 1992
    Posts
    5,094
    Blog Entries
    4

    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();
        }
    ~ Order MapPoint MapPoint 2013 Here and Get Free Access to the MapForums Downloads ~
    ~~
    ~ Upgrade to Get Access to the MapForums Downloads ~

  2. #2
    dcmap is offline 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.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Virtual Earth Application
    By Eric Frost in forum Bing Maps and MapPoint Web Service
    Replies: 3
    Last Post: 11-17-2006, 05:11 PM
  2. Virtual Earth Video
    By Eric Frost in forum Bing Maps and MapPoint Web Service
    Replies: 0
    Last Post: 08-22-2005, 04:59 PM
  3. Virtual Earth Map Control Test
    By Eric Frost in forum Bing Maps and MapPoint Web Service
    Replies: 0
    Last Post: 08-12-2005, 11:06 AM
  4. Virtual Earth News
    By Eric Frost in forum Bing Maps and MapPoint Web Service
    Replies: 0
    Last Post: 08-02-2005, 04:52 PM
  5. Getting Started with the Virtual Earth Map Control
    By Eric Frost in forum MP2K Magazine Articles
    Replies: 0
    Last Post: 08-02-2005, 04:39 PM

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  


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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96