More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Layer / Yahoo.js
blob:a/labs/openlayers/lib/OpenLayers/Layer/Yahoo.js -> blob:b/labs/openlayers/lib/OpenLayers/Layer/Yahoo.js
  /* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for
  * full list of contributors). Published under the Clear BSD license.
  * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
  * full text of the license. */
   
   
  /**
  * @requires OpenLayers/Layer/SphericalMercator.js
  * @requires OpenLayers/Layer/EventPane.js
  * @requires OpenLayers/Layer/FixedZoomLevels.js
  */
   
  /**
  * Class: OpenLayers.Layer.Yahoo
  *
  * Inherits from:
  * - <OpenLayers.Layer.EventPane>
  * - <OpenLayers.Layer.FixedZoomLevels>
  */
  OpenLayers.Layer.Yahoo = OpenLayers.Class(
  OpenLayers.Layer.EventPane, OpenLayers.Layer.FixedZoomLevels, {
   
  /**
  * Constant: MIN_ZOOM_LEVEL
  * {Integer} 0
  */
  MIN_ZOOM_LEVEL: 0,
   
  /**
  * Constant: MAX_ZOOM_LEVEL
  * {Integer} 17
  */
  MAX_ZOOM_LEVEL: 17,
   
  /**
  * Constant: RESOLUTIONS
  * {Array(Float)} Hardcode these resolutions so that they are more closely
  * tied with the standard wms projection
  */
  RESOLUTIONS: [
  1.40625,
  0.703125,
  0.3515625,
  0.17578125,
  0.087890625,
  0.0439453125,
  0.02197265625,
  0.010986328125,
  0.0054931640625,
  0.00274658203125,
  0.001373291015625,
  0.0006866455078125,
  0.00034332275390625,
  0.000171661376953125,
  0.0000858306884765625,
  0.00004291534423828125,
  0.00002145767211914062,
  0.00001072883605957031
  ],
   
  /**
  * APIProperty: type
  * {YahooMapType}
  */
  type: null,
   
  /**
  * APIProperty: wrapDateLine
  * {Boolean} Allow user to pan forever east/west. Default is true.
  * Setting this to false only restricts panning if
  * <sphericalMercator> is true.
  */
  wrapDateLine: true,
   
  /**
  * APIProperty: sphericalMercator
  * {Boolean} Should the map act as a mercator-projected map? This will
  * cause all interactions with the map to be in the actual map projection,
  * which allows support for vector drawing, overlaying other maps, etc.
  */
  sphericalMercator: false,
   
  /**
  * Constructor: OpenLayers.Layer.Yahoo
  *
  * Parameters:
  * name - {String}
  * options - {Object}
  */
  initialize: function(name, options) {
  OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
  OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this,
  arguments);
  if(this.sphericalMercator) {
  OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
  this.initMercatorParameters();
  }
  },
   
  /**
  * Method: loadMapObject
  */
  loadMapObject:function() {
  try { //do not crash!
  var size = this.getMapObjectSizeFromOLSize(this.map.getSize());
  this.mapObject = new YMap(this.div, this.type, size);
  this.mapObject.disableKeyControls();
  this.mapObject.disableDragMap();
   
  //can we do smooth panning? (moveByXY is not an API function)
  if ( !this.mapObject.moveByXY ||
  (typeof this.mapObject.moveByXY != "function" ) ) {
   
  this.dragPanMapObject = null;
  }
  } catch(e) {}
  },
   
  /**
  * Method: onMapResize
  *
  */
  onMapResize: function() {
  try {
  var size = this.getMapObjectSizeFromOLSize(this.map.getSize());
  this.mapObject.resizeTo(size);
  } catch(e) {}
  },
   
   
  /**
  * APIMethod: setMap
  * Overridden from EventPane because we need to remove this yahoo event
  * pane which prohibits our drag and drop, and we can only do this
  * once the map has been loaded and centered.
  *
  * Parameters:
  * map - {<OpenLayers.Map>}
  */
  setMap: function(map) {
  OpenLayers.Layer.EventPane.prototype.setMap.apply(this, arguments);
   
  this.map.events.register("moveend", this, this.fixYahooEventPane);
  },
   
  /**
  * Method: fixYahooEventPane
  * The map has been centered, so the mysterious yahoo eventpane has been
  * added. we remove it so that it doesnt mess with *our* event pane.
  */
  fixYahooEventPane: function() {
  var yahooEventPane = OpenLayers.Util.getElement("ygddfdiv");
  if (yahooEventPane != null) {
  if (yahooEventPane.parentNode != null) {
  yahooEventPane.parentNode.removeChild(yahooEventPane);
  }
  this.map.events.unregister("moveend", this,
  this.fixYahooEventPane);
  }
  },
   
  /**
  * APIMethod: getWarningHTML
  *
  * Returns:
  * {String} String with information on why layer is broken, how to get
  * it working.
  */
  getWarningHTML:function() {
  return OpenLayers.i18n(
  "getLayerWarning", {'layerType':'Yahoo', 'layerLib':'Yahoo'}
  );
  },
   
  /********************************************************/
  /* */
  /* Translation Functions */
  /* */
  /* The following functions translate GMaps and OL */
  /* formats for Pixel, LonLat, Bounds, and Zoom */
  /* */
  /********************************************************/
   
   
  //
  // TRANSLATION: MapObject Zoom <-> OpenLayers Zoom
  //
   
  /**
  * APIMethod: getOLZoomFromMapObjectZoom
  *
  * Parameters:
  * gZoom - {Integer}
  *
  * Returns:
  * {Integer} An OpenLayers Zoom level, translated from the passed in gZoom
  * Returns null if null value is passed in.
  */
  getOLZoomFromMapObjectZoom: function(moZoom) {
  var zoom = null;
  if (moZoom != null) {
  zoom = OpenLayers.Layer.FixedZoomLevels.prototype.getOLZoomFromMapObjectZoom.apply(this, [moZoom]);
  zoom = 18 - zoom;
  }
  return zoom;
  },
   
  /**
  * APIMethod: getMapObjectZoomFromOLZoom
  *
  * Parameters:
  * olZoom - {Integer}
  *
  * Returns:
  * {Integer} A MapObject level, translated from the passed in olZoom
  * Returns null if null value is passed in
  */
  getMapObjectZoomFromOLZoom: function(olZoom) {
  var zoom = null;
  if (olZoom != null) {
  zoom = OpenLayers.Layer.FixedZoomLevels.prototype.getMapObjectZoomFromOLZoom.apply(this, [olZoom]);
  zoom = 18 - zoom;
  }
  return zoom;
  },
   
  /************************************
  * *
  * MapObject Interface Controls *
  * *
  ************************************/
   
   
  // Get&Set Center, Zoom
   
  /**
  * APIMethod: setMapObjectCenter
  * Set the mapObject to the specified center and zoom
  *
  * Parameters:
  * center - {Object} MapObject LonLat format
  * zoom - {int} MapObject zoom format
  */
  setMapObjectCenter: function(center, zoom) {
  this.mapObject.drawZoomAndCenter(center, zoom);
  },
   
  /**
  * APIMethod: getMapObjectCenter
  *
  * Returns:
  * {Object} The mapObject's current center in Map Object format
  */
  getMapObjectCenter: function() {
  return this.mapObject.getCenterLatLon();
  },
   
  /**
  * APIMethod: dragPanMapObject
  *
  * Parameters:
  * dX - {Integer}
  * dY - {Integer}
  */
  dragPanMapObject: function(dX, dY) {
  this.mapObject.moveByXY({
  'x': -dX,
  'y': dY
  });
  },
   
  /**
  * APIMethod: getMapObjectZoom
  *
  * Returns:
  * {Integer} The mapObject's current zoom, in Map Object format
  */
  getMapObjectZoom: function() {
  return this.mapObject.getZoomLevel();
  },
   
   
  // LonLat - Pixel Translation
   
  /**
  * APIMethod: getMapObjectLonLatFromMapObjectPixel
  *
  * Parameters:
  * moPixel - {Object} MapObject Pixel format
  *
  * Returns:
  * {Object} MapObject LonLat translated from MapObject Pixel
  */
  getMapObjectLonLatFromMapObjectPixel: function(moPixel) {
  return this.mapObject.convertXYLatLon(moPixel);
  },
   
  /**
  * APIMethod: getMapObjectPixelFromMapObjectLonLat
  *
  * Parameters:
  * moLonLat - {Object} MapObject LonLat format
  *
  * Returns:
  * {Object} MapObject Pixel transtlated from MapObject LonLat
  */
  getMapObjectPixelFromMapObjectLonLat: function(moLonLat) {
  return this.mapObject.convertLatLonXY(moLonLat);
  },
   
   
  /************************************
  * *
  * MapObject Primitives *
  * *
  ************************************/
   
   
  // LonLat
   
  /**
  * APIMethod: getLongitudeFromMapObjectLonLat
  *
  * Parameters:
  * moLonLat - {Object} MapObject LonLat format
  *
  * Returns:
  * {Float} Longitude of the given MapObject LonLat
  */
  getLongitudeFromMapObjectLonLat: function(moLonLat) {
  return this.sphericalMercator ?
  this.forwardMercator(moLonLat.Lon, moLonLat.Lat).lon :
  moLonLat.Lon;
  },
   
  /**
  * APIMethod: getLatitudeFromMapObjectLonLat
  *
  * Parameters:
  * moLonLat - {Object} MapObject LonLat format
  *
  * Returns:
  * {Float} Latitude of the given MapObject LonLat
  */
  getLatitudeFromMapObjectLonLat: function(moLonLat) {
  return this.sphericalMercator ?
  this.forwardMercator(moLonLat.Lon, moLonLat.Lat).lat :
  moLonLat.Lat;
  },
   
  /**
  * APIMethod: getMapObjectLonLatFromLonLat
  *
  * Parameters:
  * lon - {Float}
  * lat - {Float}
  *
  * Returns:
  * {Object} MapObject LonLat built from lon and lat params
  */
  getMapObjectLonLatFromLonLat: function(lon, lat) {
  var yLatLong;
  if(this.sphericalMercator) {
  var lonlat = this.inverseMercator(lon, lat);
  yLatLong = new YGeoPoint(lonlat.lat, lonlat.lon);
  } else {
  yLatLong = new YGeoPoint(lat, lon);
  }
  return yLatLong;
  },
   
  // Pixel
   
  /**
  * APIMethod: getXFromMapObjectPixel
  *
  * Parameters:
  * moPixel - {Object} MapObject Pixel format
  *
  * Returns:
  * {Integer} X value of the MapObject Pixel
  */
  getXFromMapObjectPixel: function(moPixel) {
  return moPixel.x;
  },
   
  /**
  * APIMethod: getYFromMapObjectPixel
  *