
// Mercator functions "borrowed" from http://mapnut.com/testzoom.html
// converted to Virtual Earth by TC, 19-04-2006

// return degrees per pixel for given MS zoom level
function DegPerPixel(zoom) {
  // at zoom 1, VE world is 512px wide
  // at each subsequent zoom level, world width in pixels doubles
  return 360.0 / (512 * Math.pow(2.0,zoom-1));
}

// return "projected latitude" in degrees
function MercatorProjectY(latitude) {
  var latradians = latitude * Math.PI / 180.0;
  var YProjradians = Math.log((1 + Math.sin(latradians))/(1 - Math.sin(latradians))) / 2.0;
  return (YProjradians * 180.0 / Math.PI);
}

// return latitude (from "projected latitude") in degrees
function InverseMercatorProjectY(YProj) {	
  var YProjradians = YProj * Math.PI /180.0;
  var latradians = 2 * Math.atan(Math.exp(YProjradians)) - Math.PI / 2;
  return (latradians * 180.0 / Math.PI);
}

// YGeoPoint -> local YCoordPoint
function project(point,map) {
  // absolute x,y of given point
  var givenXY = absproject(point,map.GetZoomLevel());
  // absolute x,y of top left map corner
  var cornerXY = absproject(map.PixelToLatLong(new Msn.VE.Pixel(0,0)), map.GetZoomLevel());
//  var cornerXY = absproject(new Msn.VE.LatLong(map.GetCenterLatitude(),map.GetCenterLongitude),map.GetZoomLevel());
  return new Msn.VE.Pixel(givenXY.x-cornerXY.x,cornerXY.y-givenXY.y);
}

// YGeoPoint -> absolute YCoordPoint
function absproject(point,zoom) {
  var sc = DegPerPixel(zoom);
  var x = (point.longitude + 180.0) / sc;
  var y = (MercatorProjectY(point.latitude) + 90.0) / sc;
  return new Msn.VE.Pixel(Math.round(x),Math.round(y));
}

