MapPoint Forums

MapForums

Community of VE/MapPoint Users and Developers




Virtual Earth Map Control Script

This is a discussion on Virtual Earth Map Control Script within the MapPoint Web Service and Virtual Earth 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 > MapPoint Web Service and Virtual Earth

Register Blogs FAQ Members List Calendar Search Today's Posts Mark Forums Read



Click here to register

Reply

 

LinkBack (1) Thread Tools Display Modes
  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: 2,382
Blog Entries: 1
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 2009 ~
~
~ 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 08: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 MapPoint Web Service and Virtual Earth 3 11-17-2006 04:11 PM
Virtual Earth Video Eric Frost MapPoint Web Service and Virtual Earth 0 08-22-2005 03:59 PM
Virtual Earth Map Control Test Eric Frost MapPoint Web Service and Virtual Earth 0 08-12-2005 10:06 AM
Virtual Earth News Eric Frost MapPoint Web Service and Virtual Earth 0 08-02-2005 03:52 PM
Getting Started with the Virtual Earth Map Control Eric Frost MP2K Magazine Articles 0 08-02-2005 03:39 PM


All times are GMT -5. The time now is 12:30 AM.


Powered by vBulletin® Version 3.7.2
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
MP2K Magazine
Visitor Map

Group Ski Holidays
If you are thinking about booking a group ski holidays make sure you visit Holiday Hypermarket today. Our simple online search lets you find great deals for low prices and booking is easy.

Italy Holidays
Find and book Italy Holidays with Travel Counsellors. Holiday destinations around the world including Italy.

Italy Holiday
An Italy Holiday is full of interesting stuff for the casual tourist and even more for the educated visitor. Check out the latest great deals at dealchecker.co.uk.

Holidays to Antigua
The Holiday Place has fantastic deals on holidays to Antigua. Visit our website to view special offers on holidays to the Caribbean.

Turkey
Before booking a holiday to Turkey check out the ULookUBook travel guide. Find out about the rich culture in Turkey before you go there to help you to make the most of your holiday.

Compare Prices
Travel.co.uk makes it easy for you to compare prices from hundreds of UK based travel companies.

Cheap Holidays to Sharm el Sheikh
Break away to Northern Africa. Find cheap holidays to Sharm el Sheikh at On The Beach.


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